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:
@@ -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 += \
|
||||
|
||||
@@ -63,7 +63,8 @@ LOCAL_STATIC_LIBRARIES := \
|
||||
|
||||
LOCAL_SHARED_LIBRARIES += \
|
||||
libstagefright_amrnb_common \
|
||||
libstagefright_avc_common
|
||||
libstagefright_avc_common \
|
||||
libstagefright_color_conversion
|
||||
|
||||
endif
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
22
media/libstagefright/colorconversion/Android.mk
Normal file
22
media/libstagefright/colorconversion/Android.mk
Normal 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)
|
||||
@@ -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;
|
||||
|
||||
@@ -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 += \
|
||||
|
||||
Reference in New Issue
Block a user