GenericSource.cpp revision c1f4b2b73fe9432cb75ce1dd368475a2867e70ed
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,
3881e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber        const KeyedVector<String8, String8> *headers)
39b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    : Source(notify),
40b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber      mDurationUs(0ll),
41afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber      mAudioIsVorbis(false) {
42afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    DataSource::RegisterDefaultSniffers();
43afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
44afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<DataSource> dataSource =
451b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        DataSource::CreateFromURI(httpService, url, headers);
46afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(dataSource != NULL);
47afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
48afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    initFromDataSource(dataSource);
49afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
50afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
51afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas HuberNuPlayer::GenericSource::GenericSource(
52b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        const sp<AMessage> &notify,
53afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        int fd, int64_t offset, int64_t length)
54b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    : Source(notify),
55b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber      mDurationUs(0ll),
56afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber      mAudioIsVorbis(false) {
57afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    DataSource::RegisterDefaultSniffers();
58afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
59afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<DataSource> dataSource = new FileSource(dup(fd), offset, length);
60afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
61afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    initFromDataSource(dataSource);
62afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
63afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
64afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::initFromDataSource(
65afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const sp<DataSource> &dataSource) {
66afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
67afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
68afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(extractor != NULL);
69afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
70c1f4b2b73fe9432cb75ce1dd368475a2867e70edMarco Nelissen    sp<MetaData> fileMeta = extractor->getMetaData();
71c1f4b2b73fe9432cb75ce1dd368475a2867e70edMarco Nelissen    if (fileMeta != NULL) {
72c1f4b2b73fe9432cb75ce1dd368475a2867e70edMarco Nelissen        int64_t duration;
73c1f4b2b73fe9432cb75ce1dd368475a2867e70edMarco Nelissen        if (fileMeta->findInt64(kKeyDuration, &duration)) {
74c1f4b2b73fe9432cb75ce1dd368475a2867e70edMarco Nelissen            mDurationUs = duration;
75c1f4b2b73fe9432cb75ce1dd368475a2867e70edMarco Nelissen        }
76c1f4b2b73fe9432cb75ce1dd368475a2867e70edMarco Nelissen    }
77c1f4b2b73fe9432cb75ce1dd368475a2867e70edMarco Nelissen
78afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
79afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
80afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
81afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const char *mime;
82afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
83afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
84afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<MediaSource> track;
85afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
86afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (!strncasecmp(mime, "audio/", 6)) {
87afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (mAudioTrack.mSource == NULL) {
88afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                mAudioTrack.mSource = track = extractor->getTrack(i);
89afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
90afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
91afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mAudioIsVorbis = true;
92afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                } else {
93afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mAudioIsVorbis = false;
94afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
95afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
96afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else if (!strncasecmp(mime, "video/", 6)) {
97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (mVideoTrack.mSource == NULL) {
98afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                mVideoTrack.mSource = track = extractor->getTrack(i);
99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (track != NULL) {
103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            int64_t durationUs;
104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (meta->findInt64(kKeyDuration, &durationUs)) {
105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (durationUs > mDurationUs) {
106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mDurationUs = durationUs;
107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
111afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas HuberNuPlayer::GenericSource::~GenericSource() {
114afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::GenericSource::prepareAsync() {
1179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    if (mVideoTrack.mSource != NULL) {
1189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        sp<MetaData> meta = mVideoTrack.mSource->getFormat();
1199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        int32_t width, height;
1219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        CHECK(meta->findInt32(kKeyWidth, &width));
1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        CHECK(meta->findInt32(kKeyHeight, &height));
1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        notifyVideoSizeChanged(width, height);
1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notifyFlagsChanged(
1289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            FLAG_CAN_PAUSE
1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            | FLAG_CAN_SEEK_BACKWARD
1309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            | FLAG_CAN_SEEK_FORWARD
1319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            | FLAG_CAN_SEEK);
1329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    notifyPrepared();
1349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
1359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
136afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::start() {
137afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    ALOGI("start");
138afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
139afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mAudioTrack.mSource != NULL) {
140afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK_EQ(mAudioTrack.mSource->start(), (status_t)OK);
141afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
142afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        mAudioTrack.mPackets =
143afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            new AnotherPacketSource(mAudioTrack.mSource->getFormat());
144afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
145afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(true /* audio */);
146afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
147afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
148afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mVideoTrack.mSource != NULL) {
149afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK_EQ(mVideoTrack.mSource->start(), (status_t)OK);
150afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
151afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        mVideoTrack.mPackets =
152afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            new AnotherPacketSource(mVideoTrack.mSource->getFormat());
153afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
154afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(false /* audio */);
155afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
156afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
157afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
158afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::feedMoreTSData() {
159afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
160afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
161afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
162840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<MetaData> NuPlayer::GenericSource::getFormatMeta(bool audio) {
163afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<MediaSource> source = audio ? mAudioTrack.mSource : mVideoTrack.mSource;
164afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
165afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (source == NULL) {
166afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return NULL;
167afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
168afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
169afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return source->getFormat();
170afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
171afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
172afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::dequeueAccessUnit(
173afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        bool audio, sp<ABuffer> *accessUnit) {
174afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track *track = audio ? &mAudioTrack : &mVideoTrack;
175afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
176afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (track->mSource == NULL) {
177afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return -EWOULDBLOCK;
178afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
179afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
180afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    status_t finalResult;
181afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (!track->mPackets->hasBufferAvailable(&finalResult)) {
182afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return finalResult == OK ? -EWOULDBLOCK : finalResult;
183afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
184afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
185afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    status_t result = track->mPackets->dequeueAccessUnit(accessUnit);
186afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
187afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    readBuffer(audio, -1ll);
188afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return result;
190afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
191afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
192afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::getDuration(int64_t *durationUs) {
193afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    *durationUs = mDurationUs;
194afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
196afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) {
198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mVideoTrack.mSource != NULL) {
199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        int64_t actualTimeUs;
200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(false /* audio */, seekTimeUs, &actualTimeUs);
201afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
202afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        seekTimeUs = actualTimeUs;
203afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
204afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
205afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mAudioTrack.mSource != NULL) {
206afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(true /* audio */, seekTimeUs);
207afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
208afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
209afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
210afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
211afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
212afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::readBuffer(
213afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        bool audio, int64_t seekTimeUs, int64_t *actualTimeUs) {
214afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track *track = audio ? &mAudioTrack : &mVideoTrack;
215afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(track->mSource != NULL);
216afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
217afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (actualTimeUs) {
218afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        *actualTimeUs = seekTimeUs;
219afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
220afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
221afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    MediaSource::ReadOptions options;
222afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
223afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    bool seeking = false;
224afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
225afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (seekTimeUs >= 0) {
226afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        options.setSeekTo(seekTimeUs);
227afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        seeking = true;
228afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
229afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
230afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    for (;;) {
231afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        MediaBuffer *mbuf;
232afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        status_t err = track->mSource->read(&mbuf, &options);
233afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
234afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        options.clearSeekTo();
235afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
236afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (err == OK) {
237afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            size_t outLength = mbuf->range_length();
238afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
239afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (audio && mAudioIsVorbis) {
240afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                outLength += sizeof(int32_t);
241afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
242afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
243afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            sp<ABuffer> buffer = new ABuffer(outLength);
244afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
245afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            memcpy(buffer->data(),
246afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                   (const uint8_t *)mbuf->data() + mbuf->range_offset(),
247afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                   mbuf->range_length());
248afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
249afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (audio && mAudioIsVorbis) {
250afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                int32_t numPageSamples;
251afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (!mbuf->meta_data()->findInt32(
252afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                            kKeyValidSamples, &numPageSamples)) {
253afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    numPageSamples = -1;
254afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
255afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
256afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                memcpy(buffer->data() + mbuf->range_length(),
257afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                       &numPageSamples,
258afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                       sizeof(numPageSamples));
259afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
260afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
261afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            int64_t timeUs;
262afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs));
263afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
264afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            buffer->meta()->setInt64("timeUs", timeUs);
265afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
266afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (actualTimeUs) {
267afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                *actualTimeUs = timeUs;
268afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
269afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
270afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            mbuf->release();
271afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            mbuf = NULL;
272afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
273afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (seeking) {
274afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                track->mPackets->queueDiscontinuity(
275afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                        ATSParser::DISCONTINUITY_SEEK, NULL);
276afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
277afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
278afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->queueAccessUnit(buffer);
279afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            break;
280afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else if (err == INFO_FORMAT_CHANGED) {
281afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#if 0
282afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->queueDiscontinuity(
283afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    ATSParser::DISCONTINUITY_FORMATCHANGE, NULL);
284afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#endif
285afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else {
286afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->signalEOS(err);
287afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            break;
288afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
289afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
290afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
291afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
292afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}  // namespace android
293