AnotherPacketSource.cpp revision f933441648ef6a71dee783d733aac17b9508b452
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 36cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberAnotherPacketSource::~AnotherPacketSource() { 37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 38cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 39cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::start(MetaData *params) { 40cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 42cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::stop() { 44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return OK; 45cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 46cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 47cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() { 48cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mFormat; 49cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) { 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->clear(); 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCondition.wait(mLock); 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mBuffers.empty()) { 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *buffer = *mBuffers.begin(); 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers.erase(mBuffers.begin()); 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t discontinuity; 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity) 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && discontinuity) { 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->clear(); 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INFO_DISCONTINUITY; 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult; 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read( 78cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber MediaBuffer **out, const ReadOptions *) { 79cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *out = NULL; 80cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 81cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 82cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 83cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.wait(mLock); 84cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 85cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 86cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 87cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const sp<ABuffer> buffer = *mBuffers.begin(); 882a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.erase(mBuffers.begin()); 89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 902a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber int32_t discontinuity; 912a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber if (buffer->meta()->findInt32("discontinuity", &discontinuity) 922a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber && discontinuity) { 932a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return INFO_DISCONTINUITY; 942a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } else { 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 97cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 982a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size()); 992a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); 100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1012a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // hexdump(buffer->data(), buffer->size()); 102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber memcpy(mediaBuffer->data(), buffer->data(), buffer->size()); 1042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber *out = mediaBuffer; 1052a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return OK; 1062a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 119bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber int64_t timeUs; 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 121bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6); 122bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1282a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Hubervoid AnotherPacketSource::queueDiscontinuity() { 1292a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber sp<ABuffer> buffer = new ABuffer(0); 1302a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber buffer->meta()->setInt32("discontinuity", true); 1312a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 1322a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 133bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 1342a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 1352a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 1362a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 1372a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 138bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Hubervoid AnotherPacketSource::clear() { 139bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber Mutex::Autolock autoLock(mLock); 140bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mBuffers.clear(); 141bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mEOSResult = OK; 142bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber} 143bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 144cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 150cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 152cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 154cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 159cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *timeUs = 0; 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex::Autolock autoLock(mLock); 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mBuffers.empty()) { 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 178