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
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -64,6 +64,7 @@ private:
|
||||
int32_t mVideoBitRate;
|
||||
int32_t mVideoColorFormat;
|
||||
int64_t mNumInputFrames;
|
||||
int64_t mPrevTimestampUs;
|
||||
status_t mInitCheck;
|
||||
bool mStarted;
|
||||
bool mSpsPpsHeaderReceived;
|
||||
|
||||
@@ -59,6 +59,7 @@ private:
|
||||
int32_t mVideoColorFormat;
|
||||
int64_t mNumInputFrames;
|
||||
int64_t mNextModTimeUs;
|
||||
int64_t mPrevTimestampUs;
|
||||
status_t mInitCheck;
|
||||
bool mStarted;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user