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> &notify,
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