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> 3115d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang#include <media/stagefright/foundation/MediaKeys.h> 325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include <media/stagefright/MetaData.h> 33093024bfa271988655327e0fb761b581afa8bc11Robert Shih#include <media/stagefright/Utils.h> 345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 355bc087c573c70c84c6a39946457590b42d392a33Andreas Hubernamespace android { 365bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 378cf4ced8d25e9b1b56b69b544339acc1550e4038osamu fujitaconst int32_t kNumListenerQueuePackets = 80; 388cf4ced8d25e9b1b56b69b544339acc1550e4038osamu fujita 39b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas HuberNuPlayer::StreamingSource::StreamingSource( 40b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber const sp<AMessage> ¬ify, 41b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber const sp<IStreamSource> &source) 42b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber : Source(notify), 43b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber mSource(source), 44180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mFinalResult(OK), 45180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mBuffering(false) { 465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 485bc087c573c70c84c6a39946457590b42d392a33Andreas HuberNuPlayer::StreamingSource::~StreamingSource() { 49180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (mLooper != NULL) { 50180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->unregisterHandler(id()); 51180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->stop(); 52180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 545bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 559bb3803a80a680ea7a3bc11e07b8a89ccddee003Wei Jiastatus_t NuPlayer::StreamingSource::getBufferingSettings( 5648fa06d1e80a872c7495804979256e021e566ae0Wei Jia BufferingSettings *buffering /* nonnull */) { 5748fa06d1e80a872c7495804979256e021e566ae0Wei Jia *buffering = BufferingSettings(); 5848fa06d1e80a872c7495804979256e021e566ae0Wei Jia return OK; 5948fa06d1e80a872c7495804979256e021e566ae0Wei Jia} 6048fa06d1e80a872c7495804979256e021e566ae0Wei Jia 6148fa06d1e80a872c7495804979256e021e566ae0Wei Jiastatus_t NuPlayer::StreamingSource::setBufferingSettings( 629bb3803a80a680ea7a3bc11e07b8a89ccddee003Wei Jia const BufferingSettings & /* buffering */) { 6348fa06d1e80a872c7495804979256e021e566ae0Wei Jia return OK; 6448fa06d1e80a872c7495804979256e021e566ae0Wei Jia} 6548fa06d1e80a872c7495804979256e021e566ae0Wei Jia 669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::StreamingSource::prepareAsync() { 67180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (mLooper == NULL) { 68180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper = new ALooper; 69180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->setName("streaming"); 70180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->start(); 71180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 72180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mLooper->registerHandler(this); 73180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 74180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 75ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang notifyVideoSizeChanged(); 769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notifyFlagsChanged(0); 779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notifyPrepared(); 789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 805bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::StreamingSource::start() { 811d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar mStreamListener = new NuPlayerStreamListener(mSource, NULL); 8287f2a558dd12043631e12c361abef301bf603140Andreas Huber 8387f2a558dd12043631e12c361abef301bf603140Andreas Huber uint32_t sourceFlags = mSource->flags(); 8487f2a558dd12043631e12c361abef301bf603140Andreas Huber 8587f2a558dd12043631e12c361abef301bf603140Andreas Huber uint32_t parserFlags = ATSParser::TS_TIMESTAMPS_ARE_ABSOLUTE; 8687f2a558dd12043631e12c361abef301bf603140Andreas Huber if (sourceFlags & IStreamSource::kFlagAlignedVideoData) { 8787f2a558dd12043631e12c361abef301bf603140Andreas Huber parserFlags |= ATSParser::ALIGNED_VIDEO_DATA; 8887f2a558dd12043631e12c361abef301bf603140Andreas Huber } 8987f2a558dd12043631e12c361abef301bf603140Andreas Huber 9087f2a558dd12043631e12c361abef301bf603140Andreas Huber mTSParser = new ATSParser(parserFlags); 915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 925bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mStreamListener->start(); 93180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 94180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang postReadBuffer(); 955bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 97eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huberstatus_t NuPlayer::StreamingSource::feedMoreTSData() { 98180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return postReadBuffer(); 99180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 1005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 101180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangvoid NuPlayer::StreamingSource::onReadBuffer() { 1028cf4ced8d25e9b1b56b69b544339acc1550e4038osamu fujita for (int32_t i = 0; i < kNumListenerQueuePackets; ++i) { 1035bc087c573c70c84c6a39946457590b42d392a33Andreas Huber char buffer[188]; 10432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber sp<AMessage> extra; 10532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ssize_t n = mStreamListener->read(buffer, sizeof(buffer), &extra); 1065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (n == 0) { 108df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("input data EOS reached."); 1095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mTSParser->signalEOS(ERROR_END_OF_STREAM); 110180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang setError(ERROR_END_OF_STREAM); 1115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber break; 1125bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } else if (n == INFO_DISCONTINUITY) { 113fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia int32_t type = ATSParser::DISCONTINUITY_TIME; 11442e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber 115bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber int32_t mask; 11642e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber if (extra != NULL 11742e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber && extra->findInt32( 11815d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang kIStreamListenerKeyDiscontinuityMask, &mask)) { 119bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber if (mask == 0) { 12029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Client specified an illegal discontinuity type."); 121180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang setError(ERROR_UNSUPPORTED); 122180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang break; 123bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber } 124bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber 125bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber type = mask; 12642e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber } 12742e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber 128bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber mTSParser->signalDiscontinuity( 129bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber (ATSParser::DiscontinuityType)type, extra); 1305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } else if (n < 0) { 1315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber break; 1325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } else { 1335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (buffer[0] == 0x00) { 1345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber // XXX legacy 135b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 136b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (extra == NULL) { 137b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber extra = new AMessage; 138b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 139b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 140b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber uint8_t type = buffer[1]; 141b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 142b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (type & 2) { 143b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 144b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber memcpy(&mediaTimeUs, &buffer[2], sizeof(mediaTimeUs)); 145b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 14615d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang extra->setInt64(kATSParserKeyMediaTimeUs, mediaTimeUs); 147b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 148b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 1495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mTSParser->signalDiscontinuity( 150b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber ((type & 1) == 0) 151fef808d42a9c94b0b5ef3c3d5fb0a090edbc42daWei Jia ? ATSParser::DISCONTINUITY_TIME 15232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : ATSParser::DISCONTINUITY_FORMATCHANGE, 15332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber extra); 1545bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } else { 15506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t err = mTSParser->feedTSPacket(buffer, sizeof(buffer)); 15606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 15706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (err != OK) { 15829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("TS Parser returned error %d", err); 15906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 16006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber mTSParser->signalEOS(err); 161180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang setError(err); 16206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber break; 16306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 1645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1655bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 1665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 167180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 168180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 169180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangstatus_t NuPlayer::StreamingSource::postReadBuffer() { 170180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang { 171180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang Mutex::Autolock _l(mBufferingLock); 172180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (mFinalResult != OK) { 173180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return mFinalResult; 174180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 175180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (mBuffering) { 176180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return OK; 177180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 178180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mBuffering = true; 179180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 1805bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1811d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatReadBuffer, this))->post(); 182eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber return OK; 1835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 185180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangbool NuPlayer::StreamingSource::haveSufficientDataOnAllTracks() { 186180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang // We're going to buffer at least 2 secs worth data on all tracks before 187180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang // starting playback (both at startup and after a seek). 188180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 189180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang static const int64_t kMinDurationUs = 2000000ll; 190180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 191180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<AnotherPacketSource> audioTrack = getSource(true /*audio*/); 192180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<AnotherPacketSource> videoTrack = getSource(false /*audio*/); 193180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 194180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang status_t err; 195180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang int64_t durationUs; 196180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (audioTrack != NULL 197180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang && (durationUs = audioTrack->getBufferedDurationUs(&err)) 198180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang < kMinDurationUs 199180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang && err == OK) { 200180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang ALOGV("audio track doesn't have enough data yet. (%.2f secs buffered)", 201180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang durationUs / 1E6); 202180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return false; 203180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 204180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 205180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (videoTrack != NULL 206180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang && (durationUs = videoTrack->getBufferedDurationUs(&err)) 207180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang < kMinDurationUs 208180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang && err == OK) { 209180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang ALOGV("video track doesn't have enough data yet. (%.2f secs buffered)", 210180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang durationUs / 1E6); 211180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return false; 212180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 213180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 214180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return true; 215180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 216180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 217180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangvoid NuPlayer::StreamingSource::setError(status_t err) { 218180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang Mutex::Autolock _l(mBufferingLock); 219180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mFinalResult = err; 220180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 221180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 222180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangsp<AnotherPacketSource> NuPlayer::StreamingSource::getSource(bool audio) { 223ab05b4ccb8ea59079d7f773aa0e090029c479badWei Jia if (mTSParser == NULL) { 224ab05b4ccb8ea59079d7f773aa0e090029c479badWei Jia return NULL; 225ab05b4ccb8ea59079d7f773aa0e090029c479badWei Jia } 226ab05b4ccb8ea59079d7f773aa0e090029c479badWei Jia 227180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<MediaSource> source = mTSParser->getSource( 228180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang audio ? ATSParser::AUDIO : ATSParser::VIDEO); 2295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 230180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang return static_cast<AnotherPacketSource *>(source.get()); 231180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 232180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 233093024bfa271988655327e0fb761b581afa8bc11Robert Shihsp<AMessage> NuPlayer::StreamingSource::getFormat(bool audio) { 234180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<AnotherPacketSource> source = getSource(audio); 2355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 236093024bfa271988655327e0fb761b581afa8bc11Robert Shih sp<AMessage> format = new AMessage; 2375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (source == NULL) { 238093024bfa271988655327e0fb761b581afa8bc11Robert Shih format->setInt32("err", -EWOULDBLOCK); 239093024bfa271988655327e0fb761b581afa8bc11Robert Shih return format; 2405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 2415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 242093024bfa271988655327e0fb761b581afa8bc11Robert Shih sp<MetaData> meta = source->getFormat(); 243c3fe699d319ee040515a230dc94e7cf50c95c05aRoger if (meta == NULL) { 244c3fe699d319ee040515a230dc94e7cf50c95c05aRoger format->setInt32("err", -EWOULDBLOCK); 245c3fe699d319ee040515a230dc94e7cf50c95c05aRoger return format; 246c3fe699d319ee040515a230dc94e7cf50c95c05aRoger } 247093024bfa271988655327e0fb761b581afa8bc11Robert Shih status_t err = convertMetaDataToMessage(meta, &format); 2485bd99f9211c533058be9f41bc966be1f2f501f13Lajos Molnar if (err != OK) { // format may have been cleared on error 2499737d3497f6ef8bf6a1083aabd8a03569944795dWei Jia return NULL; 250093024bfa271988655327e0fb761b581afa8bc11Robert Shih } 251093024bfa271988655327e0fb761b581afa8bc11Robert Shih return format; 2525bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 2535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2545bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::StreamingSource::dequeueAccessUnit( 2555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber bool audio, sp<ABuffer> *accessUnit) { 256180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang sp<AnotherPacketSource> source = getSource(audio); 2575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (source == NULL) { 2595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return -EWOULDBLOCK; 2605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 2615bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 262180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang if (!haveSufficientDataOnAllTracks()) { 263180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang postReadBuffer(); 264180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 265180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 2665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber status_t finalResult; 2675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (!source->hasBufferAvailable(&finalResult)) { 2685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return finalResult == OK ? -EWOULDBLOCK : finalResult; 2695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 2705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 27187f2a558dd12043631e12c361abef301bf603140Andreas Huber status_t err = source->dequeueAccessUnit(accessUnit); 27287f2a558dd12043631e12c361abef301bf603140Andreas Huber 27387f2a558dd12043631e12c361abef301bf603140Andreas Huber#if !defined(LOG_NDEBUG) || LOG_NDEBUG == 0 27487f2a558dd12043631e12c361abef301bf603140Andreas Huber if (err == OK) { 27587f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs; 27687f2a558dd12043631e12c361abef301bf603140Andreas Huber CHECK((*accessUnit)->meta()->findInt64("timeUs", &timeUs)); 27787f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("dequeueAccessUnit timeUs=%lld us", timeUs); 27887f2a558dd12043631e12c361abef301bf603140Andreas Huber } 27987f2a558dd12043631e12c361abef301bf603140Andreas Huber#endif 28087f2a558dd12043631e12c361abef301bf603140Andreas Huber 28187f2a558dd12043631e12c361abef301bf603140Andreas Huber return err; 2825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 2835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 284d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huberbool NuPlayer::StreamingSource::isRealTime() const { 285d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber return mSource->flags() & IStreamSource::kFlagIsRealTimeData; 286d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber} 287d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 288180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhangvoid NuPlayer::StreamingSource::onMessageReceived( 289180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang const sp<AMessage> &msg) { 290180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang switch (msg->what()) { 291180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang case kWhatReadBuffer: 292180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang { 293180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang onReadBuffer(); 294180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 295180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang { 296180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang Mutex::Autolock _l(mBufferingLock); 297180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang mBuffering = false; 298180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 299180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang break; 300180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 301180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang default: 302180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang { 303180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang TRESPASS(); 304180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 305180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang } 306180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang} 307180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 308180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang 3095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} // namespace android 3105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 311