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

Commit 2d6dbfb5 authored by Andreas Huber's avatar Andreas Huber Committed by Android Git Automerger
Browse files

am b690e55d: Merge "DO NOT MERGE - Instead of asserting that ISurface...

am b690e55d: Merge "DO NOT MERGE - Instead of asserting that ISurface successfully registered buffers, report an error and propagate it up to the java client." into gingerbread

* commit 'b690e55d3f713d68c6ed9654a05a5370bda731d5':
  DO NOT MERGE - Instead of asserting that ISurface successfully registered buffers, report an error and propagate it up to the java client.
parents ecd0a4f0 4d0565de
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()
@@ -830,8 +844,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;
@@ -858,13 +875,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.
@@ -876,7 +900,8 @@ void AwesomePlayer::initRenderer_l() {
            mVideoWidth, mVideoHeight,
            decodedWidth, decodedHeight, rotationDegrees);
    }
    }

    return mVideoRenderer->initCheck();
}

status_t AwesomePlayer::pause() {
@@ -1217,11 +1242,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.
@@ -1310,7 +1340,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
@@ -48,6 +48,7 @@ class DecryptHandle;
struct AwesomeRenderer : public RefBase {
    AwesomeRenderer() {}

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

private:
@@ -232,7 +233,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);