diff options
author | Andreas Huber <andih@google.com> | 2009-12-14 14:18:22 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2009-12-14 14:18:22 -0800 |
commit | 733b7729ea462fae9c6899456444e28fef1c757c (patch) | |
tree | bdae9df47ee74857a0941e17d1cef6b096bab771 /media/libstagefright | |
parent | b841f14f8e51f2365945281fbfa54ef6a1b1b5a6 (diff) | |
download | frameworks_av-733b7729ea462fae9c6899456444e28fef1c757c.zip frameworks_av-733b7729ea462fae9c6899456444e28fef1c757c.tar.gz frameworks_av-733b7729ea462fae9c6899456444e28fef1c757c.tar.bz2 |
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.
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/Android.mk | 3 | ||||
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 81 | ||||
-rw-r--r-- | media/libstagefright/colorconversion/Android.mk | 22 | ||||
-rw-r--r-- | media/libstagefright/colorconversion/ColorConverter.cpp (renamed from media/libstagefright/omx/ColorConverter.cpp) | 0 | ||||
-rw-r--r-- | media/libstagefright/colorconversion/SoftwareRenderer.cpp (renamed from media/libstagefright/omx/SoftwareRenderer.cpp) | 0 | ||||
-rw-r--r-- | media/libstagefright/include/AwesomePlayer.h | 12 | ||||
-rw-r--r-- | media/libstagefright/omx/Android.mk | 5 |
7 files changed, 107 insertions, 16 deletions
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk index d145542..fb75aef 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 570e431..2eec8de 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -19,6 +19,7 @@ #include <utils/Log.h> #include "include/AwesomePlayer.h" +#include "include/SoftwareRenderer.h" #include <binder/IPCThreadState.h> #include <media/stagefright/AudioPlayer.h> @@ -30,7 +31,6 @@ #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/OMXCodec.h> - namespace android { struct AwesomeEvent : public TimedEventQueue::Event { @@ -54,6 +54,55 @@ private: 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() : 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 0000000..c08ce3a --- /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 index e74782f..e74782f 100644 --- a/media/libstagefright/omx/ColorConverter.cpp +++ b/media/libstagefright/colorconversion/ColorConverter.cpp diff --git a/media/libstagefright/omx/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp index ef6ede0..ef6ede0 100644 --- a/media/libstagefright/omx/SoftwareRenderer.cpp +++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 2727c3c..37b14eb 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<MediaSource> mVideoSource; - sp<IOMXRenderer> mVideoRenderer; + sp<AwesomeRenderer> mVideoRenderer; sp<MediaSource> mAudioSource; AudioPlayer *mAudioPlayer; diff --git a/media/libstagefright/omx/Android.mk b/media/libstagefright/omx/Android.mk index 7dfab11..965852b 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 += \ |