GenericSource.cpp revision 1b86fe063badb5f28c467ade39be0f4008688947
1afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber/*
2afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Copyright (C) 2012 The Android Open Source Project
3afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
4afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * you may not use this file except in compliance with the License.
6afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * You may obtain a copy of the License at
7afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
8afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
10afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Unless required by applicable law or agreed to in writing, software
11afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * See the License for the specific language governing permissions and
14afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * limitations under the License.
15afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber */
16afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
17afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "GenericSource.h"
18afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
19afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "AnotherPacketSource.h"
20afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
21afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/foundation/ABuffer.h>
22afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/foundation/ADebug.h>
23afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/foundation/AMessage.h>
24afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/DataSource.h>
25afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/FileSource.h>
26afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/MediaBuffer.h>
27afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/MediaDefs.h>
28afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/MediaExtractor.h>
29afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/MediaSource.h>
30afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include <media/stagefright/MetaData.h>
31afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
32afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubernamespace android {
33afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
34afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas HuberNuPlayer::GenericSource::GenericSource(
35b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        const sp<AMessage> &notify,
361b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
37afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const char *url,
38afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const KeyedVector<String8, String8> *headers,
39afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        bool uidValid,
40afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        uid_t uid)
41b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    : Source(notify),
42b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber      mDurationUs(0ll),
43afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber      mAudioIsVorbis(false) {
44afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    DataSource::RegisterDefaultSniffers();
45afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
46afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<DataSource> dataSource =
471b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        DataSource::CreateFromURI(httpService, url, headers);
48afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(dataSource != NULL);
49afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
50afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    initFromDataSource(dataSource);
51afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
52afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
53afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas HuberNuPlayer::GenericSource::GenericSource(
54b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        const sp<AMessage> &notify,
55afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        int fd, int64_t offset, int64_t length)
56b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    : Source(notify),
57b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber      mDurationUs(0ll),
58afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber      mAudioIsVorbis(false) {
59afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    DataSource::RegisterDefaultSniffers();
60afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
61afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<DataSource> dataSource = new FileSource(dup(fd), offset, length);
62afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
63afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    initFromDataSource(dataSource);
64afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
65afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
66afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::initFromDataSource(
67afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const sp<DataSource> &dataSource) {
68afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
69afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
70afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(extractor != NULL);
71afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
72afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
73afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
74afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
75afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const char *mime;
76afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
77afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
78afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<MediaSource> track;
79afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
80afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (!strncasecmp(mime, "audio/", 6)) {
81afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (mAudioTrack.mSource == NULL) {
82afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                mAudioTrack.mSource = track = extractor->getTrack(i);
83afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
84afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
85afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mAudioIsVorbis = true;
86afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                } else {
87afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mAudioIsVorbis = false;
88afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
89afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
90afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else if (!strncasecmp(mime, "video/", 6)) {
91afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (mVideoTrack.mSource == NULL) {
92afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                mVideoTrack.mSource = track = extractor->getTrack(i);
93afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
94afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
95afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
96afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (track != NULL) {
97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            int64_t durationUs;
98afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (meta->findInt64(kKeyDuration, &durationUs)) {
99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (durationUs > mDurationUs) {
100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mDurationUs = durationUs;
101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas HuberNuPlayer::GenericSource::~GenericSource() {
108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::GenericSource::prepareAsync() {
1119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    if (mVideoTrack.mSource != NULL) {
1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        sp<MetaData> meta = mVideoTrack.mSource->getFormat();
1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        int32_t width, height;
1159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        CHECK(meta->findInt32(kKeyWidth, &width));
1169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        CHECK(meta->findInt32(kKeyHeight, &height));
1179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        notifyVideoSizeChanged(width, height);
1199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
1209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notifyFlagsChanged(
1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            FLAG_CAN_PAUSE
1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            | FLAG_CAN_SEEK_BACKWARD
1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            | FLAG_CAN_SEEK_FORWARD
1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            | FLAG_CAN_SEEK);
1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notifyPrepared();
1289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
130afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::start() {
131afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    ALOGI("start");
132afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
133afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mAudioTrack.mSource != NULL) {
134afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK_EQ(mAudioTrack.mSource->start(), (status_t)OK);
135afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
136afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        mAudioTrack.mPackets =
137afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            new AnotherPacketSource(mAudioTrack.mSource->getFormat());
138afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
139afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(true /* audio */);
140afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
141afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
142afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mVideoTrack.mSource != NULL) {
143afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK_EQ(mVideoTrack.mSource->start(), (status_t)OK);
144afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
145afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        mVideoTrack.mPackets =
146afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            new AnotherPacketSource(mVideoTrack.mSource->getFormat());
147afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
148afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(false /* audio */);
149afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
150afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
151afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
152afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::feedMoreTSData() {
153afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
154afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
155afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
156840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<MetaData> NuPlayer::GenericSource::getFormatMeta(bool audio) {
157afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<MediaSource> source = audio ? mAudioTrack.mSource : mVideoTrack.mSource;
158afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
159afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (source == NULL) {
160afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return NULL;
161afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
162afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
163afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return source->getFormat();
164afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
165afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
166afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::dequeueAccessUnit(
167afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        bool audio, sp<ABuffer> *accessUnit) {
168afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track *track = audio ? &mAudioTrack : &mVideoTrack;
169afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
170afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (track->mSource == NULL) {
171afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return -EWOULDBLOCK;
172afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
173afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
174afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    status_t finalResult;
175afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (!track->mPackets->hasBufferAvailable(&finalResult)) {
176afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return finalResult == OK ? -EWOULDBLOCK : finalResult;
177afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
178afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
179afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    status_t result = track->mPackets->dequeueAccessUnit(accessUnit);
180afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
181afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    readBuffer(audio, -1ll);
182afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
183afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return result;
184afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
185afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
186afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::getDuration(int64_t *durationUs) {
187afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    *durationUs = mDurationUs;
188afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
190afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
191afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) {
192afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mVideoTrack.mSource != NULL) {
193afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        int64_t actualTimeUs;
194afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(false /* audio */, seekTimeUs, &actualTimeUs);
195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
196afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        seekTimeUs = actualTimeUs;
197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mAudioTrack.mSource != NULL) {
200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(true /* audio */, seekTimeUs);
201afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
202afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
203afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
204afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
205afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
206afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::readBuffer(
207afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        bool audio, int64_t seekTimeUs, int64_t *actualTimeUs) {
208afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track *track = audio ? &mAudioTrack : &mVideoTrack;
209afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(track->mSource != NULL);
210afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
211afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (actualTimeUs) {
212afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        *actualTimeUs = seekTimeUs;
213afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
214afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
215afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    MediaSource::ReadOptions options;
216afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
217afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    bool seeking = false;
218afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
219afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (seekTimeUs >= 0) {
220afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        options.setSeekTo(seekTimeUs);
221afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        seeking = true;
222afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
223afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
224afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    for (;;) {
225afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        MediaBuffer *mbuf;
226afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        status_t err = track->mSource->read(&mbuf, &options);
227afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
228afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        options.clearSeekTo();
229afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
230afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (err == OK) {
231afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            size_t outLength = mbuf->range_length();
232afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
233afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (audio && mAudioIsVorbis) {
234afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                outLength += sizeof(int32_t);
235afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
236afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
237afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            sp<ABuffer> buffer = new ABuffer(outLength);
238afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
239afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            memcpy(buffer->data(),
240afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                   (const uint8_t *)mbuf->data() + mbuf->range_offset(),
241afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                   mbuf->range_length());
242afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
243afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (audio && mAudioIsVorbis) {
244afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                int32_t numPageSamples;
245afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (!mbuf->meta_data()->findInt32(
246afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                            kKeyValidSamples, &numPageSamples)) {
247afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    numPageSamples = -1;
248afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
249afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
250afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                memcpy(buffer->data() + mbuf->range_length(),
251afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                       &numPageSamples,
252afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                       sizeof(numPageSamples));
253afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
254afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
255afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            int64_t timeUs;
256afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs));
257afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
258afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            buffer->meta()->setInt64("timeUs", timeUs);
259afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
260afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (actualTimeUs) {
261afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                *actualTimeUs = timeUs;
262afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
263afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
264afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            mbuf->release();
265afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            mbuf = NULL;
266afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
267afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (seeking) {
268afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                track->mPackets->queueDiscontinuity(
269afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                        ATSParser::DISCONTINUITY_SEEK, NULL);
270afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
271afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
272afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->queueAccessUnit(buffer);
273afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            break;
274afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else if (err == INFO_FORMAT_CHANGED) {
275afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#if 0
276afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->queueDiscontinuity(
277afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    ATSParser::DISCONTINUITY_FORMATCHANGE, NULL);
278afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#endif
279afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else {
280afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->signalEOS(err);
281afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            break;
282afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
283afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
284afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
285afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
286afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}  // namespace android
287