StreamingSource.cpp revision d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3
15bc087c573c70c84c6a39946457590b42d392a33Andreas Huber/* 25bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Copyright (C) 2010 The Android Open Source Project 35bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * 45bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * you may not use this file except in compliance with the License. 65bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * You may obtain a copy of the License at 75bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * 85bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * 105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Unless required by applicable law or agreed to in writing, software 115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * See the License for the specific language governing permissions and 145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * limitations under the License. 155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber */ 165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber//#define LOG_NDEBUG 0 185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#define LOG_TAG "StreamingSource" 195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <utils/Log.h> 205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h" 225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h" 245bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "AnotherPacketSource.h" 255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerStreamListener.h" 265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 27d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/MediaSource.h> 285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/ADebug.h> 305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/foundation/AMessage.h> 315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/MetaData.h> 32093024bfa271988655327e0fb761b581afa8bc11Robert Shih#include <media/stagefright/Utils.h> 335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 345bc087c573c70c84c6a39946457590b42d392a33Andreas Hubernamespace android { 355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 368cf4ced8d25e9b1b56b69b544339acc1550e4038osamu fujitaconst int32_t kNumListenerQueuePackets = 80; 378cf4ced8d25e9b1b56b69b544339acc1550e4038osamu fujita 38b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas HuberNuPlayer::StreamingSource::StreamingSource( 39b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber const sp<AMessage> ¬ify, 40b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber const sp<IStreamSource> &source) 41b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber : Source(notify), 42b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber mSource(source), 43180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mFinalResult(OK), 44180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mBuffering(false) { 455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 475bc087c573c70c84c6a39946457590b42d392a33Andreas HuberNuPlayer::StreamingSource::~StreamingSource() { 48180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (mLooper != NULL) { 49180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->unregisterHandler(id()); 50180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->stop(); 51180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 525bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 5448fa06d1e80a872c7495804979256e021e566ae0Wei Jiastatus_t NuPlayer::StreamingSource::getDefaultBufferingSettings( 5548fa06d1e80a872c7495804979256e021e566ae0Wei Jia BufferingSettings *buffering /* nonnull */) { 5648fa06d1e80a872c7495804979256e021e566ae0Wei Jia *buffering = BufferingSettings(); 5748fa06d1e80a872c7495804979256e021e566ae0Wei Jia return OK; 5848fa06d1e80a872c7495804979256e021e566ae0Wei Jia} 5948fa06d1e80a872c7495804979256e021e566ae0Wei Jia 6048fa06d1e80a872c7495804979256e021e566ae0Wei Jiastatus_t NuPlayer::StreamingSource::setBufferingSettings( 6148fa06d1e80a872c7495804979256e021e566ae0Wei Jia const BufferingSettings &buffering) { 6248fa06d1e80a872c7495804979256e021e566ae0Wei Jia if (buffering.mInitialBufferingMode != BUFFERING_MODE_NONE 6348fa06d1e80a872c7495804979256e021e566ae0Wei Jia || buffering.mRebufferingMode != BUFFERING_MODE_NONE) { 6448fa06d1e80a872c7495804979256e021e566ae0Wei Jia return BAD_VALUE; 6548fa06d1e80a872c7495804979256e021e566ae0Wei Jia } 6648fa06d1e80a872c7495804979256e021e566ae0Wei Jia 6748fa06d1e80a872c7495804979256e021e566ae0Wei Jia return OK; 6848fa06d1e80a872c7495804979256e021e566ae0Wei Jia} 6948fa06d1e80a872c7495804979256e021e566ae0Wei Jia 709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::StreamingSource::prepareAsync() { 71180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (mLooper == NULL) { 72180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper = new ALooper; 73180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->setName("streaming"); 74180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->start(); 75180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 76180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->registerHandler(this); 77180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 78180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 79ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang notifyVideoSizeChanged(); 809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notifyFlagsChanged(0); 819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notifyPrepared(); 829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 845bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::StreamingSource::start() { 851d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar mStreamListener = new NuPlayerStreamListener(mSource, NULL); 8687f2a558dd12043631e12c361abef301bf603140Andreas Huber 8787f2a558dd12043631e12c361abef301bf603140Andreas Huber uint32_t sourceFlags = mSource->flags(); 8887f2a558dd12043631e12c361abef301bf603140Andreas Huber 8987f2a558dd12043631e12c361abef301bf603140Andreas Huber uint32_t parserFlags = ATSParser::TS_TIMESTAMPS_ARE_ABSOLUTE; 9087f2a558dd12043631e12c361abef301bf603140Andreas Huber if (sourceFlags & IStreamSource::kFlagAlignedVideoData) { 9187f2a558dd12043631e12c361abef301bf603140Andreas Huber parserFlags |= ATSParser::ALIGNED_VIDEO_DATA; 9287f2a558dd12043631e12c361abef301bf603140Andreas Huber } 9387f2a558dd12043631e12c361abef301bf603140Andreas Huber 9487f2a558dd12043631e12c361abef301bf603140Andreas Huber mTSParser = new ATSParser(parserFlags); 955bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mStreamListener->start(); 97180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 98180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang postReadBuffer(); 995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 101eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huberstatus_t NuPlayer::StreamingSource::feedMoreTSData() { 102180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return postReadBuffer(); 103180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 1045bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 105180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangvoid NuPlayer::StreamingSource::onReadBuffer() { 1068cf4ced8d25e9b1b56b69b544339acc1550e4038osamu fujita for (int32_t i = 0; i < kNumListenerQueuePackets; ++i) { 1075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber char buffer[188]; 10832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber sp<AMessage> extra; 10932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ssize_t n = mStreamListener->read(buffer, sizeof(buffer), &extra); 1105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (n == 0) { 112df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("input data EOS reached."); 1135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mTSParser->signalEOS(ERROR_END_OF_STREAM); 114180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang setError(ERROR_END_OF_STREAM); 1155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber break; 1165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } else if (n == INFO_DISCONTINUITY) { 117fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia int32_t type = ATSParser::DISCONTINUITY_TIME; 11842e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber 119bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber int32_t mask; 12042e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber if (extra != NULL 12142e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber && extra->findInt32( 122bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber IStreamListener::kKeyDiscontinuityMask, &mask)) { 123bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber if (mask == 0) { 12429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Client specified an illegal discontinuity type."); 125180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang setError(ERROR_UNSUPPORTED); 126180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang break; 127bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber } 128bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber 129bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber type = mask; 13042e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber } 13142e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber 132bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber mTSParser->signalDiscontinuity( 133bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber (ATSParser::DiscontinuityType)type, extra); 1345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } else if (n < 0) { 1355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber break; 1365bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } else { 1375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (buffer[0] == 0x00) { 1385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber // XXX legacy 139b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 140b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (extra == NULL) { 141b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber extra = new AMessage; 142b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 143b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 144b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber uint8_t type = buffer[1]; 145b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 146b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (type & 2) { 147b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 148b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber memcpy(&mediaTimeUs, &buffer[2], sizeof(mediaTimeUs)); 149b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 150b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber extra->setInt64(IStreamListener::kKeyMediaTimeUs, mediaTimeUs); 151b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 152b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 1535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mTSParser->signalDiscontinuity( 154b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber ((type & 1) == 0) 155fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia ? ATSParser::DISCONTINUITY_TIME 15632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : ATSParser::DISCONTINUITY_FORMATCHANGE, 15732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber extra); 1585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } else { 15906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t err = mTSParser->feedTSPacket(buffer, sizeof(buffer)); 16006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 16106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (err != OK) { 16229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("TS Parser returned error %d", err); 16306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 16406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber mTSParser->signalEOS(err); 165180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang setError(err); 16606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber break; 16706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 1685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 171180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 172180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 173180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangstatus_t NuPlayer::StreamingSource::postReadBuffer() { 174180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang { 175180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang Mutex::Autolock _l(mBufferingLock); 176180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (mFinalResult != OK) { 177180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return mFinalResult; 178180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 179180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (mBuffering) { 180180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return OK; 181180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 182180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mBuffering = true; 183180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 1845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1851d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatReadBuffer, this))->post(); 186eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber return OK; 1875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 189180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangbool NuPlayer::StreamingSource::haveSufficientDataOnAllTracks() { 190180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang // We're going to buffer at least 2 secs worth data on all tracks before 191180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang // starting playback (both at startup and after a seek). 192180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 193180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang static const int64_t kMinDurationUs = 2000000ll; 194180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 195180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<AnotherPacketSource> audioTrack = getSource(true /*audio*/); 196180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<AnotherPacketSource> videoTrack = getSource(false /*audio*/); 197180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 198180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang status_t err; 199180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang int64_t durationUs; 200180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (audioTrack != NULL 201180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang && (durationUs = audioTrack->getBufferedDurationUs(&err)) 202180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang < kMinDurationUs 203180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang && err == OK) { 204180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang ALOGV("audio track doesn't have enough data yet. (%.2f secs buffered)", 205180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang durationUs / 1E6); 206180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return false; 207180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 208180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 209180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (videoTrack != NULL 210180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang && (durationUs = videoTrack->getBufferedDurationUs(&err)) 211180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang < kMinDurationUs 212180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang && err == OK) { 213180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang ALOGV("video track doesn't have enough data yet. (%.2f secs buffered)", 214180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang durationUs / 1E6); 215180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return false; 216180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 217180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 218180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return true; 219180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 220180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 221180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangvoid NuPlayer::StreamingSource::setError(status_t err) { 222180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang Mutex::Autolock _l(mBufferingLock); 223180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mFinalResult = err; 224180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 225180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 226180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangsp<AnotherPacketSource> NuPlayer::StreamingSource::getSource(bool audio) { 227ab05b4ccb8ea59079d7f773aa0e090029c479badWei Jia if (mTSParser == NULL) { 228ab05b4ccb8ea59079d7f773aa0e090029c479badWei Jia return NULL; 229ab05b4ccb8ea59079d7f773aa0e090029c479badWei Jia } 230ab05b4ccb8ea59079d7f773aa0e090029c479badWei Jia 231180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<MediaSource> source = mTSParser->getSource( 232180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang audio ? ATSParser::AUDIO : ATSParser::VIDEO); 2335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 234180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return static_cast<AnotherPacketSource *>(source.get()); 235180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 236180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 237093024bfa271988655327e0fb761b581afa8bc11Robert Shihsp<AMessage> NuPlayer::StreamingSource::getFormat(bool audio) { 238180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<AnotherPacketSource> source = getSource(audio); 2395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 240093024bfa271988655327e0fb761b581afa8bc11Robert Shih sp<AMessage> format = new AMessage; 2415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (source == NULL) { 242093024bfa271988655327e0fb761b581afa8bc11Robert Shih format->setInt32("err", -EWOULDBLOCK); 243093024bfa271988655327e0fb761b581afa8bc11Robert Shih return format; 2445bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 2455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 246093024bfa271988655327e0fb761b581afa8bc11Robert Shih sp<MetaData> meta = source->getFormat(); 247c3fe699d319ee040515a230dc94e7cf50c95c05aRoger if (meta == NULL) { 248c3fe699d319ee040515a230dc94e7cf50c95c05aRoger format->setInt32("err", -EWOULDBLOCK); 249c3fe699d319ee040515a230dc94e7cf50c95c05aRoger return format; 250c3fe699d319ee040515a230dc94e7cf50c95c05aRoger } 251093024bfa271988655327e0fb761b581afa8bc11Robert Shih status_t err = convertMetaDataToMessage(meta, &format); 2525bd99f9211c533058be9f41bc966be1f2f501f13Lajos Molnar if (err != OK) { // format may have been cleared on error 2539737d3497f6ef8bf6a1083aabd8a03569944795dWei Jia return NULL; 254093024bfa271988655327e0fb761b581afa8bc11Robert Shih } 255093024bfa271988655327e0fb761b581afa8bc11Robert Shih return format; 2565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 2575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2585bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::StreamingSource::dequeueAccessUnit( 2595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber bool audio, sp<ABuffer> *accessUnit) { 260180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<AnotherPacketSource> source = getSource(audio); 2615bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (source == NULL) { 2635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return -EWOULDBLOCK; 2645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 2655bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 266180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (!haveSufficientDataOnAllTracks()) { 267180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang postReadBuffer(); 268180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 269180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 2705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber status_t finalResult; 2715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (!source->hasBufferAvailable(&finalResult)) { 2725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return finalResult == OK ? -EWOULDBLOCK : finalResult; 2735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 2745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 27587f2a558dd12043631e12c361abef301bf603140Andreas Huber status_t err = source->dequeueAccessUnit(accessUnit); 27687f2a558dd12043631e12c361abef301bf603140Andreas Huber 27787f2a558dd12043631e12c361abef301bf603140Andreas Huber#if !defined(LOG_NDEBUG) || LOG_NDEBUG == 0 27887f2a558dd12043631e12c361abef301bf603140Andreas Huber if (err == OK) { 27987f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs; 28087f2a558dd12043631e12c361abef301bf603140Andreas Huber CHECK((*accessUnit)->meta()->findInt64("timeUs", &timeUs)); 28187f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("dequeueAccessUnit timeUs=%lld us", timeUs); 28287f2a558dd12043631e12c361abef301bf603140Andreas Huber } 28387f2a558dd12043631e12c361abef301bf603140Andreas Huber#endif 28487f2a558dd12043631e12c361abef301bf603140Andreas Huber 28587f2a558dd12043631e12c361abef301bf603140Andreas Huber return err; 2865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 2875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 288d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huberbool NuPlayer::StreamingSource::isRealTime() const { 289d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber return mSource->flags() & IStreamSource::kFlagIsRealTimeData; 290d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber} 291d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 292180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangvoid NuPlayer::StreamingSource::onMessageReceived( 293180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang const sp<AMessage> &msg) { 294180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang switch (msg->what()) { 295180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang case kWhatReadBuffer: 296180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang { 297180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang onReadBuffer(); 298180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 299180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang { 300180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang Mutex::Autolock _l(mBufferingLock); 301180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mBuffering = false; 302180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 303180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang break; 304180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 305180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang default: 306180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang { 307180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang TRESPASS(); 308180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 309180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 310180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 311180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 312180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 3135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} // namespace android 3145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 315