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