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> ¬ify, 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> ¬ify, 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