From 1314e73786afacb49ddbff7c3d0c1cf9d2c688c9 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Mon, 14 Dec 2009 14:18:22 -0800 Subject: [PATCH] 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. --- media/libmediaplayerservice/Android.mk | 3 +- media/libstagefright/Android.mk | 3 +- media/libstagefright/AwesomePlayer.cpp | 81 ++++++++++++++++--- .../libstagefright/colorconversion/Android.mk | 22 +++++ .../ColorConverter.cpp | 0 .../SoftwareRenderer.cpp | 0 media/libstagefright/include/AwesomePlayer.h | 12 ++- media/libstagefright/omx/Android.mk | 5 +- 8 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 media/libstagefright/colorconversion/Android.mk rename media/libstagefright/{omx => colorconversion}/ColorConverter.cpp (100%) rename media/libstagefright/{omx => colorconversion}/SoftwareRenderer.cpp (100%) diff --git a/media/libmediaplayerservice/Android.mk b/media/libmediaplayerservice/Android.mk index b8defde45d5db..5e59710065db8 100644 --- a/media/libmediaplayerservice/Android.mk +++ b/media/libmediaplayerservice/Android.mk @@ -40,7 +40,8 @@ LOCAL_SHARED_LIBRARIES := \ libmedia \ libandroid_runtime \ libstagefright \ - libstagefright_omx + libstagefright_omx \ + libstagefright_color_conversion ifneq ($(BUILD_WITHOUT_PV),true) LOCAL_SHARED_LIBRARIES += \ diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk index d145542ae3056..fb75aef4b87f6 100644 --- a/media/libstagefright/Android.mk +++ b/media/libstagefright/Android.mk @@ -63,7 +63,8 @@ LOCAL_STATIC_LIBRARIES := \ LOCAL_SHARED_LIBRARIES += \ libstagefright_amrnb_common \ - libstagefright_avc_common + libstagefright_avc_common \ + libstagefright_color_conversion endif diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 570e431ff3e08..2eec8de756007 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -19,6 +19,7 @@ #include #include "include/AwesomePlayer.h" +#include "include/SoftwareRenderer.h" #include #include @@ -30,7 +31,6 @@ #include #include #include - namespace android { struct AwesomeEvent : public TimedEventQueue::Event { @@ -54,6 +54,55 @@ private: AwesomeEvent &operator=(const AwesomeEvent &); }; +struct AwesomeRemoteRenderer : public AwesomeRenderer { + AwesomeRemoteRenderer(const sp &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 mTarget; + + AwesomeRemoteRenderer(const AwesomeRemoteRenderer &); + AwesomeRemoteRenderer &operator=(const AwesomeRemoteRenderer &); +}; + +struct AwesomeLocalRenderer : public AwesomeRenderer { + AwesomeLocalRenderer( + OMX_COLOR_FORMATTYPE colorFormat, + const sp &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() : mTimeSource(NULL), mAudioPlayer(NULL), @@ -326,12 +375,25 @@ void AwesomePlayer::initRenderer_l() { // before creating a new one. IPCThreadState::self()->flushCommands(); - mVideoRenderer = - mClient.interface()->createRenderer( - mISurface, component, - (OMX_COLOR_FORMATTYPE)format, - decodedWidth, decodedHeight, - mVideoWidth, mVideoHeight); + if (!strncmp("OMX.", component, 4)) { + // Our OMX codecs allocate buffers on the media_server side + // therefore they require a remote IOMXRenderer that knows how + // to display them. + mVideoRenderer = new AwesomeRemoteRenderer( + 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; } - void *id; - if (mVideoBuffer->meta_data()->findPointer(kKeyBufferID, &id)) { - mVideoRenderer->render((IOMX::buffer_id)id); - } + mVideoRenderer->render(mVideoBuffer); if (mLastVideoBuffer) { mLastVideoBuffer->release(); diff --git a/media/libstagefright/colorconversion/Android.mk b/media/libstagefright/colorconversion/Android.mk new file mode 100644 index 0000000000000..c08ce3ae2bb13 --- /dev/null +++ b/media/libstagefright/colorconversion/Android.mk @@ -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) diff --git a/media/libstagefright/omx/ColorConverter.cpp b/media/libstagefright/colorconversion/ColorConverter.cpp similarity index 100% rename from media/libstagefright/omx/ColorConverter.cpp rename to media/libstagefright/colorconversion/ColorConverter.cpp diff --git a/media/libstagefright/omx/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp similarity index 100% rename from media/libstagefright/omx/SoftwareRenderer.cpp rename to media/libstagefright/colorconversion/SoftwareRenderer.cpp diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 2727c3ce14331..37b14ebd7a256 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -32,6 +32,16 @@ struct MediaSource; struct AudioPlayer; struct TimeSource; +struct AwesomeRenderer : public RefBase { + AwesomeRenderer() {} + + virtual void render(MediaBuffer *buffer) = 0; + +private: + AwesomeRenderer(const AwesomeRenderer &); + AwesomeRenderer &operator=(const AwesomeRenderer &); +}; + struct AwesomePlayer { AwesomePlayer(); ~AwesomePlayer(); @@ -80,7 +90,7 @@ private: TimeSource *mTimeSource; sp mVideoSource; - sp mVideoRenderer; + sp mVideoRenderer; sp mAudioSource; AudioPlayer *mAudioPlayer; diff --git a/media/libstagefright/omx/Android.mk b/media/libstagefright/omx/Android.mk index 7dfab11d25e34..965852b1b069c 100644 --- a/media/libstagefright/omx/Android.mk +++ b/media/libstagefright/omx/Android.mk @@ -9,13 +9,11 @@ LOCAL_CFLAGS := $(PV_CFLAGS_MINUS_VISIBILITY) LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) LOCAL_SRC_FILES:= \ - ColorConverter.cpp \ OMX.cpp \ OMXComponentBase.cpp \ OMXNodeInstance.cpp \ OMXMaster.cpp \ OMXSoftwareCodecsPlugin.cpp \ - SoftwareRenderer.cpp ifneq ($(BUILD_WITHOUT_PV),true) LOCAL_SRC_FILES += \ @@ -29,7 +27,8 @@ LOCAL_SHARED_LIBRARIES := \ libmedia \ libutils \ libui \ - libcutils + libcutils \ + libstagefright_color_conversion ifneq ($(BUILD_WITHOUT_PV),true) LOCAL_SHARED_LIBRARIES += \