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