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 22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h> 24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h> 25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AString.h> 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h> 27d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/stagefright/foundation/avc_utils.h> 28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaBuffer.h> 29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h> 30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h> 31d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang#include <media/stagefright/Utils.h> 32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h> 33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 34b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h> 35b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross 36cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 38b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonconst int64_t kNearEOSMarkUs = 2000000ll; // 2 secs 39b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 40cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta) 416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber : mIsAudio(false), 423423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih mIsVideo(false), 437c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mEnabled(true), 4414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat(NULL), 45b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson mLastQueuedTimeUs(0), 4682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih mEstimatedBufferDurationUs(-1), 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( 1661889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase **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 2051889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase *mediaBuffer = new MediaBuffer(buffer); 2063d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MetaDataBase &bufmeta = mediaBuffer->meta_data(); 207fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 2083d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setInt64(kKeyTime, timeUs); 209fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar 21037746afe186ce04f0f6252900b79726040d89a0dTerry Heo int32_t isSync; 21137746afe186ce04f0f6252900b79726040d89a0dTerry Heo if (buffer->meta()->findInt32("isSync", &isSync)) { 2123d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setInt32(kKeyIsSyncFrame, isSync); 21337746afe186ce04f0f6252900b79726040d89a0dTerry Heo } 21437746afe186ce04f0f6252900b79726040d89a0dTerry Heo 215f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih sp<ABuffer> sei; 216f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih if (buffer->meta()->findBuffer("sei", &sei) && sei != NULL) { 2173d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setData(kKeySEI, 0, sei->data(), sei->size()); 218f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih } 219f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih 2203694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung sp<ABuffer> mpegUserData; 221d83d4f4a43616f38217591ba2d3f10d77fd4e748Robert Shih if (buffer->meta()->findBuffer("mpeg-user-data", &mpegUserData) && mpegUserData != NULL) { 2223d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setData( 2233694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung kKeyMpegUserData, 0, mpegUserData->data(), mpegUserData->size()); 2243694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung } 2253694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 2263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t cryptoMode; 2273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (buffer->meta()->findInt32("cryptoMode", &cryptoMode)) { 2283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t cryptoKey; 2293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<ABuffer> clearBytesBuffer, encBytesBuffer; 2303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang CHECK(buffer->meta()->findInt32("cryptoKey", &cryptoKey)); 2323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang CHECK(buffer->meta()->findBuffer("clearBytes", &clearBytesBuffer) 2333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && clearBytesBuffer != NULL); 2343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang CHECK(buffer->meta()->findBuffer("encBytes", &encBytesBuffer) 2353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && encBytesBuffer != NULL); 2363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2373d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setInt32(kKeyCryptoMode, cryptoMode); 2383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang uint8_t array[16] = {0}; 2403d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setData(kKeyCryptoIV, 0, array, 16); 2413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang array[0] = (uint8_t) (cryptoKey & 0xff); 2433d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setData(kKeyCryptoKey, 0, array, 16); 2443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2453d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setData(kKeyPlainSizes, 0, 2463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang clearBytesBuffer->data(), clearBytesBuffer->size()); 2473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2483d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen bufmeta.setData(kKeyEncryptedSizes, 0, 2493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang encBytesBuffer->data(), encBytesBuffer->size()); 2503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 2513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 253fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar *out = mediaBuffer; 254fd9b01b92a95f94d2d3a8b0ee5973756784fe05fLajos Molnar return OK; 255cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 256cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 257cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 258cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 259cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool AnotherPacketSource::wasFormatChange( 2616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int32_t discontinuityType) const { 2626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mIsAudio) { 2636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0; 2646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 2656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 2663423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih if (mIsVideo) { 2673423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0; 2683423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih } 2693423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 2703423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih return false; 2716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 2726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 273cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 274cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 275cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 276cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 277cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 278cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 279cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 280cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 281cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 282cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 28369634506fbfe79605c37f337a8d6748cda4445b1Robert Shih 2840ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih int32_t discontinuity; 2850dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (buffer->meta()->findInt32("discontinuity", &discontinuity)){ 2860dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ALOGV("queueing a discontinuity with queueAccessUnit"); 2870dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 2887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = 0ll; 2897c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mEOSResult = OK; 2907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestEnqueuedMeta = NULL; 2910dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 2920dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 2937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return; 2940ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih } 2950ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih 2967c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t lastQueuedTimeUs; 2977c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang CHECK(buffer->meta()->findInt64("timeUs", &lastQueuedTimeUs)); 2987c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = lastQueuedTimeUs; 2997c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang ALOGV("queueAccessUnit timeUs=%" PRIi64 " us (%.2f secs)", 3007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs, mLastQueuedTimeUs / 1E6); 3017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 3020dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 3030dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &tailSeg = *(--mDiscontinuitySegments.end()); 3040dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (lastQueuedTimeUs > tailSeg.mMaxEnqueTimeUs) { 3050dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih tailSeg.mMaxEnqueTimeUs = lastQueuedTimeUs; 3060dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 3070dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (tailSeg.mMaxDequeTimeUs == -1) { 3080dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih tailSeg.mMaxDequeTimeUs = lastQueuedTimeUs; 3090dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 3100dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 311309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih if (mLatestEnqueuedMeta == NULL) { 3122a66207f1136d60857759bccbaa5b7612f7070cfApurupa Pattapu mLatestEnqueuedMeta = buffer->meta()->dup(); 31369634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } else { 31469634506fbfe79605c37f337a8d6748cda4445b1Robert Shih int64_t latestTimeUs = 0; 31579971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu int64_t frameDeltaUs = 0; 31669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih CHECK(mLatestEnqueuedMeta->findInt64("timeUs", &latestTimeUs)); 31769634506fbfe79605c37f337a8d6748cda4445b1Robert Shih if (lastQueuedTimeUs > latestTimeUs) { 3182a66207f1136d60857759bccbaa5b7612f7070cfApurupa Pattapu mLatestEnqueuedMeta = buffer->meta()->dup(); 31979971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu frameDeltaUs = lastQueuedTimeUs - latestTimeUs; 32079971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu mLatestEnqueuedMeta->setInt64("durationUs", frameDeltaUs); 32179971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu } else if (!mLatestEnqueuedMeta->findInt64("durationUs", &frameDeltaUs)) { 32279971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu // For B frames 32379971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu frameDeltaUs = latestTimeUs - lastQueuedTimeUs; 32479971c747e62cad50359286f18dee0c4de5829daApurupa Pattapu mLatestEnqueuedMeta->setInt64("durationUs", frameDeltaUs); 32569634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } 32669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih } 327cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 328cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 32914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid AnotherPacketSource::clear() { 33014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber Mutex::Autolock autoLock(mLock); 33114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 33214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mBuffers.clear(); 33314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mEOSResult = OK; 3340dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3350dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.clear(); 3360dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 33714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 33814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFormat = NULL; 33969634506fbfe79605c37f337a8d6748cda4445b1Robert Shih mLatestEnqueuedMeta = NULL; 34082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih 34182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih mEstimatedBufferDurationUs = -1; 34214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 34314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 3445bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity( 34532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ATSParser::DiscontinuityType type, 346632740c58119a132ce19f6d498e39c5c3773971aChong Zhang const sp<AMessage> &extra, 347632740c58119a132ce19f6d498e39c5c3773971aChong Zhang bool discard) { 3482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 349bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 350632740c58119a132ce19f6d498e39c5c3773971aChong Zhang if (discard) { 351632740c58119a132ce19f6d498e39c5c3773971aChong Zhang // Leave only discontinuities in the queue. 352632740c58119a132ce19f6d498e39c5c3773971aChong Zhang List<sp<ABuffer> >::iterator it = mBuffers.begin(); 353632740c58119a132ce19f6d498e39c5c3773971aChong Zhang while (it != mBuffers.end()) { 354632740c58119a132ce19f6d498e39c5c3773971aChong Zhang sp<ABuffer> oldBuffer = *it; 355632740c58119a132ce19f6d498e39c5c3773971aChong Zhang 356632740c58119a132ce19f6d498e39c5c3773971aChong Zhang int32_t oldDiscontinuityType; 357632740c58119a132ce19f6d498e39c5c3773971aChong Zhang if (!oldBuffer->meta()->findInt32( 358632740c58119a132ce19f6d498e39c5c3773971aChong Zhang "discontinuity", &oldDiscontinuityType)) { 359632740c58119a132ce19f6d498e39c5c3773971aChong Zhang it = mBuffers.erase(it); 360632740c58119a132ce19f6d498e39c5c3773971aChong Zhang continue; 361632740c58119a132ce19f6d498e39c5c3773971aChong Zhang } 3629a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 363632740c58119a132ce19f6d498e39c5c3773971aChong Zhang ++it; 3649a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber } 3650dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3660dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (List<DiscontinuitySegment>::iterator it2 = mDiscontinuitySegments.begin(); 3670dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih it2 != mDiscontinuitySegments.end(); 3680dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it2) { 3690dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *it2; 3700dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 3710dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 3720dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 37322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } 3749a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 37587e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mEOSResult = OK; 37687e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mLastQueuedTimeUs = 0; 37787e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia mLatestEnqueuedMeta = NULL; 37887e8123d4d6058fbd50065a4fb18a0bdb6989b3fWei Jia 379fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia if (type == ATSParser::DISCONTINUITY_NONE) { 380fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia return; 381fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia } 382fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia 3830dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.push_back(DiscontinuitySegment()); 3840dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 3859a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber sp<ABuffer> buffer = new ABuffer(0); 3869a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); 3879a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setMessage("extra", extra); 38822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 3892a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 3902a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 3912a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 3922a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 393cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 394cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 395cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 396cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 398cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 399cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 400cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 401cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 402cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 403a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = OK; 4047c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (!mEnabled) { 4057c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return false; 4067c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 407cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 408cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 409cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 410cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 411cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 412cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 413cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 414cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 415a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhangbool AnotherPacketSource::hasDataBufferAvailable(status_t *finalResult) { 416a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang Mutex::Autolock autoLock(mLock); 417a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = OK; 4187c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (!mEnabled) { 4197c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return false; 4207c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 421a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang List<sp<ABuffer> >::iterator it; 422a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); it++) { 423a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int32_t discontinuity; 424a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang if (!(*it)->meta()->findInt32("discontinuity", &discontinuity)) { 425a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang return true; 426a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang } 427a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang } 428a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 429a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang *finalResult = mEOSResult; 430a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang return false; 431a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang} 432a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 433fcf044a9c5624395d24eb6181e67163ce169458bChong Zhangsize_t AnotherPacketSource::getAvailableBufferCount(status_t *finalResult) { 434fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang Mutex::Autolock autoLock(mLock); 435fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang 436fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang *finalResult = OK; 437fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang if (!mEnabled) { 438fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return 0; 439fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang } 440fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang if (!mBuffers.empty()) { 441fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return mBuffers.size(); 442fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang } 443fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang *finalResult = mEOSResult; 444fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang return 0; 445fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang} 446fcf044a9c5624395d24eb6181e67163ce169458bChong Zhang 447bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huberint64_t AnotherPacketSource::getBufferedDurationUs(status_t *finalResult) { 448bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber Mutex::Autolock autoLock(mLock); 449bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber *finalResult = mEOSResult; 450bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 4510ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih int64_t durationUs = 0; 4520dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (List<DiscontinuitySegment>::iterator it = mDiscontinuitySegments.begin(); 4530dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih it != mDiscontinuitySegments.end(); 4540dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it) { 4550dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih const DiscontinuitySegment &seg = *it; 4560dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // dequeued access units should be a subset of enqueued access units 4570dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(seg.maxEnqueTimeUs >= seg.mMaxDequeTimeUs); 4580dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih durationUs += (seg.mMaxEnqueTimeUs - seg.mMaxDequeTimeUs); 4598464d7decb34a3044e92b4085f1bbaafb51410e8Chong Zhang } 4600ad776d2e4c6b4968d9dcd9bf34b962366b312a9Robert Shih 4610dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih return durationUs; 462bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber} 463bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 46482e147049625a4cfdcb228a1de7efda594d446c9Robert Shihint64_t AnotherPacketSource::getEstimatedBufferDurationUs() { 46582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih Mutex::Autolock autoLock(mLock); 46682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih if (mEstimatedBufferDurationUs >= 0) { 46782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return mEstimatedBufferDurationUs; 46882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } 46982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih 47082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih SortedVector<int64_t> maxTimesUs; 47182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih List<sp<ABuffer> >::iterator it; 47282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih int64_t t1 = 0, t2 = 0; 47382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih for (it = mBuffers.begin(); it != mBuffers.end(); ++it) { 47482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih int64_t timeUs = 0; 47582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih const sp<ABuffer> &buffer = *it; 47682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih if (!buffer->meta()->findInt64("timeUs", &timeUs)) { 47782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih continue; 47882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } 47982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih maxTimesUs.add(timeUs); 48082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih while (maxTimesUs.size() > 2) { 48182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih maxTimesUs.removeAt(0); 48282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih t1 = maxTimesUs.itemAt(0); 48382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih t2 = maxTimesUs.itemAt(1); 48482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } 48582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } 48682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return mEstimatedBufferDurationUs = t2 - t1; 48782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih} 48882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih 489f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *timeUs = 0; 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mBuffers.empty()) { 495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 504b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönssonbool AnotherPacketSource::isFinished(int64_t duration) const { 505b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (duration > 0) { 506b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson int64_t diff = duration - mLastQueuedTimeUs; 507b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson if (diff < kNearEOSMarkUs && diff > -kNearEOSMarkUs) { 508b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson ALOGV("Detecting EOS due to near end"); 509b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return true; 510b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 511b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 512b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson return (mEOSResult != OK); 513b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson} 514b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 515309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shihsp<AMessage> AnotherPacketSource::getLatestEnqueuedMeta() { 51669634506fbfe79605c37f337a8d6748cda4445b1Robert Shih Mutex::Autolock autoLock(mLock); 51769634506fbfe79605c37f337a8d6748cda4445b1Robert Shih return mLatestEnqueuedMeta; 51869634506fbfe79605c37f337a8d6748cda4445b1Robert Shih} 51969634506fbfe79605c37f337a8d6748cda4445b1Robert Shih 520309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shihsp<AMessage> AnotherPacketSource::getLatestDequeuedMeta() { 521309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih Mutex::Autolock autoLock(mLock); 522309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih return mLatestDequeuedMeta; 523309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih} 524309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih 5257c8708046117e03c0d38006bdd9685139df3ac6bChong Zhangvoid AnotherPacketSource::enable(bool enable) { 5267c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 5277c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mEnabled = enable; 5287c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 5297c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 530d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 531d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * returns the sample meta that's delayUs after queue head 532d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * (NULL if such sample is unavailable) 533d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 5347c8708046117e03c0d38006bdd9685139df3ac6bChong Zhangsp<AMessage> AnotherPacketSource::getMetaAfterLastDequeued(int64_t delayUs) { 5357c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 5367c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t firstUs = -1; 5377c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t lastUs = -1; 5387c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t durationUs = 0; 5397c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 5407c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 5417c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); ++it) { 5427c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 5437c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 5447c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 5457c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang durationUs += lastUs - firstUs; 5467c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang firstUs = -1; 5477c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang lastUs = -1; 5487c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 5497c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5507c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t timeUs; 5517c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt64("timeUs", &timeUs)) { 5527c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (firstUs < 0) { 5537c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang firstUs = timeUs; 5547c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5557c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (lastUs < 0 || timeUs > lastUs) { 5567c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang lastUs = timeUs; 5577c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5587c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (durationUs + (lastUs - firstUs) >= delayUs) { 5597c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return buffer->meta(); 5607c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5617c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5627c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 563d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return NULL; 5647c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 5657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 566d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 567d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * removes samples with time equal or after meta 568d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 569d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangvoid AnotherPacketSource::trimBuffersAfterMeta( 570d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang const sp<AMessage> &meta) { 571d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (meta == NULL) { 572d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGW("trimming with NULL meta, ignoring"); 573d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return; 574d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 5757c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 5767c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 5777c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (mBuffers.empty()) { 5787c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return; 5797c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 5807c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 581d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime stopTime(meta); 58225f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang ALOGV("trimBuffersAfterMeta: discontinuitySeq %d, timeUs %lld", 583d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang stopTime.mSeq, (long long)stopTime.mTimeUs); 584d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 5857c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 5860dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih List<DiscontinuitySegment >::iterator it2; 5877c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<AMessage> newLatestEnqueuedMeta = NULL; 5887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t newLastQueuedTimeUs = 0; 5890dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih for (it = mBuffers.begin(), it2 = mDiscontinuitySegments.begin(); it != mBuffers.end(); ++it) { 5907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 5917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 5927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 5930dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(it2 != mDiscontinuitySegments.end()); 5940dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih ++it2; 5957c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 5967c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 597d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 598d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime curTime(buffer->meta()); 599d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (!(curTime < stopTime)) { 600d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGV("trimming from %lld (inclusive) to end", 601d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang (long long)curTime.mTimeUs); 6027c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang break; 6037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6047c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang newLatestEnqueuedMeta = buffer->meta(); 605d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang newLastQueuedTimeUs = curTime.mTimeUs; 6067c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6070dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 6087c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mBuffers.erase(it, mBuffers.end()); 6097c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestEnqueuedMeta = newLatestEnqueuedMeta; 6107c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLastQueuedTimeUs = newLastQueuedTimeUs; 6110dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 6120dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *it2; 6130dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (newLatestEnqueuedMeta != NULL) { 6140dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.mMaxEnqueTimeUs = newLastQueuedTimeUs; 6150dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } else { 6160dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 6170dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 6180dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.erase(++it2, mDiscontinuitySegments.end()); 6197c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 6207c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 621d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang/* 622d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * removes samples with time equal or before meta; 623d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * returns first sample left in the queue. 624d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * 625d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * (for AVC, if trim happens, the samples left will always start 626d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang * at next IDR.) 627d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang */ 628d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangsp<AMessage> AnotherPacketSource::trimBuffersBeforeMeta( 629d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang const sp<AMessage> &meta) { 630d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime startTime(meta); 63125f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang ALOGV("trimBuffersBeforeMeta: discontinuitySeq %d, timeUs %lld", 632d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang startTime.mSeq, (long long)startTime.mTimeUs); 633d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 634d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang sp<AMessage> firstMeta; 6350dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih int64_t firstTimeUs = -1; 6367c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang Mutex::Autolock autoLock(mLock); 6377c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (mBuffers.empty()) { 6387c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang return NULL; 6397c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6407c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 6417c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<MetaData> format; 6427c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool isAvc = false; 6437c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 6447c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang List<sp<ABuffer> >::iterator it; 6457c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang for (it = mBuffers.begin(); it != mBuffers.end(); ++it) { 6467c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const sp<ABuffer> &buffer = *it; 6477c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t discontinuity; 6487c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 6490dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih mDiscontinuitySegments.erase(mDiscontinuitySegments.begin()); 6500dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 6517c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang format = NULL; 6527c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang isAvc = false; 6537c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 6547c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6557c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (format == NULL) { 6567c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<RefBase> object; 6577c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang if (buffer->meta()->findObject("format", &object)) { 6587c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const char* mime; 6597c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang format = static_cast<MetaData*>(object.get()); 6607c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang isAvc = format != NULL 6617c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang && format->findCString(kKeyMIMEType, &mime) 6627c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC); 6637c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6647c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 665d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang if (isAvc && !IsIDR(buffer->data(), buffer->size())) { 6667c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang continue; 6677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 668d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 669d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime curTime(buffer->meta()); 670d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (startTime < curTime) { 671d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ALOGV("trimming from beginning to %lld (not inclusive)", 672d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang (long long)curTime.mTimeUs); 673d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang firstMeta = buffer->meta(); 6740dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih firstTimeUs = curTime.mTimeUs; 6757c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang break; 6767c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6777c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang } 6787c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mBuffers.erase(mBuffers.begin(), it); 6797c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang mLatestDequeuedMeta = NULL; 6800dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 6810dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih // CHECK(!mDiscontinuitySegments.empty()); 6820dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih DiscontinuitySegment &seg = *mDiscontinuitySegments.begin(); 6830dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih if (firstTimeUs >= 0) { 6840dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.mMaxDequeTimeUs = firstTimeUs; 6850dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } else { 6860dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih seg.clear(); 6870dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih } 6880dd229bb306df68b88e7419b3cc11fc6175be1daRobert Shih 689d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang return firstMeta; 6907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang} 6917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 692cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 693