Merge change I1314e737 into eclair-mr2

* changes:
  AwesomePlayer now renders either remote (IOMXRenderer) or locally depending on what kind of decoder was instantiated. Split off color conversion code into its own shared library.
This commit is contained in:
Android (Google) Code Review
2009-12-14 14:32:13 -08:00
8 changed files with 109 additions and 17 deletions

View File

@@ -40,7 +40,8 @@ LOCAL_SHARED_LIBRARIES := \
libmedia \ libmedia \
libandroid_runtime \ libandroid_runtime \
libstagefright \ libstagefright \
libstagefright_omx libstagefright_omx \
libstagefright_color_conversion
ifneq ($(BUILD_WITHOUT_PV),true) ifneq ($(BUILD_WITHOUT_PV),true)
LOCAL_SHARED_LIBRARIES += \ LOCAL_SHARED_LIBRARIES += \

View File

@@ -63,7 +63,8 @@ LOCAL_STATIC_LIBRARIES := \
LOCAL_SHARED_LIBRARIES += \ LOCAL_SHARED_LIBRARIES += \
libstagefright_amrnb_common \ libstagefright_amrnb_common \
libstagefright_avc_common libstagefright_avc_common \
libstagefright_color_conversion
endif endif

View File

@@ -19,6 +19,7 @@
#include <utils/Log.h> #include <utils/Log.h>
#include "include/AwesomePlayer.h" #include "include/AwesomePlayer.h"
#include "include/SoftwareRenderer.h"
#include <binder/IPCThreadState.h> #include <binder/IPCThreadState.h>
#include <media/stagefright/AudioPlayer.h> #include <media/stagefright/AudioPlayer.h>
@@ -30,7 +31,6 @@
#include <media/stagefright/MediaSource.h> #include <media/stagefright/MediaSource.h>
#include <media/stagefright/MetaData.h> #include <media/stagefright/MetaData.h>
#include <media/stagefright/OMXCodec.h> #include <media/stagefright/OMXCodec.h>
namespace android { namespace android {
struct AwesomeEvent : public TimedEventQueue::Event { struct AwesomeEvent : public TimedEventQueue::Event {
@@ -54,6 +54,55 @@ private:
AwesomeEvent &operator=(const AwesomeEvent &); AwesomeEvent &operator=(const AwesomeEvent &);
}; };
struct AwesomeRemoteRenderer : public AwesomeRenderer {
AwesomeRemoteRenderer(const sp<IOMXRenderer> &target)
: mTarget(target) {
}
virtual void render(MediaBuffer *buffer) {
void *id;
if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
mTarget->render((IOMX::buffer_id)id);
}
}
private:
sp<IOMXRenderer> mTarget;
AwesomeRemoteRenderer(const AwesomeRemoteRenderer &);
AwesomeRemoteRenderer &operator=(const AwesomeRemoteRenderer &);
};
struct AwesomeLocalRenderer : public AwesomeRenderer {
AwesomeLocalRenderer(
OMX_COLOR_FORMATTYPE colorFormat,
const sp<ISurface> &surface,
size_t displayWidth, size_t displayHeight,
size_t decodedWidth, size_t decodedHeight)
: mTarget(new SoftwareRenderer(
colorFormat, surface, displayWidth, displayHeight,
decodedWidth, decodedHeight)) {
}
virtual void render(MediaBuffer *buffer) {
mTarget->render(
(const uint8_t *)buffer->data() + buffer->range_offset(),
buffer->range_length(), NULL);
}
protected:
virtual ~AwesomeLocalRenderer() {
delete mTarget;
mTarget = NULL;
}
private:
SoftwareRenderer *mTarget;
AwesomeLocalRenderer(const AwesomeLocalRenderer &);
AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
};
AwesomePlayer::AwesomePlayer() AwesomePlayer::AwesomePlayer()
: mTimeSource(NULL), : mTimeSource(NULL),
mAudioPlayer(NULL), mAudioPlayer(NULL),
@@ -326,12 +375,25 @@ void AwesomePlayer::initRenderer_l() {
// before creating a new one. // before creating a new one.
IPCThreadState::self()->flushCommands(); IPCThreadState::self()->flushCommands();
mVideoRenderer = if (!strncmp("OMX.", component, 4)) {
mClient.interface()->createRenderer( // Our OMX codecs allocate buffers on the media_server side
mISurface, component, // therefore they require a remote IOMXRenderer that knows how
(OMX_COLOR_FORMATTYPE)format, // to display them.
decodedWidth, decodedHeight, mVideoRenderer = new AwesomeRemoteRenderer(
mVideoWidth, mVideoHeight); mClient.interface()->createRenderer(
mISurface, component,
(OMX_COLOR_FORMATTYPE)format,
decodedWidth, decodedHeight,
mVideoWidth, mVideoHeight));
} else {
// Other decoders are instantiated locally and as a consequence
// allocate their buffers in local address space.
mVideoRenderer = new AwesomeLocalRenderer(
(OMX_COLOR_FORMATTYPE)format,
mISurface,
mVideoWidth, mVideoHeight,
decodedWidth, decodedHeight);
}
} }
} }
@@ -612,10 +674,7 @@ void AwesomePlayer::onEvent(int32_t code) {
return; return;
} }
void *id; mVideoRenderer->render(mVideoBuffer);
if (mVideoBuffer->meta_data()->findPointer(kKeyBufferID, &id)) {
mVideoRenderer->render((IOMX::buffer_id)id);
}
if (mLastVideoBuffer) { if (mLastVideoBuffer) {
mLastVideoBuffer->release(); mLastVideoBuffer->release();

View File

@@ -0,0 +1,22 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
ColorConverter.cpp \
SoftwareRenderer.cpp
LOCAL_C_INCLUDES := \
$(TOP)/external/opencore/extern_libs_v2/khronos/openmax/include
LOCAL_SHARED_LIBRARIES := \
libbinder \
libmedia \
libutils \
libui \
libcutils
LOCAL_PRELINK_MODULE:= false
LOCAL_MODULE:= libstagefright_color_conversion
include $(BUILD_SHARED_LIBRARY)

View File

@@ -32,6 +32,16 @@ struct MediaSource;
struct AudioPlayer; struct AudioPlayer;
struct TimeSource; struct TimeSource;
struct AwesomeRenderer : public RefBase {
AwesomeRenderer() {}
virtual void render(MediaBuffer *buffer) = 0;
private:
AwesomeRenderer(const AwesomeRenderer &);
AwesomeRenderer &operator=(const AwesomeRenderer &);
};
struct AwesomePlayer { struct AwesomePlayer {
AwesomePlayer(); AwesomePlayer();
~AwesomePlayer(); ~AwesomePlayer();
@@ -80,7 +90,7 @@ private:
TimeSource *mTimeSource; TimeSource *mTimeSource;
sp<MediaSource> mVideoSource; sp<MediaSource> mVideoSource;
sp<IOMXRenderer> mVideoRenderer; sp<AwesomeRenderer> mVideoRenderer;
sp<MediaSource> mAudioSource; sp<MediaSource> mAudioSource;
AudioPlayer *mAudioPlayer; AudioPlayer *mAudioPlayer;

View File

@@ -9,13 +9,11 @@ LOCAL_CFLAGS := $(PV_CFLAGS_MINUS_VISIBILITY)
LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
LOCAL_SRC_FILES:= \ LOCAL_SRC_FILES:= \
ColorConverter.cpp \
OMX.cpp \ OMX.cpp \
OMXComponentBase.cpp \ OMXComponentBase.cpp \
OMXNodeInstance.cpp \ OMXNodeInstance.cpp \
OMXMaster.cpp \ OMXMaster.cpp \
OMXSoftwareCodecsPlugin.cpp \ OMXSoftwareCodecsPlugin.cpp \
SoftwareRenderer.cpp
ifneq ($(BUILD_WITHOUT_PV),true) ifneq ($(BUILD_WITHOUT_PV),true)
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
@@ -29,7 +27,8 @@ LOCAL_SHARED_LIBRARIES := \
libmedia \ libmedia \
libutils \ libutils \
libui \ libui \
libcutils libcutils \
libstagefright_color_conversion
ifneq ($(BUILD_WITHOUT_PV),true) ifneq ($(BUILD_WITHOUT_PV),true)
LOCAL_SHARED_LIBRARIES += \ LOCAL_SHARED_LIBRARIES += \