Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19553241 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

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.
parents 0483f1c1 1314e737
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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 += \
+2 −1
Original line number Diff line number Diff line
@@ -63,7 +63,8 @@ LOCAL_STATIC_LIBRARIES := \

LOCAL_SHARED_LIBRARIES += \
        libstagefright_amrnb_common \
        libstagefright_avc_common
        libstagefright_avc_common \
        libstagefright_color_conversion

endif

+70 −11
Original line number Diff line number Diff line
@@ -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 =
        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);
                        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 −0
Original line number Diff line number Diff line
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)
Loading