Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0483f1c1 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change Ib5ae1c87 into eclair-mr2

* changes:
  The software AVCDecoder now properly seeks as requested.
parents 91afce93 b5ae1c87
Loading
Loading
Loading
Loading
+35 −2
Original line number Diff line number Diff line
@@ -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;
                }
+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ private:

    int64_t mAnchorTimeUs;
    int64_t mNumSamplesOutput;
    int64_t mPendingSeekTimeUs;

    void addCodecSpecificData(const uint8_t *data, size_t size);