summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2009-12-14 14:18:22 -0800
committerAndreas Huber <andih@google.com>2009-12-14 14:18:22 -0800
commit733b7729ea462fae9c6899456444e28fef1c757c (patch)
treebdae9df47ee74857a0941e17d1cef6b096bab771 /media/libstagefright
parentb841f14f8e51f2365945281fbfa54ef6a1b1b5a6 (diff)
downloadframeworks_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.mk3
-rw-r--r--media/libstagefright/AwesomePlayer.cpp81
-rw-r--r--media/libstagefright/colorconversion/Android.mk22
-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.h12
-rw-r--r--media/libstagefright/omx/Android.mk5
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 += \