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 31b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonconst int64_t kNearEOSMarkUs = 2000000ll; // 2 secs 32b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta) 346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber : mIsAudio(false), 3514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat(NULL), 36b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson mLastQueuedTimeUs(0), 377e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih mEOSResult(OK), 387e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih mLatestEnqueuedMeta(NULL) { 3914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber setFormat(meta); 4014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 4114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 4214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid AnotherPacketSource::setFormat(const sp<MetaData> &meta) { 4314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(mFormat == NULL); 4414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mIsAudio = false; 4614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 4714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (meta == NULL) { 4814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber return; 4914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat = meta; 526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber const char *mime; 536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (!strncasecmp("audio/", mime, 6)) { 566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mIsAudio = true; 576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber CHECK(!strncasecmp("video/", mime, 6)); 596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 62cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::~AnotherPacketSource() { 63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 64cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 65cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::start(MetaData *params) { 66cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 67cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 68cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 69cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::stop() { 70cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 71cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 73cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() { 74e62d20268de87f63083896b5eef083d541078322Lajos Molnar Mutex::Autolock autoLock(mLock); 75e62d20268de87f63083896b5eef083d541078322Lajos Molnar if (mFormat != NULL) { 76e62d20268de87f63083896b5eef083d541078322Lajos Molnar return mFormat; 77e62d20268de87f63083896b5eef083d541078322Lajos Molnar } 78e62d20268de87f63083896b5eef083d541078322Lajos Molnar 79e62d20268de87f63083896b5eef083d541078322Lajos Molnar List<sp<ABuffer> >::iterator it = mBuffers.begin(); 80e62d20268de87f63083896b5eef083d541078322Lajos Molnar while (it != mBuffers.end()) { 81e62d20268de87f63083896b5eef083d541078322Lajos Molnar sp<ABuffer> buffer = *it; 82e62d20268de87f63083896b5eef083d541078322Lajos Molnar int32_t discontinuity; 83e62d20268de87f63083896b5eef083d541078322Lajos Molnar if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 84e62d20268de87f63083896b5eef083d541078322Lajos Molnar break; 85e62d20268de87f63083896b5eef083d541078322Lajos Molnar } 86e62d20268de87f63083896b5eef083d541078322Lajos Molnar 87e62d20268de87f63083896b5eef083d541078322Lajos Molnar sp<RefBase> object; 88e62d20268de87f63083896b5eef083d541078322Lajos Molnar if (buffer->meta()->findObject("format", &object)) { 89e62d20268de87f63083896b5eef083d541078322Lajos Molnar return static_cast<MetaData*>(object.get()); 90e62d20268de87f63083896b5eef083d541078322Lajos Molnar } 91e62d20268de87f63083896b5eef083d541078322Lajos Molnar 92e62d20268de87f63083896b5eef083d541078322Lajos Molnar ++it; 93e62d20268de87f63083896b5eef083d541078322Lajos Molnar } 94e62d20268de87f63083896b5eef083d541078322Lajos Molnar return NULL; 95cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 96cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) { 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->clear(); 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCondition.wait(mLock); 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mBuffers.empty()) { 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *buffer = *mBuffers.begin(); 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers.erase(mBuffers.begin()); 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t discontinuity; 1105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) { 1116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (wasFormatChange(discontinuity)) { 1125bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat.clear(); 1135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INFO_DISCONTINUITY; 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 118e62d20268de87f63083896b5eef083d541078322Lajos Molnar sp<RefBase> object; 119e62d20268de87f63083896b5eef083d541078322Lajos Molnar if ((*buffer)->meta()->findObject("format", &object)) { 120e62d20268de87f63083896b5eef083d541078322Lajos Molnar mFormat = static_cast<MetaData*>(object.get()); 121e62d20268de87f63083896b5eef083d541078322Lajos Molnar } 122e62d20268de87f63083896b5eef083d541078322Lajos Molnar 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult; 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read( 130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber MediaBuffer **out, const ReadOptions *) { 131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *out = NULL; 132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.wait(mLock); 136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const sp<ABuffer> buffer = *mBuffers.begin(); 1402a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.erase(mBuffers.begin()); 141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1422a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber int32_t discontinuity; 1435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 1446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (wasFormatChange(discontinuity)) { 1455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat.clear(); 1465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return INFO_DISCONTINUITY; 149e62d20268de87f63083896b5eef083d541078322Lajos Molnar } 150cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 151e62d20268de87f63083896b5eef083d541078322Lajos Molnar sp<RefBase> object; 152e62d20268de87f63083896b5eef083d541078322Lajos Molnar if (buffer->meta()->findObject("format", &object)) { 153e62d20268de87f63083896b5eef083d541078322Lajos Molnar mFormat = static_cast<MetaData*>(object.get()); 154e62d20268de87f63083896b5eef083d541078322Lajos Molnar } 155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 156e62d20268de87f63083896b5eef083d541078322Lajos Molnar int64_t timeUs; 157e62d20268de87f63083896b5eef083d541078322Lajos Molnar CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 159e62d20268de87f63083896b5eef083d541078322Lajos Molnar MediaBuffer *mediaBuffer = new MediaBuffer(buffer); 160e62d20268de87f63083896b5eef083d541078322Lajos Molnar 161e62d20268de87f63083896b5eef083d541078322Lajos Molnar mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); 162e62d20268de87f63083896b5eef083d541078322Lajos Molnar 163e62d20268de87f63083896b5eef083d541078322Lajos Molnar *out = mediaBuffer; 164e62d20268de87f63083896b5eef083d541078322Lajos Molnar return OK; 165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool AnotherPacketSource::wasFormatChange( 1716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int32_t discontinuityType) const { 1726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mIsAudio) { 1736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0; 1746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 1756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 1766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0; 1776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 1786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 184cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 185cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1867e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih int64_t lastQueuedTimeUs; 1877e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih CHECK(buffer->meta()->findInt64("timeUs", &lastQueuedTimeUs)); 1887e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih mLastQueuedTimeUs = lastQueuedTimeUs; 189b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson ALOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", mLastQueuedTimeUs, mLastQueuedTimeUs / 1E6); 190bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 191cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 192cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 193cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 1947e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih 1957e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih if (!mLatestEnqueuedMeta.get()) { 1967e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih mLatestEnqueuedMeta = buffer->meta(); 1977e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih } else { 1987e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih int64_t latestTimeUs = 0; 1997e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih CHECK(mLatestEnqueuedMeta->findInt64("timeUs", &latestTimeUs)); 2007e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih if (lastQueuedTimeUs > latestTimeUs) { 2017e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih mLatestEnqueuedMeta = buffer->meta(); 2027e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih } 2037e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih } 204cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 205cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 20614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid AnotherPacketSource::clear() { 20714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber Mutex::Autolock autoLock(mLock); 20814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 20914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mBuffers.clear(); 21014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mEOSResult = OK; 21114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 21214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat = NULL; 2137e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih mLatestEnqueuedMeta = NULL; 21414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 21514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2165bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity( 21732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ATSParser::DiscontinuityType type, 21832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber const sp<AMessage> &extra) { 2192a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 220bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 2219a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber // Leave only discontinuities in the queue. 2229a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber List<sp<ABuffer> >::iterator it = mBuffers.begin(); 2239a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber while (it != mBuffers.end()) { 2249a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber sp<ABuffer> oldBuffer = *it; 2259a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 2269a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber int32_t oldDiscontinuityType; 2279a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber if (!oldBuffer->meta()->findInt32( 2289a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber "discontinuity", &oldDiscontinuityType)) { 2299a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber it = mBuffers.erase(it); 2309a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber continue; 2319a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber } 23222fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 2339a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber ++it; 23422fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } 2359a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 2369a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber mEOSResult = OK; 237b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson mLastQueuedTimeUs = 0; 2387e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih mLatestEnqueuedMeta = NULL; 2399a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 2409a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber sp<ABuffer> buffer = new ABuffer(0); 2419a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); 2429a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setMessage("extra", extra); 24322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 2442a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 2452a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 2462a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 2472a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 248cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 249cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 250cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 251cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 252cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 253cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 254cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 255cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 256cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 257cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 258cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 259cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 260cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 261cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 262cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 263cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 264cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 265cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 266bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huberint64_t AnotherPacketSource::getBufferedDurationUs(status_t *finalResult) { 267bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber Mutex::Autolock autoLock(mLock); 268bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 269bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber *finalResult = mEOSResult; 270bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 271bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber if (mBuffers.empty()) { 272bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber return 0; 273bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 274bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 275bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber int64_t time1 = -1; 276bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber int64_t time2 = -1; 277bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 278bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber List<sp<ABuffer> >::iterator it = mBuffers.begin(); 279bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber while (it != mBuffers.end()) { 280bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber const sp<ABuffer> &buffer = *it; 281bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 282bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber int64_t timeUs; 283bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber if (buffer->meta()->findInt64("timeUs", &timeUs)) { 284bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber if (time1 < 0) { 285bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber time1 = timeUs; 286bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 287bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 288bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber time2 = timeUs; 289bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } else { 290bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber // This is a discontinuity, reset everything. 291bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber time1 = time2 = -1; 292bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 293bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 294bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber ++it; 295bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 296bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 297bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber return time2 - time1; 298bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber} 299bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *timeUs = 0; 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mBuffers.empty()) { 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 315b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonbool AnotherPacketSource::isFinished(int64_t duration) const { 316b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (duration > 0) { 317b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson int64_t diff = duration - mLastQueuedTimeUs; 318b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (diff < kNearEOSMarkUs && diff > -kNearEOSMarkUs) { 319b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson ALOGV("Detecting EOS due to near end"); 320b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return true; 321b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 322b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 323b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return (mEOSResult != OK); 324b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson} 325b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 3267e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shihsp<AMessage> AnotherPacketSource::getLatestMeta() { 3277e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih Mutex::Autolock autoLock(mLock); 3287e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih return mLatestEnqueuedMeta; 3297e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih} 3307e50e1c0c10cba1e27cafe581273adcadf93877dRobert Shih 331cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 332