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 2193694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung sp<ABuffer> mpegUserData; 2203694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung if (buffer->meta()->findBuffer("mpegUserData", &mpegUserData) && mpegUserData != NULL) { 2213694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung mediaBuffer->meta_data()->setData( 2223694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung kKeyMpegUserData, 0, mpegUserData->data(), mpegUserData->size()); 2233694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung } 2243694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 225fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar *out = mediaBuffer; 226fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return OK; 227cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool AnotherPacketSource::wasFormatChange( 2336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int32_t discontinuityType) const { 2346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mIsAudio) { 2356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0; 2366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 2376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 2383423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih if (mIsVideo) { 2393423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0; 2403423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih } 2413423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 2423423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih return false; 2436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 2446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 245cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 246cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 247cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 248cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 249cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 250cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 251cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 252cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 253cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 254cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 25569634506fbfe79605c37f337a8d6748cda4445b1Robert Shih 2560ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih int32_t discontinuity; 2570dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (buffer->meta()->findInt32("discontinuity", &discontinuity)){ 2580dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ALOGV("queueing a discontinuity with queueAccessUnit"); 2590dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 2607c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = 0ll; 2617c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mEOSResult = OK; 2627c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestEnqueuedMeta = NULL; 2630dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 2640dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 2657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return; 2660ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih } 2670ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih 2687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t lastQueuedTimeUs; 2697c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang CHECK(buffer->meta()->findInt64("timeUs", &lastQueuedTimeUs)); 2707c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = lastQueuedTimeUs; 2717c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang ALOGV("queueAccessUnit timeUs=%" PRIi64 " us (%.2f secs)", 2727c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs, mLastQueuedTimeUs / 1E6); 2737c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 2740dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 2750dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &tailSeg = *(--mDiscontinuitySegments.end()); 2760dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (lastQueuedTimeUs > tailSeg.mMaxEnqueTimeUs) { 2770dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih tailSeg.mMaxEnqueTimeUs = lastQueuedTimeUs; 2780dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 2790dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (tailSeg.mMaxDequeTimeUs == -1) { 2800dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih tailSeg.mMaxDequeTimeUs = lastQueuedTimeUs; 2810dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 2820dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 283309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih if (mLatestEnqueuedMeta == NULL) { 2842a66207f1136d60857759bccbaa5b7612f7070cfApurupa Pattapu mLatestEnqueuedMeta = buffer->meta()->dup(); 28569634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } else { 28669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih int64_t latestTimeUs = 0; 28779971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu int64_t frameDeltaUs = 0; 28869634506fbfe79605c37f337a8d6748cda4445b1Robert Shih CHECK(mLatestEnqueuedMeta->findInt64("timeUs", &latestTimeUs)); 28969634506fbfe79605c37f337a8d6748cda4445b1Robert Shih if (lastQueuedTimeUs > latestTimeUs) { 2902a66207f1136d60857759bccbaa5b7612f7070cfApurupa Pattapu mLatestEnqueuedMeta = buffer->meta()->dup(); 29179971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu frameDeltaUs = lastQueuedTimeUs - latestTimeUs; 29279971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu mLatestEnqueuedMeta->setInt64("durationUs", frameDeltaUs); 29379971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu } else if (!mLatestEnqueuedMeta->findInt64("durationUs", &frameDeltaUs)) { 29479971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu // For B frames 29579971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu frameDeltaUs = latestTimeUs - lastQueuedTimeUs; 29679971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu mLatestEnqueuedMeta->setInt64("durationUs", frameDeltaUs); 29769634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } 29869634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } 299cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 300cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 30114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid AnotherPacketSource::clear() { 30214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber Mutex::Autolock autoLock(mLock); 30314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 30414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mBuffers.clear(); 30514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mEOSResult = OK; 3060dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3070dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.clear(); 3080dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 30914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 31014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat = NULL; 31169634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLatestEnqueuedMeta = NULL; 31214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 31314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 3145bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity( 31532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ATSParser::DiscontinuityType type, 316632740c58119a132ce19f6d498e39c5c3773971aChong Zhang const sp<AMessage> &extra, 317632740c58119a132ce19f6d498e39c5c3773971aChong Zhang bool discard) { 3182a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 319bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 320632740c58119a132ce19f6d498e39c5c3773971aChong Zhang if (discard) { 321632740c58119a132ce19f6d498e39c5c3773971aChong Zhang // Leave only discontinuities in the queue. 322632740c58119a132ce19f6d498e39c5c3773971aChong Zhang List<sp<ABuffer> >::iterator it = mBuffers.begin(); 323632740c58119a132ce19f6d498e39c5c3773971aChong Zhang while (it != mBuffers.end()) { 324632740c58119a132ce19f6d498e39c5c3773971aChong Zhang sp<ABuffer> oldBuffer = *it; 325632740c58119a132ce19f6d498e39c5c3773971aChong Zhang 326632740c58119a132ce19f6d498e39c5c3773971aChong Zhang int32_t oldDiscontinuityType; 327632740c58119a132ce19f6d498e39c5c3773971aChong Zhang if (!oldBuffer->meta()->findInt32( 328632740c58119a132ce19f6d498e39c5c3773971aChong Zhang "discontinuity", &oldDiscontinuityType)) { 329632740c58119a132ce19f6d498e39c5c3773971aChong Zhang it = mBuffers.erase(it); 330632740c58119a132ce19f6d498e39c5c3773971aChong Zhang continue; 331632740c58119a132ce19f6d498e39c5c3773971aChong Zhang } 3329a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 333632740c58119a132ce19f6d498e39c5c3773971aChong Zhang ++it; 3349a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber } 3350dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3360dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (List<DiscontinuitySegment>::iterator it2 = mDiscontinuitySegments.begin(); 3370dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih it2 != mDiscontinuitySegments.end(); 3380dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it2) { 3390dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *it2; 3400dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 3410dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 3420dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 34322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } 3449a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 34587e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mEOSResult = OK; 34687e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mLastQueuedTimeUs = 0; 34787e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mLatestEnqueuedMeta = NULL; 34887e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia 349fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia if (type == ATSParser::DISCONTINUITY_NONE) { 350fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia return; 351fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia } 352fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia 3530dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 3540dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3559a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber sp<ABuffer> buffer = new ABuffer(0); 3569a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); 3579a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setMessage("extra", extra); 35822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 3592a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 3602a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 3612a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 3622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 366cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 367cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 372cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 373a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = OK; 3747c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (!mEnabled) { 3757c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return false; 3767c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 377cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 378cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 379cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 380cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 381cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 382cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 383cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 384cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 385a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhangbool AnotherPacketSource::hasDataBufferAvailable(status_t *finalResult) { 386a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang Mutex::Autolock autoLock(mLock); 387a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = OK; 3887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (!mEnabled) { 3897c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return false; 3907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 391a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang List<sp<ABuffer> >::iterator it; 392a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); it++) { 393a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int32_t discontinuity; 394a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang if (!(*it)->meta()->findInt32("discontinuity", &discontinuity)) { 395a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang return true; 396a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang } 397a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang } 398a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 399a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = mEOSResult; 400a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang return false; 401a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang} 402a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 403fcf044a9c5624395d24eb6181e67163ce169458bChong Zhangsize_t AnotherPacketSource::getAvailableBufferCount(status_t *finalResult) { 404fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang Mutex::Autolock autoLock(mLock); 405fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang 406fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang *finalResult = OK; 407fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang if (!mEnabled) { 408fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return 0; 409fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang } 410fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang if (!mBuffers.empty()) { 411fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return mBuffers.size(); 412fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang } 413fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang *finalResult = mEOSResult; 414fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return 0; 415fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang} 416fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang 417bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huberint64_t AnotherPacketSource::getBufferedDurationUs(status_t *finalResult) { 418bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber Mutex::Autolock autoLock(mLock); 419bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber *finalResult = mEOSResult; 420bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 4210ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih int64_t durationUs = 0; 4220dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (List<DiscontinuitySegment>::iterator it = mDiscontinuitySegments.begin(); 4230dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih it != mDiscontinuitySegments.end(); 4240dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it) { 4250dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih const DiscontinuitySegment &seg = *it; 4260dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // dequeued access units should be a subset of enqueued access units 4270dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(seg.maxEnqueTimeUs >= seg.mMaxDequeTimeUs); 4280dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih durationUs += (seg.mMaxEnqueTimeUs - seg.mMaxDequeTimeUs); 4298464d7decb34a3044e92b4085f1bbaafb51410e8Chong Zhang } 4300ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih 4310dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih return durationUs; 432bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber} 433bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *timeUs = 0; 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mBuffers.empty()) { 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 449b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonbool AnotherPacketSource::isFinished(int64_t duration) const { 450b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (duration > 0) { 451b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson int64_t diff = duration - mLastQueuedTimeUs; 452b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (diff < kNearEOSMarkUs && diff > -kNearEOSMarkUs) { 453b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson ALOGV("Detecting EOS due to near end"); 454b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return true; 455b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 456b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 457b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return (mEOSResult != OK); 458b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson} 459b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 460309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shihsp<AMessage> AnotherPacketSource::getLatestEnqueuedMeta() { 46169634506fbfe79605c37f337a8d6748cda4445b1Robert Shih Mutex::Autolock autoLock(mLock); 46269634506fbfe79605c37f337a8d6748cda4445b1Robert Shih return mLatestEnqueuedMeta; 46369634506fbfe79605c37f337a8d6748cda4445b1Robert Shih} 46469634506fbfe79605c37f337a8d6748cda4445b1Robert Shih 465309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shihsp<AMessage> AnotherPacketSource::getLatestDequeuedMeta() { 466309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih Mutex::Autolock autoLock(mLock); 467309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih return mLatestDequeuedMeta; 468309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih} 469309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih 4707c8708046117e03c0d38006bdd9685139df3ac6bChong Zhangvoid AnotherPacketSource::enable(bool enable) { 4717c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 4727c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mEnabled = enable; 4737c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 4747c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 475d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 476d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * returns the sample meta that's delayUs after queue head 477d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * (NULL if such sample is unavailable) 478d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 4797c8708046117e03c0d38006bdd9685139df3ac6bChong Zhangsp<AMessage> AnotherPacketSource::getMetaAfterLastDequeued(int64_t delayUs) { 4807c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 4817c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t firstUs = -1; 4827c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t lastUs = -1; 4837c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t durationUs = 0; 4847c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 4857c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 4867c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); ++it) { 4877c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 4887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 4897c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 4907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang durationUs += lastUs - firstUs; 4917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang firstUs = -1; 4927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang lastUs = -1; 4937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 4947c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 4957c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t timeUs; 4967c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt64("timeUs", &timeUs)) { 4977c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (firstUs < 0) { 4987c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang firstUs = timeUs; 4997c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (lastUs < 0 || timeUs > lastUs) { 5017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang lastUs = timeUs; 5027c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (durationUs + (lastUs - firstUs) >= delayUs) { 5047c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return buffer->meta(); 5057c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5067c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5077c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 508d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return NULL; 5097c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 5107c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 511d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 512d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * removes samples with time equal or after meta 513d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 514d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangvoid AnotherPacketSource::trimBuffersAfterMeta( 515d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang const sp<AMessage> &meta) { 516d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (meta == NULL) { 517d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGW("trimming with NULL meta, ignoring"); 518d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return; 519d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 5207c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 5217c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 5227c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (mBuffers.empty()) { 5237c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return; 5247c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5257c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 526d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime stopTime(meta); 52725f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang ALOGV("trimBuffersAfterMeta: discontinuitySeq %d, timeUs %lld", 528d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang stopTime.mSeq, (long long)stopTime.mTimeUs); 529d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 5307c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 5310dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih List<DiscontinuitySegment >::iterator it2; 5327c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<AMessage> newLatestEnqueuedMeta = NULL; 5337c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t newLastQueuedTimeUs = 0; 5340dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (it = mBuffers.begin(), it2 = mDiscontinuitySegments.begin(); it != mBuffers.end(); ++it) { 5357c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 5367c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 5377c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 5380dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(it2 != mDiscontinuitySegments.end()); 5390dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it2; 5407c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 5417c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 542d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 543d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime curTime(buffer->meta()); 544d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (!(curTime < stopTime)) { 545d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGV("trimming from %lld (inclusive) to end", 546d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang (long long)curTime.mTimeUs); 5477c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang break; 5487c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5497c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang newLatestEnqueuedMeta = buffer->meta(); 550d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang newLastQueuedTimeUs = curTime.mTimeUs; 5517c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5520dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 5537c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mBuffers.erase(it, mBuffers.end()); 5547c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestEnqueuedMeta = newLatestEnqueuedMeta; 5557c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = newLastQueuedTimeUs; 5560dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 5570dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *it2; 5580dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (newLatestEnqueuedMeta != NULL) { 5590dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.mMaxEnqueTimeUs = newLastQueuedTimeUs; 5600dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } else { 5610dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 5620dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 5630dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.erase(++it2, mDiscontinuitySegments.end()); 5647c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 5657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 566d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 567d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * removes samples with time equal or before meta; 568d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * returns first sample left in the queue. 569d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * 570d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * (for AVC, if trim happens, the samples left will always start 571d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * at next IDR.) 572d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 573d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangsp<AMessage> AnotherPacketSource::trimBuffersBeforeMeta( 574d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang const sp<AMessage> &meta) { 575d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime startTime(meta); 57625f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang ALOGV("trimBuffersBeforeMeta: discontinuitySeq %d, timeUs %lld", 577d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang startTime.mSeq, (long long)startTime.mTimeUs); 578d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 579d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang sp<AMessage> firstMeta; 5800dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih int64_t firstTimeUs = -1; 5817c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 5827c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (mBuffers.empty()) { 5837c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return NULL; 5847c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5857c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 5867c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<MetaData> format; 5877c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool isAvc = false; 5887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 5897c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 5907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); ++it) { 5917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 5927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 5937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 5940dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.erase(mDiscontinuitySegments.begin()); 5950dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 5967c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang format = NULL; 5977c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang isAvc = false; 5987c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 5997c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (format == NULL) { 6017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<RefBase> object; 6027c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findObject("format", &object)) { 6037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const char* mime; 6047c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang format = static_cast<MetaData*>(object.get()); 6057c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang isAvc = format != NULL 6067c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang && format->findCString(kKeyMIMEType, &mime) 6077c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC); 6087c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6097c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6107c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (isAvc && !IsIDR(buffer)) { 6117c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 6127c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 613d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 614d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime curTime(buffer->meta()); 615d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (startTime < curTime) { 616d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGV("trimming from beginning to %lld (not inclusive)", 617d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang (long long)curTime.mTimeUs); 618d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang firstMeta = buffer->meta(); 6190dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih firstTimeUs = curTime.mTimeUs; 6207c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang break; 6217c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6227c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6237c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mBuffers.erase(mBuffers.begin(), it); 6247c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestDequeuedMeta = NULL; 6250dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 6260dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 6270dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *mDiscontinuitySegments.begin(); 6280dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (firstTimeUs >= 0) { 6290dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.mMaxDequeTimeUs = firstTimeUs; 6300dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } else { 6310dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 6320dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 6330dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 634d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return firstMeta; 6357c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 6367c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 637cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 638