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