NuMediaExtractor.cpp revision 9806555d3930be43e11106281dee354820ac1c88
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/* 25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright 2012, The Android Open Source Project 35778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License. 65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at 75778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 85778822d86b0337407514b9372562b86edfa91cdAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software 115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and 145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License. 155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */ 165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 175778822d86b0337407514b9372562b86edfa91cdAndreas Huber//#define LOG_NDEBUG 0 185778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define LOG_TAG "NuMediaExtractor" 195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Log.h> 205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NuMediaExtractor.h> 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "include/ESDS.h" 24a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber#include "include/NuCachedSource2.h" 251608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber#include "include/WVMExtractor.h" 265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 275778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h> 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h> 305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/DataSource.h> 31918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber#include <media/stagefright/FileSource.h> 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaBuffer.h> 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaDefs.h> 345778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h> 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaExtractor.h> 365778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaSource.h> 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h> 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/Utils.h> 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 405778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 42a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas HuberNuMediaExtractor::NuMediaExtractor() 43a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber : mIsWidevineExtractor(false), 44a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mTotalBitrate(-1ll), 45a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mDurationUs(-1ll) { 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 485778822d86b0337407514b9372562b86edfa91cdAndreas HuberNuMediaExtractor::~NuMediaExtractor() { 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber releaseTrackSamples(); 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mSelectedTracks.size(); ++i) { 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(i); 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ((status_t)OK, info->mSource->stop()); 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSelectedTracks.clear(); 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 60918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huberstatus_t NuMediaExtractor::setDataSource( 61918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber const char *path, const KeyedVector<String8, String8> *headers) { 62dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 63dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 64918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber if (mImpl != NULL) { 65918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber return -EINVAL; 66918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber } 67918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber 681608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber sp<DataSource> dataSource = 691608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber DataSource::CreateFromURI(path, headers); 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (dataSource == NULL) { 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ENOENT; 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 75a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mIsWidevineExtractor = false; 761608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber if (!strncasecmp("widevine://", path, 11)) { 771608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber String8 mimeType; 781608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber float confidence; 791608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber sp<AMessage> dummy; 801608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber bool success = SniffWVM(dataSource, &mimeType, &confidence, &dummy); 811608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber 821608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber if (!success 831608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber || strcasecmp( 841608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) { 851608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber return ERROR_UNSUPPORTED; 861608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber } 871608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber 881608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber sp<WVMExtractor> extractor = new WVMExtractor(dataSource); 891608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber extractor->setAdaptiveStreamingMode(true); 901608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber 911608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber mImpl = extractor; 92a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mIsWidevineExtractor = true; 931608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber } else { 941608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber mImpl = MediaExtractor::Create(dataSource); 951608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber } 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mImpl == NULL) { 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_UNSUPPORTED; 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10194c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber sp<MetaData> fileMeta = mImpl->getMetaData(); 10294c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber const char *containerMime; 10394c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber if (fileMeta != NULL 10494c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber && fileMeta->findCString(kKeyMIMEType, &containerMime) 10594c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber && !strcasecmp(containerMime, "video/wvm")) { 10694c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber // We always want to use "cryptoPluginMode" when using the wvm 10794c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber // extractor. We can tell that it is this extractor by looking 10894c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber // at the container mime type. 10994c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber // The cryptoPluginMode ensures that the extractor will actually 11094c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber // give us data in a call to MediaSource::read(), unlike its 11194c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber // default mode that we use from AwesomePlayer. 11294c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber static_cast<WVMExtractor *>(mImpl.get())->setCryptoPluginMode(true); 11394c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber } 11494c1c8c99b70f2fdab87e131812eb253271e5500Andreas Huber 115a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mDataSource = dataSource; 116a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 117a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber updateDurationAndBitrate(); 118a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 122918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huberstatus_t NuMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) { 123dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 124dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 125918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber if (mImpl != NULL) { 126918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber return -EINVAL; 127918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber } 128918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber 129918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber sp<FileSource> fileSource = new FileSource(dup(fd), offset, size); 130918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber 131918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber status_t err = fileSource->initCheck(); 132918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber if (err != OK) { 133918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber return err; 134918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber } 135918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber 136918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber mImpl = MediaExtractor::Create(fileSource); 137918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber 138918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber if (mImpl == NULL) { 139918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber return ERROR_UNSUPPORTED; 140918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber } 141918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber 142a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mDataSource = fileSource; 143a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 144a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber updateDurationAndBitrate(); 145a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 146918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber return OK; 147918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber} 148918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber 149a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Hubervoid NuMediaExtractor::updateDurationAndBitrate() { 150a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mTotalBitrate = 0ll; 151a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mDurationUs = -1ll; 152a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 153a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber for (size_t i = 0; i < mImpl->countTracks(); ++i) { 154a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber sp<MetaData> meta = mImpl->getTrackMetaData(i); 155a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 156a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber int32_t bitrate; 157a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber if (!meta->findInt32(kKeyBitRate, &bitrate)) { 158a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber const char *mime; 159a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 160a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber ALOGV("track of type '%s' does not publish bitrate", mime); 161a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 162a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mTotalBitrate = -1ll; 163a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber } else if (mTotalBitrate >= 0ll) { 164a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mTotalBitrate += bitrate; 165a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber } 166a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 167a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber int64_t durationUs; 168a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber if (meta->findInt64(kKeyDuration, &durationUs) 169a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber && durationUs > mDurationUs) { 170a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber mDurationUs = durationUs; 171a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber } 172a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber } 173a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber} 174a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 1755778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t NuMediaExtractor::countTracks() const { 176dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 177dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mImpl == NULL ? 0 : mImpl->countTracks(); 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t NuMediaExtractor::getTrackFormat( 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, sp<AMessage> *format) const { 183dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 184dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber *format = NULL; 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mImpl == NULL) { 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mImpl->countTracks()) { 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = mImpl->getTrackMetaData(index); 1969806555d3930be43e11106281dee354820ac1c88Andreas Huber return convertMetaDataToMessage(meta, format); 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1995778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t NuMediaExtractor::selectTrack(size_t index) { 200dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 201dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mImpl == NULL) { 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mImpl->countTracks()) { 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mSelectedTracks.size(); ++i) { 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(i); 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mTrackIndex == index) { 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber // This track has already been selected. 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaSource> source = mImpl->getTrack(index); 2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ((status_t)OK, source->start()); 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSelectedTracks.push(); 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(mSelectedTracks.size() - 1); 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSource = source; 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mTrackIndex = index; 2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mFinalResult = OK; 2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSample = NULL; 2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSampleTimeUs = -1ll; 231ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info->mTrackFlags = 0; 2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime; 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(source->getFormat()->findCString(kKeyMIMEType, &mime)); 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 237ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info->mTrackFlags |= kIsVorbis; 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2439d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huberstatus_t NuMediaExtractor::unselectTrack(size_t index) { 2449d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber Mutex::Autolock autoLock(mLock); 2459d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2469d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber if (mImpl == NULL) { 2479d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber return -EINVAL; 2489d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber } 2499d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2509d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber if (index >= mImpl->countTracks()) { 2519d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber return -ERANGE; 2529d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber } 2539d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2549d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber size_t i; 2559d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber for (i = 0; i < mSelectedTracks.size(); ++i) { 2569d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(i); 2579d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2589d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber if (info->mTrackIndex == index) { 2599d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber break; 2609d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber } 2619d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber } 2629d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2639d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber if (i == mSelectedTracks.size()) { 2649d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber // Not selected. 2659d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber return OK; 2669d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber } 2679d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2689d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(i); 2699d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2709d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber if (info->mSample != NULL) { 2719d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber info->mSample->release(); 2729d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber info->mSample = NULL; 2739d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2749d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber info->mSampleTimeUs = -1ll; 2759d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber } 2769d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2779d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber CHECK_EQ((status_t)OK, info->mSource->stop()); 2789d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2799d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber mSelectedTracks.removeAt(i); 2809d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2819d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber return OK; 2829d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber} 2839d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber 2845778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid NuMediaExtractor::releaseTrackSamples() { 2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mSelectedTracks.size(); ++i) { 2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(i); 2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mSample != NULL) { 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSample->release(); 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSample = NULL; 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSampleTimeUs = -1ll; 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2979d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huberssize_t NuMediaExtractor::fetchTrackSamples( 2989d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber int64_t seekTimeUs, MediaSource::ReadOptions::SeekMode mode) { 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *minInfo = NULL; 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t minIndex = -1; 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mSelectedTracks.size(); ++i) { 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(i); 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (seekTimeUs >= 0ll) { 3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mFinalResult = OK; 3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mSample != NULL) { 3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSample->release(); 3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSample = NULL; 3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSampleTimeUs = -1ll; 3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (info->mFinalResult != OK) { 3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber continue; 3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mSample == NULL) { 3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber MediaSource::ReadOptions options; 3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (seekTimeUs >= 0ll) { 3209d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber options.setSeekTo(seekTimeUs, mode); 3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = info->mSource->read(&info->mSample, &options); 3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mSample == NULL); 3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mFinalResult = err; 3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSampleTimeUs = -1ll; 3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber continue; 3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mSample != NULL); 3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mSample->meta_data()->findInt64( 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber kKeyTime, &info->mSampleTimeUs)); 3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (minInfo == NULL || info->mSampleTimeUs < minInfo->mSampleTimeUs) { 3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber minInfo = info; 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber minIndex = i; 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber return minIndex; 3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3469d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huberstatus_t NuMediaExtractor::seekTo( 3479d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber int64_t timeUs, MediaSource::ReadOptions::SeekMode mode) { 348dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 349dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 3509d07855aaff8a6b502a3ab058002cdd4a278b965Andreas Huber ssize_t minIndex = fetchTrackSamples(timeUs, mode); 3514835705370584f6904c80afebcc6e8b9fdb110a5Andreas Huber 3524835705370584f6904c80afebcc6e8b9fdb110a5Andreas Huber if (minIndex < 0) { 3534835705370584f6904c80afebcc6e8b9fdb110a5Andreas Huber return ERROR_END_OF_STREAM; 3544835705370584f6904c80afebcc6e8b9fdb110a5Andreas Huber } 3554835705370584f6904c80afebcc6e8b9fdb110a5Andreas Huber 3564835705370584f6904c80afebcc6e8b9fdb110a5Andreas Huber return OK; 3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t NuMediaExtractor::advance() { 360dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 361dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t minIndex = fetchTrackSamples(); 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (minIndex < 0) { 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_END_OF_STREAM; 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(minIndex); 3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSample->release(); 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSample = NULL; 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSampleTimeUs = -1ll; 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3775778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t NuMediaExtractor::readSampleData(const sp<ABuffer> &buffer) { 378dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 379dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t minIndex = fetchTrackSamples(); 3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (minIndex < 0) { 3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_END_OF_STREAM; 3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(minIndex); 3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t sampleSize = info->mSample->range_length(); 3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 390ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (info->mTrackFlags & kIsVorbis) { 3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Each sample's data is suffixed by the number of page samples 3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber // or -1 if not available. 3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleSize += sizeof(int32_t); 3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer->capacity() < sampleSize) { 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ENOMEM; 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber const uint8_t *src = 4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber (const uint8_t *)info->mSample->data() 4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber + info->mSample->range_offset(); 4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber memcpy((uint8_t *)buffer->data(), src, info->mSample->range_length()); 4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 406ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (info->mTrackFlags & kIsVorbis) { 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t numPageSamples; 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!info->mSample->meta_data()->findInt32( 4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber kKeyValidSamples, &numPageSamples)) { 4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber numPageSamples = -1; 4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber memcpy((uint8_t *)buffer->data() + info->mSample->range_length(), 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber &numPageSamples, 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sizeof(numPageSamples)); 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->setRange(0, sampleSize); 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4235778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t NuMediaExtractor::getSampleTrackIndex(size_t *trackIndex) { 424dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 425dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t minIndex = fetchTrackSamples(); 4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (minIndex < 0) { 4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_END_OF_STREAM; 4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(minIndex); 4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber *trackIndex = info->mTrackIndex; 4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4385778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t NuMediaExtractor::getSampleTime(int64_t *sampleTimeUs) { 439dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 440dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t minIndex = fetchTrackSamples(); 4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (minIndex < 0) { 4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_END_OF_STREAM; 4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(minIndex); 4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber *sampleTimeUs = info->mSampleTimeUs; 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 453f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huberstatus_t NuMediaExtractor::getSampleMeta(sp<MetaData> *sampleMeta) { 454dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 455dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 456f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huber *sampleMeta = NULL; 457f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huber 458ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ssize_t minIndex = fetchTrackSamples(); 459ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 460ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (minIndex < 0) { 461ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return ERROR_END_OF_STREAM; 462ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 463ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 464ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber TrackInfo *info = &mSelectedTracks.editItemAt(minIndex); 465f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huber *sampleMeta = info->mSample->meta_data(); 466ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 467ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 468ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 469ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 470a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huberbool NuMediaExtractor::getTotalBitrate(int64_t *bitrate) const { 471a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber if (mTotalBitrate >= 0) { 472a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber *bitrate = mTotalBitrate; 473a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber return true; 474a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber } 475a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 476a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber off64_t size; 477a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber if (mDurationUs >= 0 && mDataSource->getSize(&size) == OK) { 478a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber *bitrate = size * 8000000ll / mDurationUs; // in bits/sec 479a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber return true; 480a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber } 481a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 482a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber return false; 483a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber} 484a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 485a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber// Returns true iff cached duration is available/applicable. 486a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huberbool NuMediaExtractor::getCachedDuration( 487a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber int64_t *durationUs, bool *eos) const { 488dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber Mutex::Autolock autoLock(mLock); 489dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber 490a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber int64_t bitrate; 491a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber if (mIsWidevineExtractor) { 492a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber sp<WVMExtractor> wvmExtractor = 493a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber static_cast<WVMExtractor *>(mImpl.get()); 494a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 495a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber status_t finalStatus; 496a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber *durationUs = wvmExtractor->getCachedDurationUs(&finalStatus); 497a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber *eos = (finalStatus != OK); 498a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber return true; 499a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber } else if ((mDataSource->flags() & DataSource::kIsCachingDataSource) 500a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber && getTotalBitrate(&bitrate)) { 501a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber sp<NuCachedSource2> cachedSource = 502a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber static_cast<NuCachedSource2 *>(mDataSource.get()); 503a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 504a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber status_t finalStatus; 505a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber size_t cachedDataRemaining = 506a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber cachedSource->approxDataRemaining(&finalStatus); 507a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 508a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber *durationUs = cachedDataRemaining * 8000000ll / bitrate; 509a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber *eos = (finalStatus != OK); 510a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber return true; 511a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber } 512a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 513a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber return false; 514a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber} 515a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 517