AnotherPacketSource.cpp revision 32f3cefa373cd55e63deda36ca9d07c7fe22eaaf
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 1082a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size()); 1092a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); 110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1112a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // hexdump(buffer->data(), buffer->size()); 112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1132a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber memcpy(mediaBuffer->data(), buffer->data(), buffer->size()); 1142a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber *out = mediaBuffer; 1152a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return OK; 1162a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 129bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber int64_t timeUs; 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 131bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6); 132bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1385bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid AnotherPacketSource::queueDiscontinuity( 13932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ATSParser::DiscontinuityType type, 14032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber const sp<AMessage> &extra) { 1412a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber sp<ABuffer> buffer = new ABuffer(0); 1425bc087c573c70c84c6a39946457590b42d392a33Andreas Huber buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); 14332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber buffer->meta()->setMessage("extra", extra); 14453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1452a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 146bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 14722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber#if 0 14822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (type == ATSParser::DISCONTINUITY_SEEK 14922fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber || type == ATSParser::DISCONTINUITY_FORMATCHANGE) { 15022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber // XXX Fix this: This will also clear any pending discontinuities, 15122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber // If there's a pending DISCONTINUITY_FORMATCHANGE and the new 15222fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber // discontinuity is "just" a DISCONTINUITY_SEEK, this will effectively 15322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber // downgrade the type of discontinuity received by the client. 15422fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 15522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber mBuffers.clear(); 15622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber mEOSResult = OK; 15722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } 15822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber#endif 15922fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber 1602a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 1612a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 1622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 1632a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 178cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *timeUs = 0; 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mBuffers.empty()) { 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 197cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 198