GenericSource.cpp revision 840667883fd09d44015716d79bc3ac4d60edc0f0
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(
35afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const char *url,
36afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const KeyedVector<String8, String8> *headers,
37afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        bool uidValid,
38afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        uid_t uid)
39afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    : mDurationUs(0ll),
40afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber      mAudioIsVorbis(false) {
41afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    DataSource::RegisterDefaultSniffers();
42afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
43afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<DataSource> dataSource =
44afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        DataSource::CreateFromURI(url, headers);
45afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(dataSource != NULL);
46afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
47afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    initFromDataSource(dataSource);
48afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
49afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
50afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas HuberNuPlayer::GenericSource::GenericSource(
51afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        int fd, int64_t offset, int64_t length)
52afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    : mDurationUs(0ll),
53afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber      mAudioIsVorbis(false) {
54afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    DataSource::RegisterDefaultSniffers();
55afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
56afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<DataSource> dataSource = new FileSource(dup(fd), offset, length);
57afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
58afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    initFromDataSource(dataSource);
59afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
60afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
61afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::initFromDataSource(
62afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const sp<DataSource> &dataSource) {
63afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
64afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
65afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(extractor != NULL);
66afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
67afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
68afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
69afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
70afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        const char *mime;
71afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
72afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
73afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<MediaSource> track;
74afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
75afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (!strncasecmp(mime, "audio/", 6)) {
76afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (mAudioTrack.mSource == NULL) {
77afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                mAudioTrack.mSource = track = extractor->getTrack(i);
78afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
79afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
80afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mAudioIsVorbis = true;
81afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                } else {
82afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mAudioIsVorbis = false;
83afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
84afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
85afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else if (!strncasecmp(mime, "video/", 6)) {
86afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (mVideoTrack.mSource == NULL) {
87afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                mVideoTrack.mSource = track = extractor->getTrack(i);
88afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
89afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
90afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
91afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (track != NULL) {
92afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            int64_t durationUs;
93afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (meta->findInt64(kKeyDuration, &durationUs)) {
94afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (durationUs > mDurationUs) {
95afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    mDurationUs = durationUs;
96afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
98afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas HuberNuPlayer::GenericSource::~GenericSource() {
103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::start() {
106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    ALOGI("start");
107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mAudioTrack.mSource != NULL) {
109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK_EQ(mAudioTrack.mSource->start(), (status_t)OK);
110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
111afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        mAudioTrack.mPackets =
112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            new AnotherPacketSource(mAudioTrack.mSource->getFormat());
113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
114afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(true /* audio */);
115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
116afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
117afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mVideoTrack.mSource != NULL) {
118afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        CHECK_EQ(mVideoTrack.mSource->start(), (status_t)OK);
119afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
120afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        mVideoTrack.mPackets =
121afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            new AnotherPacketSource(mVideoTrack.mSource->getFormat());
122afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
123afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(false /* audio */);
124afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
125afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
126afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
127afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::feedMoreTSData() {
128afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
129afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
130afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
131840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<MetaData> NuPlayer::GenericSource::getFormatMeta(bool audio) {
132afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    sp<MediaSource> source = audio ? mAudioTrack.mSource : mVideoTrack.mSource;
133afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
134afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (source == NULL) {
135afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return NULL;
136afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
137afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
138afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return source->getFormat();
139afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
140afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
141afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::dequeueAccessUnit(
142afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        bool audio, sp<ABuffer> *accessUnit) {
143afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track *track = audio ? &mAudioTrack : &mVideoTrack;
144afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
145afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (track->mSource == NULL) {
146afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return -EWOULDBLOCK;
147afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
148afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
149afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    status_t finalResult;
150afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (!track->mPackets->hasBufferAvailable(&finalResult)) {
151afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        return finalResult == OK ? -EWOULDBLOCK : finalResult;
152afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
153afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
154afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    status_t result = track->mPackets->dequeueAccessUnit(accessUnit);
155afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
156afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    readBuffer(audio, -1ll);
157afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
158afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return result;
159afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
160afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
161afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::getDuration(int64_t *durationUs) {
162afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    *durationUs = mDurationUs;
163afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
164afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
165afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
166afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatus_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) {
167afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mVideoTrack.mSource != NULL) {
168afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        int64_t actualTimeUs;
169afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(false /* audio */, seekTimeUs, &actualTimeUs);
170afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
171afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        seekTimeUs = actualTimeUs;
172afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
173afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
174afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (mAudioTrack.mSource != NULL) {
175afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        readBuffer(true /* audio */, seekTimeUs);
176afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
177afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
178afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return OK;
179afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
180afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
181afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::GenericSource::readBuffer(
182afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        bool audio, int64_t seekTimeUs, int64_t *actualTimeUs) {
183afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track *track = audio ? &mAudioTrack : &mVideoTrack;
184afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    CHECK(track->mSource != NULL);
185afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
186afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (actualTimeUs) {
187afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        *actualTimeUs = seekTimeUs;
188afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
190afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    MediaSource::ReadOptions options;
191afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
192afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    bool seeking = false;
193afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
194afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    if (seekTimeUs >= 0) {
195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        options.setSeekTo(seekTimeUs);
196afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        seeking = true;
197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    for (;;) {
200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        MediaBuffer *mbuf;
201afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        status_t err = track->mSource->read(&mbuf, &options);
202afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
203afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        options.clearSeekTo();
204afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
205afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        if (err == OK) {
206afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            size_t outLength = mbuf->range_length();
207afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
208afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (audio && mAudioIsVorbis) {
209afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                outLength += sizeof(int32_t);
210afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
211afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
212afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            sp<ABuffer> buffer = new ABuffer(outLength);
213afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
214afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            memcpy(buffer->data(),
215afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                   (const uint8_t *)mbuf->data() + mbuf->range_offset(),
216afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                   mbuf->range_length());
217afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
218afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (audio && mAudioIsVorbis) {
219afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                int32_t numPageSamples;
220afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                if (!mbuf->meta_data()->findInt32(
221afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                            kKeyValidSamples, &numPageSamples)) {
222afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    numPageSamples = -1;
223afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                }
224afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
225afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                memcpy(buffer->data() + mbuf->range_length(),
226afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                       &numPageSamples,
227afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                       sizeof(numPageSamples));
228afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
229afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
230afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            int64_t timeUs;
231afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs));
232afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
233afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            buffer->meta()->setInt64("timeUs", timeUs);
234afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
235afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (actualTimeUs) {
236afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                *actualTimeUs = timeUs;
237afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
238afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
239afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            mbuf->release();
240afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            mbuf = NULL;
241afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
242afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            if (seeking) {
243afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                track->mPackets->queueDiscontinuity(
244afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                        ATSParser::DISCONTINUITY_SEEK, NULL);
245afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            }
246afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
247afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->queueAccessUnit(buffer);
248afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            break;
249afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else if (err == INFO_FORMAT_CHANGED) {
250afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#if 0
251afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->queueDiscontinuity(
252afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber                    ATSParser::DISCONTINUITY_FORMATCHANGE, NULL);
253afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#endif
254afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        } else {
255afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            track->mPackets->signalEOS(err);
256afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            break;
257afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        }
258afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    }
259afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
260afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
261afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberbool NuPlayer::GenericSource::isSeekable() {
262afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    return true;
263afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}
264afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
265afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}  // namespace android
266