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