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

Commit e086ad8d authored by Anu Sundararajan's avatar Anu Sundararajan
Browse files

Stagefright: Return error if codec takes too long to return a buffer.



There are many scenarios where the codec may not return a valid buffer.
In such a case, the OMXCodec::read() call hangs indefitely. Therefore,
wait() call is replaced with waitRelative() so that it timesout after a
few seconds and we exit gracefully.

Change-Id: Ie03c5d1e979b71f6253efcaa0665aa5e541cebe2
Signed-off-by: default avatarAnu Sundararajan <sanuradha@ti.com>
parent 08d9d9a4
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -3015,6 +3015,8 @@ sp<MetaData> OMXCodec::getFormat() {

status_t OMXCodec::read(
        MediaBuffer **buffer, const ReadOptions *options) {

    status_t wait_status = 0;
    *buffer = NULL;

    Mutex::Autolock autoLock(mLock);
@@ -3084,12 +3086,20 @@ status_t OMXCodec::read(
        }

        while (mSeekTimeUs >= 0) {
            mBufferFilled.wait(mLock);
            wait_status = mBufferFilled.waitRelative(mLock, 3000000000);
            if (wait_status) {
                LOGE("Timed out waiting for the buffer! Line %d", __LINE__);
                return UNKNOWN_ERROR;
            }
        }
    }

    while (mState != ERROR && !mNoMoreOutputData && mFilledBuffers.empty()) {
        mBufferFilled.wait(mLock);
        wait_status = mBufferFilled.waitRelative(mLock, 3000000000);
        if (wait_status) {
            LOGE("Timed out waiting for the buffer! Line %d", __LINE__);
            return UNKNOWN_ERROR;
        }
    }

    if (mState == ERROR) {