summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/avc
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-08-11 17:29:09 -0700
committerJames Dong <jdong@google.com>2010-08-12 10:40:58 -0700
commit708ec39c21568e0c2aa3d20c681f0e14ee6134ad (patch)
treeab61c2cb58585b1692ffeb239be99d7b80bb27a1 /media/libstagefright/codecs/avc
parent45cb3cfacf3b07ae3c5f15eba9bbbcd060cee261 (diff)
downloadframeworks_base-708ec39c21568e0c2aa3d20c681f0e14ee6134ad.zip
frameworks_base-708ec39c21568e0c2aa3d20c681f0e14ee6134ad.tar.gz
frameworks_base-708ec39c21568e0c2aa3d20c681f0e14ee6134ad.tar.bz2
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
Diffstat (limited to 'media/libstagefright/codecs/avc')
-rw-r--r--media/libstagefright/codecs/avc/enc/AVCEncoder.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp b/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp
index 6e74279..0d89e02 100644
--- a/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp
+++ b/media/libstagefright/codecs/avc/enc/AVCEncoder.cpp
@@ -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;