AnotherPacketSource.cpp revision 9a442c1b9a051edc6d4ceb0daad2d0a8433e7b0b
1cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber/* 2cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 4cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * you may not use this file except in compliance with the License. 6cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * You may obtain a copy of the License at 7cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 8cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 10cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Unless required by applicable law or agreed to in writing, software 11cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * See the License for the specific language governing permissions and 14cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * limitations under the License. 15cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber */ 16cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 17cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "AnotherPacketSource.h" 18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h> 21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h> 22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AString.h> 23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h> 24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaBuffer.h> 25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h> 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h> 27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h> 28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta) 32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber : mFormat(meta), 33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult(OK) { 34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 365bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::setFormat(const sp<MetaData> &meta) { 375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(mFormat == NULL); 385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat = meta; 395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::~AnotherPacketSource() { 42cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::start(MetaData *params) { 45cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 46cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 47cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 48cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::stop() { 49cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() { 53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mFormat; 54cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) { 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->clear(); 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCondition.wait(mLock); 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mBuffers.empty()) { 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *buffer = *mBuffers.begin(); 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers.erase(mBuffers.begin()); 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t discontinuity; 695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) { 705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (discontinuity == ATSParser::DISCONTINUITY_FORMATCHANGE) { 725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat.clear(); 735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INFO_DISCONTINUITY; 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult; 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 84cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read( 85cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber MediaBuffer **out, const ReadOptions *) { 86cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *out = NULL; 87cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 88cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.wait(mLock); 91cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 92cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 94cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const sp<ABuffer> buffer = *mBuffers.begin(); 952a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.erase(mBuffers.begin()); 96cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 972a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber int32_t discontinuity; 985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (discontinuity == ATSParser::DISCONTINUITY_FORMATCHANGE) { 1005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mFormat.clear(); 1015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return INFO_DISCONTINUITY; 1042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } else { 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 108f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber MediaBuffer *mediaBuffer = new MediaBuffer(buffer); 109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 110f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); 111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1122a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber *out = mediaBuffer; 1132a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return OK; 1142a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 127bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber int64_t timeUs; 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 129bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6); 130bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1365bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity( 13732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ATSParser::DiscontinuityType type, 13832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber const sp<AMessage> &extra) { 1392a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 140bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 1419a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber // Leave only discontinuities in the queue. 1429a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber List<sp<ABuffer> >::iterator it = mBuffers.begin(); 1439a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber while (it != mBuffers.end()) { 1449a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber sp<ABuffer> oldBuffer = *it; 1459a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 1469a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber int32_t oldDiscontinuityType; 1479a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber if (!oldBuffer->meta()->findInt32( 1489a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber "discontinuity", &oldDiscontinuityType)) { 1499a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber it = mBuffers.erase(it); 1509a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber continue; 1519a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber } 15222fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 1539a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber ++it; 15422fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } 1559a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 1569a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber mEOSResult = OK; 1579a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 1589a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber sp<ABuffer> buffer = new ABuffer(0); 1599a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); 1609a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber buffer->meta()->setMessage("extra", extra); 16122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 1622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 1632a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 1642a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 1652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 178cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *timeUs = 0; 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mBuffers.empty()) { 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 200