am 708ec39c: Don\'t send late frames to software encoders for encoding

Merge commit '708ec39c21568e0c2aa3d20c681f0e14ee6134ad' into gingerbread-plus-aosp

* commit '708ec39c21568e0c2aa3d20c681f0e14ee6134ad':
  Don't send late frames to software encoders for encoding
This commit is contained in:
James Dong
2010-08-12 13:14:19 -07:00
committed by Android Git Automerger
4 changed files with 29 additions and 2 deletions

View File

@@ -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;

View File

@@ -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();

View File

@@ -64,6 +64,7 @@ private:
int32_t mVideoBitRate;
int32_t mVideoColorFormat;
int64_t mNumInputFrames;
int64_t mPrevTimestampUs;
status_t mInitCheck;
bool mStarted;
bool mSpsPpsHeaderReceived;

View File

@@ -59,6 +59,7 @@ private:
int32_t mVideoColorFormat;
int64_t mNumInputFrames;
int64_t mNextModTimeUs;
int64_t mPrevTimestampUs;
status_t mInitCheck;
bool mStarted;