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

Commit 4d0565de authored by Andreas Huber's avatar Andreas Huber
Browse files

DO NOT MERGE - Instead of asserting that ISurface successfully registered...

DO NOT MERGE - Instead of asserting that ISurface successfully registered buffers, report an error and propagate it up to the java client.

Change-Id: Ibb14e5aff20920da4917d85de38ba3a8ee71d0bd
related-to-bug: 3188835
parent 879e9cb6
Loading
Loading
Loading
Loading
+92 −54
Original line number Diff line number Diff line
@@ -82,6 +82,10 @@ struct AwesomeRemoteRenderer : public AwesomeRenderer {
        : mTarget(target) {
    }

    virtual status_t initCheck() const {
        return OK;
    }

    virtual void render(MediaBuffer *buffer) {
        void *id;
        if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
@@ -105,14 +109,19 @@ struct AwesomeLocalRenderer : public AwesomeRenderer {
            size_t displayWidth, size_t displayHeight,
            size_t decodedWidth, size_t decodedHeight,
            int32_t rotationDegrees)
        : mTarget(NULL),
        : mInitCheck(NO_INIT),
          mTarget(NULL),
          mLibHandle(NULL) {
            init(previewOnly, componentName,
            mInitCheck = init(previewOnly, componentName,
                 colorFormat, surface, displayWidth,
                 displayHeight, decodedWidth, decodedHeight,
                 rotationDegrees);
    }

    virtual status_t initCheck() const {
        return mInitCheck;
    }

    virtual void render(MediaBuffer *buffer) {
        render((const uint8_t *)buffer->data() + buffer->range_offset(),
               buffer->range_length());
@@ -134,10 +143,11 @@ protected:
    }

private:
    status_t mInitCheck;
    VideoRenderer *mTarget;
    void *mLibHandle;

    void init(
    status_t init(
            bool previewOnly,
            const char *componentName,
            OMX_COLOR_FORMATTYPE colorFormat,
@@ -150,7 +160,7 @@ private:
    AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
};

void AwesomeLocalRenderer::init(
status_t AwesomeLocalRenderer::init(
        bool previewOnly,
        const char *componentName,
        OMX_COLOR_FORMATTYPE colorFormat,
@@ -215,11 +225,15 @@ void AwesomeLocalRenderer::init(
        }
    }

    if (mTarget == NULL) {
    if (mTarget != NULL) {
        return OK;
    }

    mTarget = new SoftwareRenderer(
            colorFormat, surface, displayWidth, displayHeight,
            decodedWidth, decodedHeight, rotationDegrees);
    }

    return ((SoftwareRenderer *)mTarget)->initCheck();
}

AwesomePlayer::AwesomePlayer()
@@ -804,8 +818,11 @@ status_t AwesomePlayer::play_l() {
    return OK;
}

void AwesomePlayer::initRenderer_l() {
    if (mISurface != NULL) {
status_t AwesomePlayer::initRenderer_l() {
    if (mISurface == NULL) {
        return OK;
    }

    sp<MetaData> meta = mVideoSource->getFormat();

    int32_t format;
@@ -832,13 +849,20 @@ void AwesomePlayer::initRenderer_l() {
        // 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(

        sp<IOMXRenderer> native =
            mClient.interface()->createRenderer(
                    mISurface, component,
                    (OMX_COLOR_FORMATTYPE)format,
                    decodedWidth, decodedHeight,
                    mVideoWidth, mVideoHeight,
                        rotationDegrees));
                    rotationDegrees);

        if (native == NULL) {
            return NO_INIT;
        }

        mVideoRenderer = new AwesomeRemoteRenderer(native);
    } else {
        // Other decoders are instantiated locally and as a consequence
        // allocate their buffers in local address space.
@@ -850,7 +874,8 @@ void AwesomePlayer::initRenderer_l() {
            mVideoWidth, mVideoHeight,
            decodedWidth, decodedHeight, rotationDegrees);
    }
    }

    return mVideoRenderer->initCheck();
}

status_t AwesomePlayer::pause() {
@@ -1179,11 +1204,16 @@ void AwesomePlayer::onVideoEvent() {

                    if (mVideoRenderer != NULL) {
                        mVideoRendererIsPreview = false;
                        initRenderer_l();
                    }
                        err = initRenderer_l();

                        if (err == OK) {
                            continue;
                        }

                        // fall through
                    }
                }

                // So video playback is complete, but we may still have
                // a seek request pending that needs to be applied
                // to the audio track.
@@ -1265,7 +1295,15 @@ void AwesomePlayer::onVideoEvent() {
    if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
        mVideoRendererIsPreview = false;

        initRenderer_l();
        status_t err = initRenderer_l();

        if (err != OK) {
            finishSeekIfNecessary(-1);

            mFlags |= VIDEO_AT_EOS;
            postStreamDoneEvent_l(err);
            return;
        }
    }

    if (mVideoRenderer != NULL) {
+16 −2
Original line number Diff line number Diff line
@@ -32,7 +32,8 @@ SoftwareRenderer::SoftwareRenderer(
        size_t displayWidth, size_t displayHeight,
        size_t decodedWidth, size_t decodedHeight,
        int32_t rotationDegrees)
    : mColorFormat(colorFormat),
    : mInitCheck(NO_INIT),
      mColorFormat(colorFormat),
      mConverter(colorFormat, OMX_COLOR_Format16bitRGB565),
      mISurface(surface),
      mDisplayWidth(displayWidth),
@@ -74,15 +75,28 @@ SoftwareRenderer::SoftwareRenderer(
            mMemoryHeap);

    status_t err = mISurface->registerBuffers(bufferHeap);
    CHECK_EQ(err, OK);

    if (err != OK) {
        LOGW("ISurface failed to register buffers (0x%08x)", err);
    }

    mInitCheck = err;
}

SoftwareRenderer::~SoftwareRenderer() {
    mISurface->unregisterBuffers();
}

status_t SoftwareRenderer::initCheck() const {
    return mInitCheck;
}

void SoftwareRenderer::render(
        const void *data, size_t size, void *platformPrivate) {
    if (mInitCheck != OK) {
        return;
    }

    size_t offset = mIndex * mFrameSize;
    void *dst = (uint8_t *)mMemoryHeap->getBase() + offset;

+2 −1
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ struct UDPPusher;
struct AwesomeRenderer : public RefBase {
    AwesomeRenderer() {}

    virtual status_t initCheck() const = 0;
    virtual void render(MediaBuffer *buffer) = 0;

private:
@@ -225,7 +226,7 @@ private:
    void partial_reset_l();
    status_t seekTo_l(int64_t timeUs);
    status_t pause_l(bool at_eos = false);
    void initRenderer_l();
    status_t initRenderer_l();
    void seekAudioIfNecessary_l();

    void cancelPlayerEvents(bool keepBufferingGoing = false);
+3 −0
Original line number Diff line number Diff line
@@ -38,10 +38,13 @@ public:

    virtual ~SoftwareRenderer();

    status_t initCheck() const;

    virtual void render(
            const void *data, size_t size, void *platformPrivate);

private:
    status_t mInitCheck;
    OMX_COLOR_FORMATTYPE mColorFormat;
    ColorConverter mConverter;
    sp<ISurface> mISurface;
+7 −0
Original line number Diff line number Diff line
@@ -525,6 +525,13 @@ sp<IOMXRenderer> OMX::createRenderer(
                surface,
                displayWidth, displayHeight,
                encodedWidth, encodedHeight);

        if (((SoftwareRenderer *)impl)->initCheck() != OK) {
            delete impl;
            impl = NULL;

            return NULL;
        }
    }

    return new OMXRenderer(impl);