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

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

Merge change 9372

* changes:
  The IOMX interface now instantiates IOMXRenderers to hide the details of hardware accelerated blitting.
parents 4c943045 1de13168
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <utils/String8.h>

#include <OMX_Core.h>
#include <OMX_Video.h>

#define IOMX_USES_SOCKETS       0

@@ -30,6 +31,8 @@ namespace android {

class IMemory;
class IOMXObserver;
class IOMXRenderer;
class ISurface;

class IOMX : public IInterface {
public:
@@ -87,6 +90,13 @@ public:
            OMX_U32 range_offset, OMX_U32 range_length,
            OMX_U32 flags, OMX_TICKS timestamp) = 0;
#endif

    virtual sp<IOMXRenderer> createRenderer(
            const sp<ISurface> &surface,
            const char *componentName,
            OMX_COLOR_FORMATTYPE colorFormat,
            size_t encodedWidth, size_t encodedHeight,
            size_t displayWidth, size_t displayHeight) = 0;
};

struct omx_message {
@@ -155,6 +165,13 @@ public:
    virtual void on_message(const omx_message &msg) = 0;
};

class IOMXRenderer : public IInterface {
public:
    DECLARE_META_INTERFACE(OMXRenderer);

    virtual void render(IOMX::buffer_id buffer) = 0;
};

////////////////////////////////////////////////////////////////////////////////

class BnOMX : public BnInterface<IOMX> {
@@ -171,6 +188,13 @@ public:
            uint32_t flags = 0);
};

class BnOMXRenderer : public BnInterface<IOMXRenderer> {
public:
    virtual status_t onTransact(
            uint32_t code, const Parcel &data, Parcel *reply,
            uint32_t flags = 0);
};

}  // namespace android

#endif  // ANDROID_IOMX_H_
+2 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
namespace android {

class AudioPlayer;
class IOMXRenderer;
class ISurface;
class MediaExtractor;
class MediaBuffer;
@@ -37,7 +38,6 @@ class MetaData;
class OMXDecoder;
class Surface;
class TimeSource;
class VideoRenderer;

class MediaPlayerImpl {
public:
@@ -93,7 +93,7 @@ private:

    sp<Surface> mSurface;
    sp<ISurface> mISurface;
    VideoRenderer *mRenderer;
    sp<IOMXRenderer> mVideoRenderer;

    sp<MediaPlayerBase::AudioSink> mAudioSink;

+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ enum {
    kKeyColorFormat      = 'colf',
    kKeyPlatformPrivate  = 'priv',
    kKeyDecoderComponent = 'decC',
    kKeyBufferID         = 'bfID',
};

enum {
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ namespace android {

class BufferMapper;
class Rect;
class MediaPlayerImpl;
class Surface;
class SurfaceComposerClient;
struct per_client_cblk_t;
@@ -180,6 +181,7 @@ private:
    // mediaplayer needs access to ISurface for display
    friend class MediaPlayer;
    friend class Test;
    friend class MediaPlayerImpl;
    const sp<ISurface>& getISurface() const { return mSurface; }

    status_t getBufferLocked(int index);
+92 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
#include <binder/IMemory.h>
#include <binder/Parcel.h>
#include <media/IOMX.h>
#include <ui/ISurface.h>

namespace android {

@@ -23,7 +24,9 @@ enum {
    OBSERVE_NODE,
    FILL_BUFFER,
    EMPTY_BUFFER,
    CREATE_RENDERER,
    OBSERVER_ON_MSG,
    RENDERER_RENDER,
};

static void *readVoidStar(const Parcel *parcel) {
@@ -262,6 +265,28 @@ public:
        remote()->transact(EMPTY_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
    }
#endif

    virtual sp<IOMXRenderer> createRenderer(
            const sp<ISurface> &surface,
            const char *componentName,
            OMX_COLOR_FORMATTYPE colorFormat,
            size_t encodedWidth, size_t encodedHeight,
            size_t displayWidth, size_t displayHeight) {
        Parcel data, reply;
        data.writeInterfaceToken(IOMX::getInterfaceDescriptor());

        data.writeStrongBinder(surface->asBinder());
        data.writeCString(componentName);
        data.writeInt32(colorFormat);
        data.writeInt32(encodedWidth);
        data.writeInt32(encodedHeight);
        data.writeInt32(displayWidth);
        data.writeInt32(displayHeight);

        remote()->transact(CREATE_RENDERER, data, &reply);

        return interface_cast<IOMXRenderer>(reply.readStrongBinder());
    }
};

IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
@@ -513,6 +538,33 @@ status_t BnOMX::onTransact(
        }
#endif

        case CREATE_RENDERER:
        {
            CHECK_INTERFACE(IOMX, data, reply);

            sp<ISurface> isurface =
                interface_cast<ISurface>(data.readStrongBinder());

            const char *componentName = data.readCString();

            OMX_COLOR_FORMATTYPE colorFormat =
                static_cast<OMX_COLOR_FORMATTYPE>(data.readInt32());

            size_t encodedWidth = (size_t)data.readInt32();
            size_t encodedHeight = (size_t)data.readInt32();
            size_t displayWidth = (size_t)data.readInt32();
            size_t displayHeight = (size_t)data.readInt32();

            sp<IOMXRenderer> renderer =
                createRenderer(isurface, componentName, colorFormat,
                               encodedWidth, encodedHeight,
                               displayWidth, displayHeight);

            reply->writeStrongBinder(renderer->asBinder());

            return OK;
        }

        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
@@ -558,4 +610,44 @@ status_t BnOMXObserver::onTransact(
    }
}

////////////////////////////////////////////////////////////////////////////////

class BpOMXRenderer : public BpInterface<IOMXRenderer> {
public:
    BpOMXRenderer(const sp<IBinder> &impl)
        : BpInterface<IOMXRenderer>(impl) {
    }

    virtual void render(IOMX::buffer_id buffer) {
        Parcel data, reply;
        data.writeInterfaceToken(IOMXRenderer::getInterfaceDescriptor());
        writeVoidStar(buffer, &data);

        // NOTE: Do NOT make this a ONE_WAY call, it must be synchronous
        // so that the caller knows when to recycle the buffer.
        remote()->transact(RENDERER_RENDER, data, &reply);
    }
};

IMPLEMENT_META_INTERFACE(OMXRenderer, "android.hardware.IOMXRenderer");

status_t BnOMXRenderer::onTransact(
    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
    switch (code) {
        case RENDERER_RENDER:
        {
            CHECK_INTERFACE(IOMXRenderer, data, reply);

            IOMX::buffer_id buffer = readVoidStar(&data);

            render(buffer);

            return NO_ERROR;
        }

        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
}

}  // namespace android
Loading