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 17309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih//#define LOG_NDEBUG 0 18309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih#define LOG_TAG "AnotherPacketSource" 19309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih 20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "AnotherPacketSource.h" 21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 227c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang#include "include/avc_utils.h" 237c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h> 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h> 27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AString.h> 28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h> 29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaBuffer.h> 30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h> 31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h> 32d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang#include <media/stagefright/Utils.h> 33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h> 34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 35b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h> 36b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross 37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 38cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 39b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonconst int64_t kNearEOSMarkUs = 2000000ll; // 2 secs 40b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta) 426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber : mIsAudio(false), 433423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih mIsVideo(false), 447c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mEnabled(true), 4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat(NULL), 46b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson mLastQueuedTimeUs(0), 4769634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mEOSResult(OK), 48309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih mLatestEnqueuedMeta(NULL), 490dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mLatestDequeuedMeta(NULL) { 5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber setFormat(meta); 510dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 520dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 5314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 5414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid AnotherPacketSource::setFormat(const sp<MetaData> &meta) { 56c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang if (mFormat != NULL) { 57c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang // Only allowed to be set once. Requires explicit clear to reset. 58c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang return; 59c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang } 6014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mIsAudio = false; 623423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih mIsVideo = false; 6314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (meta == NULL) { 6514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber return; 6614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 6714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat = meta; 696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber const char *mime; 706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (!strncasecmp("audio/", mime, 6)) { 736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mIsAudio = true; 743423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih } else if (!strncasecmp("video/", mime, 6)) { 753423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih mIsVideo = true; 766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 770852843d304006e3ab333081fddda13b07193de8Robert Shih CHECK(!strncasecmp("text/", mime, 5) || !strncasecmp("application/", mime, 12)); 786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 79cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 80cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 81cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::~AnotherPacketSource() { 82cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 83cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t AnotherPacketSource::start(MetaData * /* params */) { 85cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 86cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 87cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 88cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::stop() { 89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 91cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 92cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() { 93fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar Mutex::Autolock autoLock(mLock); 94fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar if (mFormat != NULL) { 95fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return mFormat; 96fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 97fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 98fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar List<sp<ABuffer> >::iterator it = mBuffers.begin(); 99fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar while (it != mBuffers.end()) { 100fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar sp<ABuffer> buffer = *it; 101fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar int32_t discontinuity; 1025bb7e181d9156135e56ce44a3d0bd42eb31a9ee8Chong Zhang if (!buffer->meta()->findInt32("discontinuity", &discontinuity)) { 1035bb7e181d9156135e56ce44a3d0bd42eb31a9ee8Chong Zhang sp<RefBase> object; 1045bb7e181d9156135e56ce44a3d0bd42eb31a9ee8Chong Zhang if (buffer->meta()->findObject("format", &object)) { 105c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang setFormat(static_cast<MetaData*>(object.get())); 106c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang return mFormat; 1075bb7e181d9156135e56ce44a3d0bd42eb31a9ee8Chong Zhang } 108fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 109fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 110fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar ++it; 111fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 112fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return NULL; 113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) { 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->clear(); 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCondition.wait(mLock); 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mBuffers.empty()) { 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *buffer = *mBuffers.begin(); 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers.erase(mBuffers.begin()); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t discontinuity; 1285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) { 1296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (wasFormatChange(discontinuity)) { 1305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat.clear(); 1315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1330dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.erase(mDiscontinuitySegments.begin()); 1340dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INFO_DISCONTINUITY; 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1380dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 1390dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *mDiscontinuitySegments.begin(); 1400dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 1410dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih int64_t timeUs; 142309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih mLatestDequeuedMeta = (*buffer)->meta()->dup(); 1430dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih CHECK(mLatestDequeuedMeta->findInt64("timeUs", &timeUs)); 1440dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (timeUs > seg.mMaxDequeTimeUs) { 1450dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.mMaxDequeTimeUs = timeUs; 1460dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 147309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih 148fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar sp<RefBase> object; 149fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar if ((*buffer)->meta()->findObject("format", &object)) { 150c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang setFormat(static_cast<MetaData*>(object.get())); 151fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 152fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult; 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1590852843d304006e3ab333081fddda13b07193de8Robert Shihvoid AnotherPacketSource::requeueAccessUnit(const sp<ABuffer> &buffer) { 1600852843d304006e3ab333081fddda13b07193de8Robert Shih // TODO: update corresponding book keeping info. 1610852843d304006e3ab333081fddda13b07193de8Robert Shih Mutex::Autolock autoLock(mLock); 1620852843d304006e3ab333081fddda13b07193de8Robert Shih mBuffers.push_front(buffer); 1630852843d304006e3ab333081fddda13b07193de8Robert Shih} 1640852843d304006e3ab333081fddda13b07193de8Robert Shih 165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read( 166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber MediaBuffer **out, const ReadOptions *) { 167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *out = NULL; 168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.wait(mLock); 172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 175309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih 176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const sp<ABuffer> buffer = *mBuffers.begin(); 1772a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.erase(mBuffers.begin()); 178cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1792a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber int32_t discontinuity; 1805bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 1816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (wasFormatChange(discontinuity)) { 1825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat.clear(); 1835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1850dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.erase(mDiscontinuitySegments.begin()); 1860dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 1872a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return INFO_DISCONTINUITY; 188fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 189cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestDequeuedMeta = buffer->meta()->dup(); 1917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 192fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar sp<RefBase> object; 193fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar if (buffer->meta()->findObject("format", &object)) { 194c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang setFormat(static_cast<MetaData*>(object.get())); 195fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar } 196cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 197fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar int64_t timeUs; 198fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 1990dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 2000dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *mDiscontinuitySegments.begin(); 2010dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (timeUs > seg.mMaxDequeTimeUs) { 2020dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.mMaxDequeTimeUs = timeUs; 2030dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 204cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 205fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar MediaBuffer *mediaBuffer = new MediaBuffer(buffer); 206fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 207fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); 208fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 20937746afe186ce04f0f6252900b79726040d89a0dTerry Heo int32_t isSync; 21037746afe186ce04f0f6252900b79726040d89a0dTerry Heo if (buffer->meta()->findInt32("isSync", &isSync)) { 21137746afe186ce04f0f6252900b79726040d89a0dTerry Heo mediaBuffer->meta_data()->setInt32(kKeyIsSyncFrame, isSync); 21237746afe186ce04f0f6252900b79726040d89a0dTerry Heo } 21337746afe186ce04f0f6252900b79726040d89a0dTerry Heo 214f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih sp<ABuffer> sei; 215f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih if (buffer->meta()->findBuffer("sei", &sei) && sei != NULL) { 216f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih mediaBuffer->meta_data()->setData(kKeySEI, 0, sei->data(), sei->size()); 217f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih } 218f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih 219fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar *out = mediaBuffer; 220fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return OK; 221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 224cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 225cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool AnotherPacketSource::wasFormatChange( 2276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int32_t discontinuityType) const { 2286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mIsAudio) { 2296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0; 2306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 2316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 2323423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih if (mIsVideo) { 2333423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0; 2343423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih } 2353423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 2363423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih return false; 2376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 2386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 239cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 240cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 241cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 242cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 243cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 244cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 245cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 246cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 247cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 248cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 24969634506fbfe79605c37f337a8d6748cda4445b1Robert Shih 2500ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih int32_t discontinuity; 2510dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (buffer->meta()->findInt32("discontinuity", &discontinuity)){ 2520dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ALOGV("queueing a discontinuity with queueAccessUnit"); 2530dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 2547c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = 0ll; 2557c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mEOSResult = OK; 2567c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestEnqueuedMeta = NULL; 2570dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 2580dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 2597c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return; 2600ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih } 2610ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih 2627c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t lastQueuedTimeUs; 2637c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang CHECK(buffer->meta()->findInt64("timeUs", &lastQueuedTimeUs)); 2647c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = lastQueuedTimeUs; 2657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang ALOGV("queueAccessUnit timeUs=%" PRIi64 " us (%.2f secs)", 2667c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs, mLastQueuedTimeUs / 1E6); 2677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 2680dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 2690dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &tailSeg = *(--mDiscontinuitySegments.end()); 2700dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (lastQueuedTimeUs > tailSeg.mMaxEnqueTimeUs) { 2710dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih tailSeg.mMaxEnqueTimeUs = lastQueuedTimeUs; 2720dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 2730dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (tailSeg.mMaxDequeTimeUs == -1) { 2740dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih tailSeg.mMaxDequeTimeUs = lastQueuedTimeUs; 2750dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 2760dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 277309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih if (mLatestEnqueuedMeta == NULL) { 2782a66207f1136d60857759bccbaa5b7612f7070cfApurupa Pattapu mLatestEnqueuedMeta = buffer->meta()->dup(); 27969634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } else { 28069634506fbfe79605c37f337a8d6748cda4445b1Robert Shih int64_t latestTimeUs = 0; 28179971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu int64_t frameDeltaUs = 0; 28269634506fbfe79605c37f337a8d6748cda4445b1Robert Shih CHECK(mLatestEnqueuedMeta->findInt64("timeUs", &latestTimeUs)); 28369634506fbfe79605c37f337a8d6748cda4445b1Robert Shih if (lastQueuedTimeUs > latestTimeUs) { 2842a66207f1136d60857759bccbaa5b7612f7070cfApurupa Pattapu mLatestEnqueuedMeta = buffer->meta()->dup(); 28579971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu frameDeltaUs = lastQueuedTimeUs - latestTimeUs; 28679971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu mLatestEnqueuedMeta->setInt64("durationUs", frameDeltaUs); 28779971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu } else if (!mLatestEnqueuedMeta->findInt64("durationUs", &frameDeltaUs)) { 28879971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu // For B frames 28979971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu frameDeltaUs = latestTimeUs - lastQueuedTimeUs; 29079971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu mLatestEnqueuedMeta->setInt64("durationUs", frameDeltaUs); 29169634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } 29269634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } 293cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 294cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 29514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid AnotherPacketSource::clear() { 29614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber Mutex::Autolock autoLock(mLock); 29714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 29814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mBuffers.clear(); 29914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mEOSResult = OK; 3000dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3010dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.clear(); 3020dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 30314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 30414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat = NULL; 30569634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLatestEnqueuedMeta = NULL; 30614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 30714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 3085bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity( 30932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ATSParser::DiscontinuityType type, 310632740c58119a132ce19f6d498e39c5c3773971aChong Zhang const sp<AMessage> &extra, 311632740c58119a132ce19f6d498e39c5c3773971aChong Zhang bool discard) { 3122a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 313bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 314632740c58119a132ce19f6d498e39c5c3773971aChong Zhang if (discard) { 315632740c58119a132ce19f6d498e39c5c3773971aChong Zhang // Leave only discontinuities in the queue. 316632740c58119a132ce19f6d498e39c5c3773971aChong Zhang List<sp<ABuffer> >::iterator it = mBuffers.begin(); 317632740c58119a132ce19f6d498e39c5c3773971aChong Zhang while (it != mBuffers.end()) { 318632740c58119a132ce19f6d498e39c5c3773971aChong Zhang sp<ABuffer> oldBuffer = *it; 319632740c58119a132ce19f6d498e39c5c3773971aChong Zhang 320632740c58119a132ce19f6d498e39c5c3773971aChong Zhang int32_t oldDiscontinuityType; 321632740c58119a132ce19f6d498e39c5c3773971aChong Zhang if (!oldBuffer->meta()->findInt32( 322632740c58119a132ce19f6d498e39c5c3773971aChong Zhang "discontinuity", &oldDiscontinuityType)) { 323632740c58119a132ce19f6d498e39c5c3773971aChong Zhang it = mBuffers.erase(it); 324632740c58119a132ce19f6d498e39c5c3773971aChong Zhang continue; 325632740c58119a132ce19f6d498e39c5c3773971aChong Zhang } 3269a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 327632740c58119a132ce19f6d498e39c5c3773971aChong Zhang ++it; 3289a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber } 3290dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3300dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (List<DiscontinuitySegment>::iterator it2 = mDiscontinuitySegments.begin(); 3310dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih it2 != mDiscontinuitySegments.end(); 3320dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it2) { 3330dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *it2; 3340dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 3350dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 3360dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 33722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } 3389a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 33987e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mEOSResult = OK; 34087e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mLastQueuedTimeUs = 0; 34187e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mLatestEnqueuedMeta = NULL; 34287e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia 343fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia if (type == ATSParser::DISCONTINUITY_NONE) { 344fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia return; 345fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia } 346fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia 3470dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 3480dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3499a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber sp<ABuffer> buffer = new ABuffer(0); 3509a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); 3519a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setMessage("extra", extra); 35222fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 3532a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 3542a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 3552a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 3562a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 357cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 358cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 359cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 360cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 361cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 362cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 366cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 367a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = OK; 3687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (!mEnabled) { 3697c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return false; 3707c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 372cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 373cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 374cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 375cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 376cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 377cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 378cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 379a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhangbool AnotherPacketSource::hasDataBufferAvailable(status_t *finalResult) { 380a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang Mutex::Autolock autoLock(mLock); 381a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = OK; 3827c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (!mEnabled) { 3837c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return false; 3847c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 385a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang List<sp<ABuffer> >::iterator it; 386a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); it++) { 387a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int32_t discontinuity; 388a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang if (!(*it)->meta()->findInt32("discontinuity", &discontinuity)) { 389a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang return true; 390a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang } 391a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang } 392a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 393a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = mEOSResult; 394a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang return false; 395a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang} 396a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 397fcf044a9c5624395d24eb6181e67163ce169458bChong Zhangsize_t AnotherPacketSource::getAvailableBufferCount(status_t *finalResult) { 398fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang Mutex::Autolock autoLock(mLock); 399fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang 400fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang *finalResult = OK; 401fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang if (!mEnabled) { 402fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return 0; 403fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang } 404fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang if (!mBuffers.empty()) { 405fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return mBuffers.size(); 406fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang } 407fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang *finalResult = mEOSResult; 408fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return 0; 409fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang} 410fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang 411bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huberint64_t AnotherPacketSource::getBufferedDurationUs(status_t *finalResult) { 412bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber Mutex::Autolock autoLock(mLock); 413bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber *finalResult = mEOSResult; 414bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 4150ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih int64_t durationUs = 0; 4160dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (List<DiscontinuitySegment>::iterator it = mDiscontinuitySegments.begin(); 4170dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih it != mDiscontinuitySegments.end(); 4180dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it) { 4190dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih const DiscontinuitySegment &seg = *it; 4200dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // dequeued access units should be a subset of enqueued access units 4210dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(seg.maxEnqueTimeUs >= seg.mMaxDequeTimeUs); 4220dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih durationUs += (seg.mMaxEnqueTimeUs - seg.mMaxDequeTimeUs); 4238464d7decb34a3044e92b4085f1bbaafb51410e8Chong Zhang } 4240ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih 4250dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih return durationUs; 426bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber} 427bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *timeUs = 0; 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mBuffers.empty()) { 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 443b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonbool AnotherPacketSource::isFinished(int64_t duration) const { 444b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (duration > 0) { 445b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson int64_t diff = duration - mLastQueuedTimeUs; 446b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (diff < kNearEOSMarkUs && diff > -kNearEOSMarkUs) { 447b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson ALOGV("Detecting EOS due to near end"); 448b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return true; 449b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 450b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 451b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return (mEOSResult != OK); 452b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson} 453b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 454309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shihsp<AMessage> AnotherPacketSource::getLatestEnqueuedMeta() { 45569634506fbfe79605c37f337a8d6748cda4445b1Robert Shih Mutex::Autolock autoLock(mLock); 45669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih return mLatestEnqueuedMeta; 45769634506fbfe79605c37f337a8d6748cda4445b1Robert Shih} 45869634506fbfe79605c37f337a8d6748cda4445b1Robert Shih 459309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shihsp<AMessage> AnotherPacketSource::getLatestDequeuedMeta() { 460309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih Mutex::Autolock autoLock(mLock); 461309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih return mLatestDequeuedMeta; 462309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih} 463309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih 4647c8708046117e03c0d38006bdd9685139df3ac6bChong Zhangvoid AnotherPacketSource::enable(bool enable) { 4657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 4667c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mEnabled = enable; 4677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 4687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 469d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 470d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * returns the sample meta that's delayUs after queue head 471d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * (NULL if such sample is unavailable) 472d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 4737c8708046117e03c0d38006bdd9685139df3ac6bChong Zhangsp<AMessage> AnotherPacketSource::getMetaAfterLastDequeued(int64_t delayUs) { 4747c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 4757c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t firstUs = -1; 4767c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t lastUs = -1; 4777c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t durationUs = 0; 4787c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 4797c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 4807c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); ++it) { 4817c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 4827c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 4837c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 4847c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang durationUs += lastUs - firstUs; 4857c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang firstUs = -1; 4867c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang lastUs = -1; 4877c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 4887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 4897c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t timeUs; 4907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt64("timeUs", &timeUs)) { 4917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (firstUs < 0) { 4927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang firstUs = timeUs; 4937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 4947c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (lastUs < 0 || timeUs > lastUs) { 4957c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang lastUs = timeUs; 4967c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 4977c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (durationUs + (lastUs - firstUs) >= delayUs) { 4987c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return buffer->meta(); 4997c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 502d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return NULL; 5037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 5047c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 505d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 506d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * removes samples with time equal or after meta 507d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 508d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangvoid AnotherPacketSource::trimBuffersAfterMeta( 509d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang const sp<AMessage> &meta) { 510d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (meta == NULL) { 511d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGW("trimming with NULL meta, ignoring"); 512d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return; 513d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 5147c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 5157c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 5167c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (mBuffers.empty()) { 5177c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return; 5187c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5197c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 520d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime stopTime(meta); 52125f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang ALOGV("trimBuffersAfterMeta: discontinuitySeq %d, timeUs %lld", 522d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang stopTime.mSeq, (long long)stopTime.mTimeUs); 523d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 5247c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 5250dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih List<DiscontinuitySegment >::iterator it2; 5267c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<AMessage> newLatestEnqueuedMeta = NULL; 5277c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t newLastQueuedTimeUs = 0; 5280dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (it = mBuffers.begin(), it2 = mDiscontinuitySegments.begin(); it != mBuffers.end(); ++it) { 5297c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 5307c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 5317c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 5320dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(it2 != mDiscontinuitySegments.end()); 5330dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it2; 5347c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 5357c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 536d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 537d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime curTime(buffer->meta()); 538d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (!(curTime < stopTime)) { 539d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGV("trimming from %lld (inclusive) to end", 540d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang (long long)curTime.mTimeUs); 5417c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang break; 5427c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5437c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang newLatestEnqueuedMeta = buffer->meta(); 544d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang newLastQueuedTimeUs = curTime.mTimeUs; 5457c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5460dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 5477c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mBuffers.erase(it, mBuffers.end()); 5487c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestEnqueuedMeta = newLatestEnqueuedMeta; 5497c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = newLastQueuedTimeUs; 5500dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 5510dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *it2; 5520dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (newLatestEnqueuedMeta != NULL) { 5530dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.mMaxEnqueTimeUs = newLastQueuedTimeUs; 5540dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } else { 5550dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 5560dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 5570dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.erase(++it2, mDiscontinuitySegments.end()); 5587c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 5597c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 560d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 561d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * removes samples with time equal or before meta; 562d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * returns first sample left in the queue. 563d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * 564d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * (for AVC, if trim happens, the samples left will always start 565d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * at next IDR.) 566d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 567d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangsp<AMessage> AnotherPacketSource::trimBuffersBeforeMeta( 568d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang const sp<AMessage> &meta) { 569d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime startTime(meta); 57025f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang ALOGV("trimBuffersBeforeMeta: discontinuitySeq %d, timeUs %lld", 571d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang startTime.mSeq, (long long)startTime.mTimeUs); 572d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 573d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang sp<AMessage> firstMeta; 5740dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih int64_t firstTimeUs = -1; 5757c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 5767c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (mBuffers.empty()) { 5777c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return NULL; 5787c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5797c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 5807c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<MetaData> format; 5817c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool isAvc = false; 5827c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 5837c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 5847c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); ++it) { 5857c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 5867c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 5877c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 5880dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.erase(mDiscontinuitySegments.begin()); 5890dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 5907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang format = NULL; 5917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang isAvc = false; 5927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 5937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5947c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (format == NULL) { 5957c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<RefBase> object; 5967c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findObject("format", &object)) { 5977c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const char* mime; 5987c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang format = static_cast<MetaData*>(object.get()); 5997c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang isAvc = format != NULL 6007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang && format->findCString(kKeyMIMEType, &mime) 6017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC); 6027c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6047c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (isAvc && !IsIDR(buffer)) { 6057c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 6067c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 607d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 608d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime curTime(buffer->meta()); 609d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (startTime < curTime) { 610d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGV("trimming from beginning to %lld (not inclusive)", 611d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang (long long)curTime.mTimeUs); 612d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang firstMeta = buffer->meta(); 6130dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih firstTimeUs = curTime.mTimeUs; 6147c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang break; 6157c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6167c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6177c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mBuffers.erase(mBuffers.begin(), it); 6187c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestDequeuedMeta = NULL; 6190dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 6200dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 6210dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *mDiscontinuitySegments.begin(); 6220dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (firstTimeUs >= 0) { 6230dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.mMaxDequeTimeUs = firstTimeUs; 6240dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } else { 6250dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 6260dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 6270dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 628d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return firstMeta; 6297c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 6307c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 631cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 632