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

Commit 8b938cda authored by Andreas Huber's avatar Andreas Huber
Browse files

The IOMX interface now instantiates IOMXRenderers to hide the details of...

The IOMX interface now instantiates IOMXRenderers to hide the details of hardware accelerated blitting.
parent 81573ec9
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 {
+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
+0 −4
Original line number Diff line number Diff line
@@ -19,14 +19,10 @@ LOCAL_SRC_FILES:= \
        MediaSource.cpp           \
        MetaData.cpp              \
        MmapSource.cpp            \
        QComHardwareRenderer.cpp  \
        SampleTable.cpp           \
        ShoutcastSource.cpp       \
        SoftwareRenderer.cpp      \
        SurfaceRenderer.cpp       \
        TimeSource.cpp            \
        TimedEventQueue.cpp       \
        TIHardwareRenderer.cpp    \
        Utils.cpp                 \
        AudioPlayer.cpp           \
        ESDS.cpp                  \
Loading