diff options
author | Andreas Huber <andih@google.com> | 2009-12-14 10:53:00 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2009-12-14 10:54:10 -0800 |
commit | 587423f64501606852f05393ce1edfac0c18d545 (patch) | |
tree | 5d940990a8f02c7ff84ddf32041b13aaf1c0a2fe /media/libstagefright/codecs/avc/dec | |
parent | b841f14f8e51f2365945281fbfa54ef6a1b1b5a6 (diff) | |
download | frameworks_av-587423f64501606852f05393ce1edfac0c18d545.zip frameworks_av-587423f64501606852f05393ce1edfac0c18d545.tar.gz frameworks_av-587423f64501606852f05393ce1edfac0c18d545.tar.bz2 |
The software AVCDecoder now properly seeks as requested.
Diffstat (limited to 'media/libstagefright/codecs/avc/dec')
-rw-r--r-- | media/libstagefright/codecs/avc/dec/AVCDecoder.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp b/media/libstagefright/codecs/avc/dec/AVCDecoder.cpp index 7e18c1f..484c742 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 <utils/Log.h> + #include "AVCDecoder.h" #include "avcdec_api.h" @@ -44,7 +48,8 @@ AVCDecoder::AVCDecoder(const sp<MediaSource> &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; } |