diff --git a/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp b/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp index 7e18c1fd6fff7..484c7420b612b 100644 --- a/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp +++ b/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +//#define LOG_NDEBUG 0 +#define LOG_TAG "AVCDecoder" +#include + #include "AVCDecoder.h" #include "avcdec_api.h" @@ -44,7 +48,8 @@ AVCDecoder::AVCDecoder(const sp &source) mHandle(new tagAVCHandle), mInputBuffer(NULL), mAnchorTimeUs(0), - mNumSamplesOutput(0) { + mNumSamplesOutput(0), + mPendingSeekTimeUs(-1) { memset(mHandle, 0, sizeof(tagAVCHandle)); mHandle->AVCObject = NULL; mHandle->userData = this; @@ -152,6 +157,7 @@ status_t AVCDecoder::start(MetaData *) { mAnchorTimeUs = 0; mNumSamplesOutput = 0; + mPendingSeekTimeUs = -1; mStarted = true; return OK; @@ -195,6 +201,21 @@ status_t AVCDecoder::read( MediaBuffer **out, const ReadOptions *options) { *out = NULL; + int64_t seekTimeUs; + if (options && options->getSeekTo(&seekTimeUs)) { + LOGV("seek requested to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6); + + CHECK(seekTimeUs >= 0); + mPendingSeekTimeUs = seekTimeUs; + + if (mInputBuffer) { + mInputBuffer->release(); + mInputBuffer = NULL; + } + + PVAVCDecReset(mHandle); + } + if (mInputBuffer == NULL) { LOGV("fetching new input buffer."); @@ -203,7 +224,19 @@ status_t AVCDecoder::read( mCodecSpecificData.removeAt(0); } else { for (;;) { - status_t err = mSource->read(&mInputBuffer); + if (mPendingSeekTimeUs >= 0) { + LOGV("reading data from timestamp %lld (%.2f secs)", + mPendingSeekTimeUs, mPendingSeekTimeUs / 1E6); + } + + ReadOptions seekOptions; + if (mPendingSeekTimeUs >= 0) { + seekOptions.setSeekTo(mPendingSeekTimeUs); + mPendingSeekTimeUs = -1; + } + status_t err = mSource->read(&mInputBuffer, &seekOptions); + seekOptions.clearSeekTo(); + if (err != OK) { return err; } diff --git a/media/libstagefright/include/AVCDecoder.h b/media/libstagefright/include/AVCDecoder.h index ee3cd473f2cc6..621aa9a964fcc 100644 --- a/media/libstagefright/include/AVCDecoder.h +++ b/media/libstagefright/include/AVCDecoder.h @@ -57,6 +57,7 @@ private: int64_t mAnchorTimeUs; int64_t mNumSamplesOutput; + int64_t mPendingSeekTimeUs; void addCodecSpecificData(const uint8_t *data, size_t size);