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

Commit 708ec39c authored by James Dong's avatar James Dong
Browse files

Don't send late frames to software encoders for encoding

o Document on what frames will be rejected and what frames will be accepted

Change-Id: I5a5d489ad3d2b50dbb40a0f6e01529312ce81c54
parent 45cb3cfa
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -407,6 +407,22 @@ status_t AVCEncoder::read(
        CHECK(mInputBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
        outputBuffer->meta_data()->setInt64(kKeyTime, timeUs);

        // When the timestamp of the current sample is the same as
        // that of the previous sample, the encoding of the sample
        // is bypassed, and the output length is set to 0.
        if (mNumInputFrames >= 1 && mPrevTimestampUs == timeUs) {
            // Frame arrives too late
            mInputBuffer->release();
            mInputBuffer = NULL;
            outputBuffer->set_range(0, 0);
            *out = outputBuffer;
            return OK;
        }

        // Don't accept out-of-order samples
        CHECK(mPrevTimestampUs < timeUs);
        mPrevTimestampUs = timeUs;

        AVCFrameIO videoInput;
        memset(&videoInput, 0, sizeof(videoInput));
        videoInput.height = ((mVideoHeight  + 15) >> 4) << 4;
+11 −2
Original line number Diff line number Diff line
@@ -306,8 +306,13 @@ status_t M4vH263Encoder::read(

    int64_t timeUs;
    CHECK(mInputBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
    if (mNextModTimeUs > timeUs) {
        LOGV("mNextModTimeUs %lld > timeUs %lld", mNextModTimeUs, timeUs);

    // When the timestamp of the current sample is the same as that
    // of the previous sample, encoding of the current sample is
    // bypassed, and the output length of the sample is set to 0
    if (mNumInputFrames >= 1 &&
        (mNextModTimeUs > timeUs || mPrevTimestampUs == timeUs)) {
        // Frame arrives too late
        outputBuffer->set_range(0, 0);
        *out = outputBuffer;
        mInputBuffer->release();
@@ -315,6 +320,10 @@ status_t M4vH263Encoder::read(
        return OK;
    }

    // Don't accept out-of-order samples
    CHECK(mPrevTimestampUs < timeUs);
    mPrevTimestampUs = timeUs;

    // Color convert to OMX_COLOR_FormatYUV420Planar if necessary
    outputBuffer->meta_data()->setInt64(kKeyTime, timeUs);
    uint8_t *inPtr = (uint8_t *) mInputBuffer->data();
+1 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ private:
    int32_t  mVideoBitRate;
    int32_t  mVideoColorFormat;
    int64_t  mNumInputFrames;
    int64_t  mPrevTimestampUs;
    status_t mInitCheck;
    bool     mStarted;
    bool     mSpsPpsHeaderReceived;
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ private:
    int32_t  mVideoColorFormat;
    int64_t  mNumInputFrames;
    int64_t  mNextModTimeUs;
    int64_t  mPrevTimestampUs;
    status_t mInitCheck;
    bool     mStarted;