AnotherPacketSource.cpp revision 3423bbdb05f843a64356fa24e8657f03ecbb7d65
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 29b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h> 30b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross 31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 33b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonconst int64_t kNearEOSMarkUs = 2000000ll; // 2 secs 34b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta) 366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber : mIsAudio(false), 373423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih mIsVideo(false), 3814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat(NULL), 39b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson mLastQueuedTimeUs(0), 4069634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mEOSResult(OK), 4169634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLatestEnqueuedMeta(NULL) { 4214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber setFormat(meta); 4314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 4414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid AnotherPacketSource::setFormat(const sp<MetaData> &meta) { 4614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(mFormat == NULL); 4714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 4814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mIsAudio = false; 493423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih mIsVideo = false; 5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (meta == NULL) { 5214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber return; 5314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 5414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat = meta; 566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber const char *mime; 576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (!strncasecmp("audio/", mime, 6)) { 606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mIsAudio = true; 613423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih } else if (!strncasecmp("video/", mime, 6)) { 623423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih mIsVideo = true; 636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 643423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih CHECK(!strncasecmp("text/", mime, 5)); 656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 66cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 67cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 68cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::~AnotherPacketSource() { 69cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 70cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 7184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t AnotherPacketSource::start(MetaData * /* params */) { 72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 73cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 74cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 75cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::stop() { 76cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 78cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 79cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() { 80fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar Mutex::Autolock autoLock(mLock); 81fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar if (mFormat != NULL) { 82fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return mFormat; 83fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 84fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 85fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar List<sp<ABuffer> >::iterator it = mBuffers.begin(); 86fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar while (it != mBuffers.end()) { 87fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar sp<ABuffer> buffer = *it; 88fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar int32_t discontinuity; 89fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 90fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar break; 91fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 92fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 93fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar sp<RefBase> object; 94fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar if (buffer->meta()->findObject("format", &object)) { 95fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return static_cast<MetaData*>(object.get()); 96fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 97fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 98fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar ++it; 99fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 100fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return NULL; 101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) { 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->clear(); 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCondition.wait(mLock); 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mBuffers.empty()) { 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *buffer = *mBuffers.begin(); 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers.erase(mBuffers.begin()); 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t discontinuity; 1165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) { 1176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (wasFormatChange(discontinuity)) { 1185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat.clear(); 1195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INFO_DISCONTINUITY; 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 124fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar sp<RefBase> object; 125fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar if ((*buffer)->meta()->findObject("format", &object)) { 126fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar mFormat = static_cast<MetaData*>(object.get()); 127fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 128fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult; 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read( 136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber MediaBuffer **out, const ReadOptions *) { 137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *out = NULL; 138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 140cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.wait(mLock); 142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 144cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const sp<ABuffer> buffer = *mBuffers.begin(); 1462a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.erase(mBuffers.begin()); 147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber int32_t discontinuity; 1495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 1506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (wasFormatChange(discontinuity)) { 1515bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat.clear(); 1525bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1542a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return INFO_DISCONTINUITY; 155fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 157fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar sp<RefBase> object; 158fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar if (buffer->meta()->findObject("format", &object)) { 159fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar mFormat = static_cast<MetaData*>(object.get()); 160fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 162fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar int64_t timeUs; 163fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 165fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar MediaBuffer *mediaBuffer = new MediaBuffer(buffer); 166fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 167fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); 168fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 169fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar *out = mediaBuffer; 170fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return OK; 171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool AnotherPacketSource::wasFormatChange( 1776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int32_t discontinuityType) const { 1786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mIsAudio) { 1796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0; 1806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 1816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 1823423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih if (mIsVideo) { 1833423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0; 1843423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih } 1853423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 1863423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih return false; 1876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 1886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 189cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 190cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 191cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 192cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 193cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 194cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 195cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 19669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih int64_t lastQueuedTimeUs; 19769634506fbfe79605c37f337a8d6748cda4445b1Robert Shih CHECK(buffer->meta()->findInt64("timeUs", &lastQueuedTimeUs)); 19869634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLastQueuedTimeUs = lastQueuedTimeUs; 199b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("queueAccessUnit timeUs=%" PRIi64 " us (%.2f secs)", mLastQueuedTimeUs, mLastQueuedTimeUs / 1E6); 200bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 201cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 202cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 203cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 20469634506fbfe79605c37f337a8d6748cda4445b1Robert Shih 20569634506fbfe79605c37f337a8d6748cda4445b1Robert Shih if (!mLatestEnqueuedMeta.get()) { 20669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLatestEnqueuedMeta = buffer->meta(); 20769634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } else { 20869634506fbfe79605c37f337a8d6748cda4445b1Robert Shih int64_t latestTimeUs = 0; 20969634506fbfe79605c37f337a8d6748cda4445b1Robert Shih CHECK(mLatestEnqueuedMeta->findInt64("timeUs", &latestTimeUs)); 21069634506fbfe79605c37f337a8d6748cda4445b1Robert Shih if (lastQueuedTimeUs > latestTimeUs) { 21169634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLatestEnqueuedMeta = buffer->meta(); 21269634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } 21369634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } 214cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 215cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 21614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid AnotherPacketSource::clear() { 21714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber Mutex::Autolock autoLock(mLock); 21814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 21914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mBuffers.clear(); 22014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mEOSResult = OK; 22114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 22214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat = NULL; 22369634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLatestEnqueuedMeta = NULL; 22414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 22514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2265bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity( 22732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ATSParser::DiscontinuityType type, 228632740c58119a132ce19f6d498e39c5c3773971aChong Zhang const sp<AMessage> &extra, 229632740c58119a132ce19f6d498e39c5c3773971aChong Zhang bool discard) { 2302a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 231bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 232632740c58119a132ce19f6d498e39c5c3773971aChong Zhang if (discard) { 233632740c58119a132ce19f6d498e39c5c3773971aChong Zhang // Leave only discontinuities in the queue. 234632740c58119a132ce19f6d498e39c5c3773971aChong Zhang List<sp<ABuffer> >::iterator it = mBuffers.begin(); 235632740c58119a132ce19f6d498e39c5c3773971aChong Zhang while (it != mBuffers.end()) { 236632740c58119a132ce19f6d498e39c5c3773971aChong Zhang sp<ABuffer> oldBuffer = *it; 237632740c58119a132ce19f6d498e39c5c3773971aChong Zhang 238632740c58119a132ce19f6d498e39c5c3773971aChong Zhang int32_t oldDiscontinuityType; 239632740c58119a132ce19f6d498e39c5c3773971aChong Zhang if (!oldBuffer->meta()->findInt32( 240632740c58119a132ce19f6d498e39c5c3773971aChong Zhang "discontinuity", &oldDiscontinuityType)) { 24165eeb3c92ffc8b90eb1330fdf9a74c55f3c6b463Wei Jia MediaBuffer *mbuf = NULL; 24265eeb3c92ffc8b90eb1330fdf9a74c55f3c6b463Wei Jia oldBuffer->meta()->findPointer("mediaBuffer", (void**)&mbuf); 24365eeb3c92ffc8b90eb1330fdf9a74c55f3c6b463Wei Jia if (mbuf != NULL) { 24465eeb3c92ffc8b90eb1330fdf9a74c55f3c6b463Wei Jia mbuf->release(); 24565eeb3c92ffc8b90eb1330fdf9a74c55f3c6b463Wei Jia } 246632740c58119a132ce19f6d498e39c5c3773971aChong Zhang it = mBuffers.erase(it); 247632740c58119a132ce19f6d498e39c5c3773971aChong Zhang continue; 248632740c58119a132ce19f6d498e39c5c3773971aChong Zhang } 2499a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 250632740c58119a132ce19f6d498e39c5c3773971aChong Zhang ++it; 2519a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber } 25222fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } 2539a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 2549a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber mEOSResult = OK; 255b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson mLastQueuedTimeUs = 0; 25669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLatestEnqueuedMeta = NULL; 2579a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 2589a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber sp<ABuffer> buffer = new ABuffer(0); 2599a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); 2609a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setMessage("extra", extra); 26122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 2622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 2632a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 2642a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 2652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 266cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 267cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 268cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 269cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 270cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 271cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 272cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 273cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 274cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 275cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 276cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 277cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 278cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 279cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 280cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 281cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 282cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 283cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 284bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huberint64_t AnotherPacketSource::getBufferedDurationUs(status_t *finalResult) { 285bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber Mutex::Autolock autoLock(mLock); 286bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 287bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber *finalResult = mEOSResult; 288bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 289bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber if (mBuffers.empty()) { 290bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber return 0; 291bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 292bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 293bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber int64_t time1 = -1; 294bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber int64_t time2 = -1; 295bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 296bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber List<sp<ABuffer> >::iterator it = mBuffers.begin(); 297bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber while (it != mBuffers.end()) { 298bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber const sp<ABuffer> &buffer = *it; 299bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 300bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber int64_t timeUs; 301bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber if (buffer->meta()->findInt64("timeUs", &timeUs)) { 302bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber if (time1 < 0) { 303bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber time1 = timeUs; 304bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 305bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 306bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber time2 = timeUs; 307bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } else { 308bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber // This is a discontinuity, reset everything. 309bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber time1 = time2 = -1; 310bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 311bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 312bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber ++it; 313bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 314bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 315bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber return time2 - time1; 316bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber} 317bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *timeUs = 0; 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mBuffers.empty()) { 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 333b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonbool AnotherPacketSource::isFinished(int64_t duration) const { 334b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (duration > 0) { 335b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson int64_t diff = duration - mLastQueuedTimeUs; 336b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (diff < kNearEOSMarkUs && diff > -kNearEOSMarkUs) { 337b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson ALOGV("Detecting EOS due to near end"); 338b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return true; 339b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 340b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 341b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return (mEOSResult != OK); 342b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson} 343b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 34469634506fbfe79605c37f337a8d6748cda4445b1Robert Shihsp<AMessage> AnotherPacketSource::getLatestMeta() { 34569634506fbfe79605c37f337a8d6748cda4445b1Robert Shih Mutex::Autolock autoLock(mLock); 34669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih return mLatestEnqueuedMeta; 34769634506fbfe79605c37f337a8d6748cda4445b1Robert Shih} 34869634506fbfe79605c37f337a8d6748cda4445b1Robert Shih 349cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 350