OSDN Git Service

The software AVCDecoder now properly seeks as requested.
authorAndreas Huber <andih@google.com>
Mon, 14 Dec 2009 18:53:00 +0000 (10:53 -0800)
committerAndreas Huber <andih@google.com>
Mon, 14 Dec 2009 18:54:10 +0000 (10:54 -0800)
media/libstagefright/codecs/avc/dec/AVCDecoder.cpp
media/libstagefright/include/AVCDecoder.h

index 7e18c1f..484c742 100644 (file)
  * 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;
                 }
index ee3cd47..621aa9a 100644 (file)
@@ -57,6 +57,7 @@ private:
 
     int64_t mAnchorTimeUs;
     int64_t mNumSamplesOutput;
+    int64_t mPendingSeekTimeUs;
 
     void addCodecSpecificData(const uint8_t *data, size_t size);