AnotherPacketSource.cpp revision bfd4d0d9fe0033abf3f55b94f30f6a58846a875e
1cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber/*
2cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
4cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * you may not use this file except in compliance with the License.
6cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * You may obtain a copy of the License at
7cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
8cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
10cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Unless required by applicable law or agreed to in writing, software
11cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * See the License for the specific language governing permissions and
14cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * limitations under the License.
15cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber */
16cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "AnotherPacketSource.h"
18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h>
21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h>
22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AString.h>
23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h>
24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaBuffer.h>
25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h>
26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h>
27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h>
28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta)
326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    : mIsAudio(false),
336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber      mFormat(meta),
34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mEOSResult(OK) {
356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    const char *mime;
366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    CHECK(meta->findCString(kKeyMIMEType, &mime));
376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (!strncasecmp("audio/", mime, 6)) {
396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mIsAudio = true;
406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    } else {
416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        CHECK(!strncasecmp("video/", mime, 6));
426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
455bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::setFormat(const sp<MetaData> &meta) {
465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    CHECK(mFormat == NULL);
475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    mFormat = meta;
485bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::~AnotherPacketSource() {
51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::start(MetaData *params) {
54cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return OK;
55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::stop() {
58cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return OK;
59cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() {
62cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return mFormat;
63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
64cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) {
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    buffer->clear();
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCondition.wait(mLock);
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!mBuffers.empty()) {
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        *buffer = *mBuffers.begin();
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mBuffers.erase(mBuffers.begin());
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int32_t discontinuity;
785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) {
796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (wasFormatChange(discontinuity)) {
805bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mFormat.clear();
815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return INFO_DISCONTINUITY;
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return mEOSResult;
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
92cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read(
93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        MediaBuffer **out, const ReadOptions *) {
94cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *out = NULL;
95cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
96cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
97cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    while (mEOSResult == OK && mBuffers.empty()) {
98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mCondition.wait(mLock);
99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        const sp<ABuffer> buffer = *mBuffers.begin();
1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mBuffers.erase(mBuffers.begin());
104cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1052a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        int32_t discontinuity;
1065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        if (buffer->meta()->findInt32("discontinuity", &discontinuity)) {
1076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (wasFormatChange(discontinuity)) {
1085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mFormat.clear();
1095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
1105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1112a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return INFO_DISCONTINUITY;
1122a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        } else {
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int64_t timeUs;
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
116f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber            MediaBuffer *mediaBuffer = new MediaBuffer(buffer);
117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
118f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber            mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1202a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            *out = mediaBuffer;
1212a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            return OK;
1222a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        }
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return mEOSResult;
126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool AnotherPacketSource::wasFormatChange(
1296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        int32_t discontinuityType) const {
1306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mIsAudio) {
1316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0;
1326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
1336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
1346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0;
1356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
1366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) {
138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    int32_t damaged;
139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (buffer->meta()->findInt32("damaged", &damaged) && damaged) {
140cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // LOG(VERBOSE) << "discarding damaged AU";
141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return;
142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
144bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t timeUs;
145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
1463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6);
147bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffers.push_back(buffer);
150cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
152cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1535bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity(
15432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        ATSParser::DiscontinuityType type,
15532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        const sp<AMessage> &extra) {
1562a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    Mutex::Autolock autoLock(mLock);
157bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
1589a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    // Leave only discontinuities in the queue.
1599a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    List<sp<ABuffer> >::iterator it = mBuffers.begin();
1609a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    while (it != mBuffers.end()) {
1619a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        sp<ABuffer> oldBuffer = *it;
1629a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
1639a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        int32_t oldDiscontinuityType;
1649a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        if (!oldBuffer->meta()->findInt32(
1659a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber                    "discontinuity", &oldDiscontinuityType)) {
1669a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber            it = mBuffers.erase(it);
1679a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber            continue;
1689a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        }
16922fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber
1709a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        ++it;
17122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    }
1729a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
1739a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    mEOSResult = OK;
1749a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
1759a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    sp<ABuffer> buffer = new ABuffer(0);
1769a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
1779a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    buffer->meta()->setMessage("extra", extra);
17822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber
1792a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffers.push_back(buffer);
1802a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mCondition.signal();
1812a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
1822a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) {
184cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK(result != OK);
185cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
186cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
187cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mEOSResult = result;
188cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mCondition.signal();
189cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
190cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
191cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) {
192cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Mutex::Autolock autoLock(mLock);
193cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mBuffers.empty()) {
194cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return true;
195cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
196cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
197cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    *finalResult = mEOSResult;
198cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return false;
199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
200cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
201bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huberint64_t AnotherPacketSource::getBufferedDurationUs(status_t *finalResult) {
202bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    Mutex::Autolock autoLock(mLock);
203bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
204bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    *finalResult = mEOSResult;
205bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
206bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    if (mBuffers.empty()) {
207bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        return 0;
208bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    }
209bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
210bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    int64_t time1 = -1;
211bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    int64_t time2 = -1;
212bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
213bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    List<sp<ABuffer> >::iterator it = mBuffers.begin();
214bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    while (it != mBuffers.end()) {
215bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        const sp<ABuffer> &buffer = *it;
216bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
217bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        int64_t timeUs;
218bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        if (buffer->meta()->findInt64("timeUs", &timeUs)) {
219bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber            if (time1 < 0) {
220bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber                time1 = timeUs;
221bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber            }
222bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
223bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber            time2 = timeUs;
224bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        } else {
225bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber            // This is a discontinuity, reset everything.
226bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber            time1 = time2 = -1;
227bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        }
228bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
229bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber        ++it;
230bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    }
231bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
232bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    return time2 - time1;
233bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber}
234bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
235f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) {
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    *timeUs = 0;
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex::Autolock autoLock(mLock);
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mBuffers.empty()) {
241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK;
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = *mBuffers.begin();
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(buffer->meta()->findInt64("timeUs", timeUs));
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
250cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
251