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 \
libandroid_runtime \
libstagefright \
libstagefright_omx
libstagefright_omx \
libstagefright_color_conversion
ifneq ($(BUILD_WITHOUT_PV),true)
LOCAL_SHARED_LIBRARIES += \

View File

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

View File

@@ -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();

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 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;

View File

@@ -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 += \