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

Commit b9289833 authored by Andreas Huber's avatar Andreas Huber
Browse files

Handle some edge cases when seeking while starting up OMXCodec

These were exposed by the new preview-seekframe while paused code.
In particular, the codec may have been in state RECONFIGURING when attempting
to seek, or we may have initiated flushing of the output port and this may not
have completed yet by the time we want to reconfigure the output port.

Change-Id: Id7640ade11dbc7205a22f648ea0b5e3e9b49cf4b
related-to-bug: 3392259
parent 5a50351c
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -175,6 +175,7 @@ private:
    int64_t mSeekTimeUs;
    int64_t mSeekTimeUs;
    ReadOptions::SeekMode mSeekMode;
    ReadOptions::SeekMode mSeekMode;
    int64_t mTargetTimeUs;
    int64_t mTargetTimeUs;
    bool mOutputPortSettingsChangedPending;


    MediaBuffer *mLeftOverBuffer;
    MediaBuffer *mLeftOverBuffer;


+28 −0
Original line number Original line Diff line number Diff line
@@ -1434,6 +1434,7 @@ OMXCodec::OMXCodec(
      mSeekTimeUs(-1),
      mSeekTimeUs(-1),
      mSeekMode(ReadOptions::SEEK_CLOSEST_SYNC),
      mSeekMode(ReadOptions::SEEK_CLOSEST_SYNC),
      mTargetTimeUs(-1),
      mTargetTimeUs(-1),
      mOutputPortSettingsChangedPending(false),
      mLeftOverBuffer(NULL),
      mLeftOverBuffer(NULL),
      mPaused(false),
      mPaused(false),
      mNativeWindow(nativeWindow) {
      mNativeWindow(nativeWindow) {
@@ -2344,6 +2345,14 @@ void OMXCodec::onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data) {
                    drainInputBuffers();
                    drainInputBuffers();
                    fillOutputBuffers();
                    fillOutputBuffers();
                }
                }

                if (mOutputPortSettingsChangedPending) {
                    CODEC_LOGV(
                            "Honoring deferred output port settings change.");

                    mOutputPortSettingsChangedPending = false;
                    onPortSettingsChanged(kPortIndexOutput);
                }
            }
            }


            break;
            break;
@@ -2407,6 +2416,8 @@ void OMXCodec::onStateChange(OMX_STATETYPE newState) {


            CODEC_LOGV("Now Executing.");
            CODEC_LOGV("Now Executing.");


            mOutputPortSettingsChangedPending = false;

            setState(EXECUTING);
            setState(EXECUTING);


            // Buffers will be submitted to the component in the first
            // Buffers will be submitted to the component in the first
@@ -2520,6 +2531,14 @@ void OMXCodec::onPortSettingsChanged(OMX_U32 portIndex) {


    CHECK_EQ((int)mState, (int)EXECUTING);
    CHECK_EQ((int)mState, (int)EXECUTING);
    CHECK_EQ(portIndex, (OMX_U32)kPortIndexOutput);
    CHECK_EQ(portIndex, (OMX_U32)kPortIndexOutput);
    CHECK(!mOutputPortSettingsChangedPending);

    if (mPortStatus[kPortIndexOutput] != ENABLED) {
        CODEC_LOGV("Deferring output port settings change.");
        mOutputPortSettingsChangedPending = true;
        return;
    }

    setState(RECONFIGURING);
    setState(RECONFIGURING);


    if (mQuirks & kNeedsFlushBeforeDisable) {
    if (mQuirks & kNeedsFlushBeforeDisable) {
@@ -2712,6 +2731,7 @@ bool OMXCodec::drainInputBuffer(BufferInfo *info) {
                if (srcBuffer->meta_data()->findInt64(
                if (srcBuffer->meta_data()->findInt64(
                            kKeyTargetTime, &targetTimeUs)
                            kKeyTargetTime, &targetTimeUs)
                        && targetTimeUs >= 0) {
                        && targetTimeUs >= 0) {
                    CODEC_LOGV("targetTimeUs = %lld us", targetTimeUs);
                    mTargetTimeUs = targetTimeUs;
                    mTargetTimeUs = targetTimeUs;
                } else {
                } else {
                    mTargetTimeUs = -1;
                    mTargetTimeUs = -1;
@@ -3385,6 +3405,14 @@ status_t OMXCodec::read(
    }
    }


    if (seeking) {
    if (seeking) {
        while (mState == RECONFIGURING) {
            mBufferFilled.wait(mLock);
        }

        if (mState != EXECUTING) {
            return UNKNOWN_ERROR;
        }

        CODEC_LOGV("seeking to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6);
        CODEC_LOGV("seeking to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6);


        mSignalledEOS = false;
        mSignalledEOS = false;