AnotherPacketSource.cpp revision 2a4d22d79e927f2245537921e10fc5fda1c47a29
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 51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatus_t AnotherPacketSource::read( 52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber MediaBuffer **out, const ReadOptions *) { 53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *out = NULL; 54cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.wait(mLock); 58cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 59cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const sp<ABuffer> buffer = *mBuffers.begin(); 622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.erase(mBuffers.begin()); 63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 642a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber int32_t discontinuity; 652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber if (buffer->meta()->findInt32("discontinuity", &discontinuity) 662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber && discontinuity) { 672a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return INFO_DISCONTINUITY; 682a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } else { 692a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber uint64_t timeUs; 702a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber CHECK(buffer->meta()->findInt64( 712a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber "time", (int64_t *)&timeUs)); 72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 732a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size()); 742a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); 75cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 762a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // hexdump(buffer->data(), buffer->size()); 77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 782a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber memcpy(mediaBuffer->data(), buffer->data(), buffer->size()); 792a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber *out = mediaBuffer; 802a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber return OK; 812a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 82cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 83cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 84cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return mEOSResult; 85cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 86cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 87cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 88cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber int32_t damaged; 89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 91cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return; 92cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 94cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 95cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 96cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 97cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 992a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Hubervoid AnotherPacketSource::queueDiscontinuity() { 1002a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber sp<ABuffer> buffer = new ABuffer(0); 1012a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber buffer->meta()->setInt32("discontinuity", true); 1022a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 1042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 1052a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 1062a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 1072a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 127