1a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber/* 2a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * 4a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * you may not use this file except in compliance with the License. 6a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * You may obtain a copy of the License at 7a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * 8a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * 10a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * Unless required by applicable law or agreed to in writing, software 11a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * See the License for the specific language governing permissions and 14a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber * limitations under the License. 15a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber */ 16a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 17a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include "AnotherPacketSource.h" 18a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 19a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 20a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/ADebug.h> 21a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/AMessage.h> 22a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/AString.h> 23a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/foundation/hexdump.h> 24a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/MediaBuffer.h> 25a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/MediaDefs.h> 26a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <media/stagefright/MetaData.h> 27a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber#include <utils/Vector.h> 28a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 29a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Hubernamespace android { 30a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 31a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas HuberAnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta) 3266a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber : mIsAudio(false), 3366a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber mFormat(meta), 34a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber mEOSResult(OK) { 3566a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber const char *mime; 3666a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 3766a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber 3866a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber if (!strncasecmp("audio/", mime, 6)) { 3966a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber mIsAudio = true; 4066a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber } else { 4166a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber CHECK(!strncasecmp("video/", mime, 6)); 4266a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber } 43a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 44a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 4554e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Hubervoid AnotherPacketSource::setFormat(const sp<MetaData> &meta) { 4654e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber CHECK(mFormat == NULL); 4754e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber mFormat = meta; 4854e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber} 4954e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber 50a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas HuberAnotherPacketSource::~AnotherPacketSource() { 51a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 52a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 53a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huberstatus_t AnotherPacketSource::start(MetaData *params) { 54a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber return OK; 55a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 56a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 57a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huberstatus_t AnotherPacketSource::stop() { 58a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber return OK; 59a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 60a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 61a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Hubersp<MetaData> AnotherPacketSource::getFormat() { 62a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber return mFormat; 63a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 64a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 65a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberstatus_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) { 66a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber buffer->clear(); 67a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 68a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber Mutex::Autolock autoLock(mLock); 69a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber while (mEOSResult == OK && mBuffers.empty()) { 70a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber mCondition.wait(mLock); 71a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber } 72a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 73a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber if (!mBuffers.empty()) { 74a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber *buffer = *mBuffers.begin(); 75a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber mBuffers.erase(mBuffers.begin()); 76a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 77a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber int32_t discontinuity; 7854e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) { 7966a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber if (wasFormatChange(discontinuity)) { 8054e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber mFormat.clear(); 8154e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber } 8254e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber 83a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber return INFO_DISCONTINUITY; 84a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber } 85a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 86a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber return OK; 87a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber } 88a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 89a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber return mEOSResult; 90a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber} 91a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 92a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huberstatus_t AnotherPacketSource::read( 93a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber MediaBuffer **out, const ReadOptions *) { 94a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber *out = NULL; 95a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 96a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber Mutex::Autolock autoLock(mLock); 97a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber while (mEOSResult == OK && mBuffers.empty()) { 98a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber mCondition.wait(mLock); 99a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber } 100a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 101a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber if (!mBuffers.empty()) { 102a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber const sp<ABuffer> buffer = *mBuffers.begin(); 1034c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber mBuffers.erase(mBuffers.begin()); 104a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 1054c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber int32_t discontinuity; 10654e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber if (buffer->meta()->findInt32("discontinuity", &discontinuity)) { 10766a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber if (wasFormatChange(discontinuity)) { 10854e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber mFormat.clear(); 10954e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber } 11054e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber 1114c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber return INFO_DISCONTINUITY; 1124c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber } else { 113a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber int64_t timeUs; 114a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 115a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 116e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber MediaBuffer *mediaBuffer = new MediaBuffer(buffer); 117a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 118e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); 119a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 1204c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber *out = mediaBuffer; 1214c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber return OK; 1224c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber } 123a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber } 124a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 125a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber return mEOSResult; 126a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 127a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 12866a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huberbool AnotherPacketSource::wasFormatChange( 12966a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber int32_t discontinuityType) const { 13066a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber if (mIsAudio) { 13166a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0; 13266a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber } 13366a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber 13466a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0; 13566a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber} 13666a051af37c3d7a610802c0c58906dc0faefa6beAndreas Huber 137a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Hubervoid AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { 138a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber int32_t damaged; 139a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { 140a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber // LOG(VERBOSE) << "discarding damaged AU"; 141a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber return; 142a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber } 143a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 14454d09724e3ea2af4e08dff47d7ade92a95784127Andreas Huber int64_t timeUs; 145a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 14654d09724e3ea2af4e08dff47d7ade92a95784127Andreas Huber LOGV("queueAccessUnit timeUs=%lld us (%.2f secs)", timeUs, timeUs / 1E6); 14754d09724e3ea2af4e08dff47d7ade92a95784127Andreas Huber 148a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber Mutex::Autolock autoLock(mLock); 149a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber mBuffers.push_back(buffer); 150a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber mCondition.signal(); 151a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 152a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 15354e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Hubervoid AnotherPacketSource::queueDiscontinuity( 154669ad13de924af145771837b339c882e30ea8ce2Andreas Huber ATSParser::DiscontinuityType type, 155669ad13de924af145771837b339c882e30ea8ce2Andreas Huber const sp<AMessage> &extra) { 1564c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber Mutex::Autolock autoLock(mLock); 15754d09724e3ea2af4e08dff47d7ade92a95784127Andreas Huber 158ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber // Leave only discontinuities in the queue. 159ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber List<sp<ABuffer> >::iterator it = mBuffers.begin(); 160ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber while (it != mBuffers.end()) { 161ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber sp<ABuffer> oldBuffer = *it; 162ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber 163ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber int32_t oldDiscontinuityType; 164ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber if (!oldBuffer->meta()->findInt32( 165ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber "discontinuity", &oldDiscontinuityType)) { 166ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber it = mBuffers.erase(it); 167ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber continue; 168ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber } 169847551cff3fc824e898a2652e4c6a8dd1b049cb5Andreas Huber 170ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber ++it; 171847551cff3fc824e898a2652e4c6a8dd1b049cb5Andreas Huber } 172ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber 173ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber mEOSResult = OK; 174ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber 175ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber sp<ABuffer> buffer = new ABuffer(0); 176ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); 177ced159b1d839b24775525ccb736876e7cb7e649dAndreas Huber buffer->meta()->setMessage("extra", extra); 178847551cff3fc824e898a2652e4c6a8dd1b049cb5Andreas Huber 1794c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber mBuffers.push_back(buffer); 1804c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber mCondition.signal(); 1814c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber} 1824c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber 183a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Hubervoid AnotherPacketSource::signalEOS(status_t result) { 184a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber CHECK(result != OK); 185a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 186a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber Mutex::Autolock autoLock(mLock); 187a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber mEOSResult = result; 188a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber mCondition.signal(); 189a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 190a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 191a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huberbool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { 192a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber Mutex::Autolock autoLock(mLock); 193a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber if (!mBuffers.empty()) { 194a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber return true; 195a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber } 196a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 197a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber *finalResult = mEOSResult; 198a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber return false; 199a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} 200a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 201a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberstatus_t AnotherPacketSource::nextBufferTime(int64_t *timeUs) { 202a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber *timeUs = 0; 203a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 204a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber Mutex::Autolock autoLock(mLock); 205a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 206a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber if (mBuffers.empty()) { 207a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber return mEOSResult != OK ? mEOSResult : -EWOULDBLOCK; 208a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber } 209a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 210a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber sp<ABuffer> buffer = *mBuffers.begin(); 211a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", timeUs)); 212a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 213a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber return OK; 214a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber} 215a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 216a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber} // namespace android 217