AnotherPacketSource.cpp revision bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0
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 94bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber int64_t timeUs; 95bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber CHECK(buffer->meta()->findInt64("time", &timeUs)); 96bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6); 97bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffers.push_back(buffer); 100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Hubervoid AnotherPacketSource::queueDiscontinuity() { 1042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber sp<ABuffer> buffer = new ABuffer(0); 1052a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber buffer->meta()->setInt32("discontinuity", true); 1062a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 1072a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber Mutex::Autolock autoLock(mLock); 108bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 1092a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffers.push_back(buffer); 1102a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mCondition.signal(); 1112a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 1122a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 113bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Hubervoid AnotherPacketSource::clear() { 114bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber Mutex::Autolock autoLock(mLock); 115bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mBuffers.clear(); 116bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mEOSResult = OK; 117bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber} 118bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK(result != OK); 121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mEOSResult = result; 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mCondition.signal(); 125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Mutex::Autolock autoLock(mLock); 129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mBuffers.empty()) { 130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *finalResult = mEOSResult; 134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 138