153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia/* 253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Copyright 2017 The Android Open Source Project 353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Licensed under the Apache License, Version 2.0 (the "License"); 553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * you may not use this file except in compliance with the License. 653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * You may obtain a copy of the License at 753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * http://www.apache.org/licenses/LICENSE-2.0 953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 1053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Unless required by applicable law or agreed to in writing, software 1153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * distributed under the License is distributed on an "AS IS" BASIS, 1253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * See the License for the specific language governing permissions and 1453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * limitations under the License. 1553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia */ 1653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia//#define LOG_NDEBUG 0 182409c87361b78ec733e2481c52198bea245fe1daWei Jia#define LOG_TAG "GenericSource2" 1953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 202409c87361b78ec733e2481c52198bea245fe1daWei Jia#include "GenericSource2.h" 2153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "NuPlayer2Drm.h" 2253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "AnotherPacketSource.h" 2453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <binder/IServiceManager.h> 2553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <cutils/properties.h> 2653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/DataSource.h> 27bc8f53b8c1c220d9ce01526b6e3834f14af98ed5Dongwon Kang#include <media/MediaBufferHolder.h> 2853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/IMediaExtractorService.h> 2949ce671c4efa4c5d038351ca441e34c5afa5241fDongwon Kang#include <media/IMediaSource.h> 3053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/MediaHTTPService.h> 3153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/MediaExtractor.h> 3253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/MediaSource.h> 3328288fb0b1da843cdd37edab0cdecff32abacdceWei Jia#include <media/NdkWrapper.h> 3453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/foundation/ABuffer.h> 3553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/foundation/ADebug.h> 3653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/foundation/AMessage.h> 3753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/DataSourceFactory.h> 3853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/InterfaceUtils.h> 3953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/MediaBuffer.h> 4053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/MediaClock.h> 4153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/MediaDefs.h> 4253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/MediaExtractorFactory.h> 4353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/MetaData.h> 440cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih#include <media/stagefright/NdkUtils.h> 4553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/Utils.h> 4653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "../../libstagefright/include/NuCachedSource2.h" 4753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "../../libstagefright/include/HTTPBase.h" 4853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jianamespace android { 5053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastatic const int kInitialMarkMs = 5000; // 5secs 5253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia//static const int kPausePlaybackMarkMs = 2000; // 2secs 5453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastatic const int kResumePlaybackMarkMs = 15000; // 15secs 5553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 562409c87361b78ec733e2481c52198bea245fe1daWei JiaNuPlayer2::GenericSource2::GenericSource2( 5753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const sp<AMessage> ¬ify, 5853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uid_t uid, 5953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const sp<MediaClock> &mediaClock) 6053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia : Source(notify), 6153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioTimeUs(0), 6253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioLastDequeueTimeUs(0), 6353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mVideoTimeUs(0), 6453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mVideoLastDequeueTimeUs(0), 6553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPrevBufferPercentage(-1), 6653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPollBufferingGeneration(0), 6753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mSentPauseOnBuffering(false), 6853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioDataGeneration(0), 6953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mVideoDataGeneration(0), 7053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchSubtitleDataGeneration(0), 7153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchTimedTextDataGeneration(0), 7253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDurationUs(-1ll), 7353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioIsVorbis(false), 7453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsSecure(false), 7553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsStreaming(false), 7653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mUID(uid), 7753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mMediaClock(mediaClock), 7853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFd(-1), 7953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mBitrate(-1ll), 8053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPendingReadBufferTypes(0) { 812409c87361b78ec733e2481c52198bea245fe1daWei Jia ALOGV("GenericSource2"); 8253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(mediaClock != NULL); 8353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mBufferingSettings.mInitialMarkMs = kInitialMarkMs; 8553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mBufferingSettings.mResumePlaybackMarkMs = kResumePlaybackMarkMs; 8653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia resetDataSource(); 8753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 8853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 892409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::resetDataSource() { 9053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("resetDataSource"); 9153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mHTTPService.clear(); 9353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mHttpSource.clear(); 9453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDisconnected = false; 9553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mUri.clear(); 9653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mUriHeaders.clear(); 9753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mFd >= 0) { 9853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia close(mFd); 9953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFd = -1; 10053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 10153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mOffset = 0; 10253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLength = 0; 10353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mStarted = false; 10453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPreparing = false; 10553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 10653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsDrmProtected = false; 10753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsDrmReleased = false; 10853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsSecure = false; 10953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mMimes.clear(); 11053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 11153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1122409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::setDataSource( 11353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const sp<MediaHTTPService> &httpService, 11453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const char *url, 11553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const KeyedVector<String8, String8> *headers) { 11653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 11753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("setDataSource url: %s", url); 11853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia resetDataSource(); 12053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mHTTPService = httpService; 12253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mUri = url; 12353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (headers) { 12553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mUriHeaders = *headers; 12653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 12753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // delay data source creation to prepareAsync() to avoid blocking 12953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // the calling thread in setDataSource for any significant time. 13053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 13153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 13253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1332409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::setDataSource( 13453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int fd, int64_t offset, int64_t length) { 13553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 13653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("setDataSource %d/%lld/%lld", fd, (long long)offset, (long long)length); 13753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia resetDataSource(); 13953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFd = dup(fd); 14153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mOffset = offset; 14253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLength = length; 14353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // delay data source creation to prepareAsync() to avoid blocking 14553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // the calling thread in setDataSource for any significant time. 14653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 14753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 14853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1492409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::setDataSource(const sp<DataSource>& source) { 15053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 15153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("setDataSource (source: %p)", source.get()); 15253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 15353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia resetDataSource(); 15453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDataSource = source; 15553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 15653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 15753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1582409c87361b78ec733e2481c52198bea245fe1daWei Jiasp<MetaData> NuPlayer2::GenericSource2::getFileFormatMeta() const { 15953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 16053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return mFileMeta; 16153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 16253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1632409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::initFromDataSource() { 1640cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mExtractor = new AMediaExtractorWrapper(AMediaExtractor_new()); 1650cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih CHECK(mDataSource != NULL || mFd != -1); 16653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<DataSource> dataSource = mDataSource; 1670cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih const int fd = mFd; 1680cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih const int64_t offset = mOffset; 1690cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih const int64_t length = mLength; 17053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 17153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLock.unlock(); 17253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // This might take long time if data source is not reliable. 1730cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih status_t err; 1740cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (dataSource != nullptr) { 1750cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mDataSourceWrapper = new AMediaDataSourceWrapper(dataSource); 1760cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih err = mExtractor->setDataSource(mDataSourceWrapper->getAMediaDataSource()); 1770cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } else { 1780cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih err = mExtractor->setDataSource(fd, offset, length); 1790cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } 18053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1810cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (err != OK) { 1820cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih ALOGE("initFromDataSource, failed to create data source!"); 1830cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mLock.lock(); 18453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return UNKNOWN_ERROR; 18553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 18653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1870cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih size_t numtracks = mExtractor->getTrackCount(); 18853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (numtracks == 0) { 18953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("initFromDataSource, source has no track!"); 1900cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mLock.lock(); 19153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return UNKNOWN_ERROR; 19253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 19353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 19453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLock.lock(); 1950cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mFd = -1; 1960cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mDataSource = dataSource; 1970cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mFileMeta = convertMediaFormatWrapperToMetaData(mExtractor->getFormat()); 19853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mFileMeta != NULL) { 19953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t duration; 20053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mFileMeta->findInt64(kKeyDuration, &duration)) { 20153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDurationUs = duration; 20253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 20353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 20453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 20553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t totalBitrate = 0; 20653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 20753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mMimes.clear(); 20853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 20953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia for (size_t i = 0; i < numtracks; ++i) { 21053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2110cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMediaFormatWrapper> trackFormat = mExtractor->getTrackFormat(i); 2120cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (trackFormat == NULL) { 21353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("no metadata for track %zu", i); 21453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return UNKNOWN_ERROR; 21553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 21653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2170cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMediaExtractorWrapper> trackExtractor = new AMediaExtractorWrapper(AMediaExtractor_new()); 2180cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mDataSourceWrapper != nullptr) { 2190cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih err = trackExtractor->setDataSource(mDataSourceWrapper->getAMediaDataSource()); 2200cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } else { 2210cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih err = trackExtractor->setDataSource(fd, offset, length); 2220cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } 2230cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 22453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const char *mime; 2250cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<MetaData> meta = convertMediaFormatWrapperToMetaData(trackFormat); 22653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(meta->findCString(kKeyMIMEType, &mime)); 22753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 22853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("initFromDataSource track[%zu]: %s", i, mime); 22953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 23053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Do the string compare immediately with "mime", 23153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // we can't assume "mime" would stay valid after another 23253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // extractor operation, some extractors might modify meta 23353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // during getTrack() and make it invalid. 23453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!strncasecmp(mime, "audio/", 6)) { 2350cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mAudioTrack.mExtractor == NULL) { 23653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioTrack.mIndex = i; 2370cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mAudioTrack.mExtractor = trackExtractor; 2380cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mAudioTrack.mExtractor->selectTrack(i); 2390cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mAudioTrack.mPackets = new AnotherPacketSource(meta); 24053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 24153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { 24253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioIsVorbis = true; 24353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 24453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioIsVorbis = false; 24553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 24653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 24753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mMimes.add(String8(mime)); 24853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 24953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else if (!strncasecmp(mime, "video/", 6)) { 2500cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mVideoTrack.mExtractor == NULL) { 25153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mVideoTrack.mIndex = i; 2520cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mVideoTrack.mExtractor = trackExtractor; 2530cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mVideoTrack.mExtractor->selectTrack(i); 2540cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mVideoTrack.mPackets = new AnotherPacketSource(meta); 25553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 25653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // video always at the beginning 25753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mMimes.insertAt(String8(mime), 0); 25853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 25953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 26053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2610cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mExtractors.push(trackExtractor); 26253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t durationUs; 26353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (meta->findInt64(kKeyDuration, &durationUs)) { 26453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (durationUs > mDurationUs) { 26553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDurationUs = durationUs; 26653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 26753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 26853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 26953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t bitrate; 27053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (totalBitrate >= 0 && meta->findInt32(kKeyBitRate, &bitrate)) { 27153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia totalBitrate += bitrate; 27253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 27353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia totalBitrate = -1; 27453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 27553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 27653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2770cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih ALOGV("initFromDataSource mExtractors.size(): %zu mIsSecure: %d mime[0]: %s", mExtractors.size(), 27853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsSecure, (mMimes.isEmpty() ? "NONE" : mMimes[0].string())); 27953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2800cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mExtractors.size() == 0) { 28153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("b/23705695"); 28253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return UNKNOWN_ERROR; 28353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 28453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 28553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Modular DRM: The return value doesn't affect source initialization. 28653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia (void)checkDrmInfo(); 28753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 28853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mBitrate = totalBitrate; 28953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 29053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 29153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 29253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2932409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::getBufferingSettings( 29453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia BufferingSettings* buffering /* nonnull */) { 29553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 29653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 29753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *buffering = mBufferingSettings; 29853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 29953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 30053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("getBufferingSettings{%s}", buffering->toString().string()); 30153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 30253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 30353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3042409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::setBufferingSettings(const BufferingSettings& buffering) { 30553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("setBufferingSettings{%s}", buffering.toString().string()); 30653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 30753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 30853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mBufferingSettings = buffering; 30953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 31053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 31153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3122409c87361b78ec733e2481c52198bea245fe1daWei Jiaint64_t NuPlayer2::GenericSource2::getLastReadPosition() { 3130cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mAudioTrack.mExtractor != NULL) { 31453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return mAudioTimeUs; 3150cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } else if (mVideoTrack.mExtractor != NULL) { 31653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return mVideoTimeUs; 31753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 31853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return 0; 31953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 32053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 32153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3222409c87361b78ec733e2481c52198bea245fe1daWei Jiabool NuPlayer2::GenericSource2::isStreaming() const { 32353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 32453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return mIsStreaming; 32553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 32653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3272409c87361b78ec733e2481c52198bea245fe1daWei JiaNuPlayer2::GenericSource2::~GenericSource2() { 3282409c87361b78ec733e2481c52198bea245fe1daWei Jia ALOGV("~GenericSource2"); 32953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mLooper != NULL) { 33053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLooper->unregisterHandler(id()); 33153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLooper->stop(); 33253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 33317459336d0ce08a6b9c3b679fdccbf83c26f1ef5Wei Jia if (mDataSource != NULL) { 33417459336d0ce08a6b9c3b679fdccbf83c26f1ef5Wei Jia mDataSource->close(); 33517459336d0ce08a6b9c3b679fdccbf83c26f1ef5Wei Jia } 33653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia resetDataSource(); 33753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 33853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3392409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::prepareAsync() { 34053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 34153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("prepareAsync: (looper: %d)", (mLooper != NULL)); 34253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 34353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mLooper == NULL) { 34453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLooper = new ALooper; 34553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLooper->setName("generic"); 346c5c79dacf6664f2c86704b75003dd13ffeddfb45Wei Jia mLooper->start(false, /* runOnCallingThread */ 347c5c79dacf6664f2c86704b75003dd13ffeddfb45Wei Jia true, /* canCallJava */ 348c5c79dacf6664f2c86704b75003dd13ffeddfb45Wei Jia PRIORITY_DEFAULT); 34953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 35053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLooper->registerHandler(this); 35153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 35253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 35353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatPrepareAsync, this); 35453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->post(); 35553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 35653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3572409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::onPrepareAsync() { 35853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("onPrepareAsync: mDataSource: %d", (mDataSource != NULL)); 35953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 36053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // delayed data source creation 36153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mDataSource == NULL) { 36253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // set to false first, if the extractor 36353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // comes back as secure, set it to true then. 36453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsSecure = false; 36553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 36653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!mUri.empty()) { 36753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const char* uri = mUri.c_str(); 36853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia String8 contentType; 36953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 37053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!strncasecmp("http://", uri, 7) || !strncasecmp("https://", uri, 8)) { 37153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mHttpSource = DataSourceFactory::CreateMediaHTTP(mHTTPService); 37253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mHttpSource == NULL) { 37353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("Failed to create http source!"); 37453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyPreparedAndCleanup(UNKNOWN_ERROR); 37553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 37653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 37753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 37853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 37953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLock.unlock(); 38053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // This might take long time if connection has some issue. 38153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<DataSource> dataSource = DataSourceFactory::CreateFromURI( 38253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mHTTPService, uri, &mUriHeaders, &contentType, 38353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia static_cast<HTTPBase *>(mHttpSource.get())); 38453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLock.lock(); 38553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!mDisconnected) { 38653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDataSource = dataSource; 38753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 38853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 38953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3900cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mFd == -1 && mDataSource == NULL) { 39153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("Failed to create data source!"); 39253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyPreparedAndCleanup(UNKNOWN_ERROR); 39353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 39453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 39553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 39653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3970cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mDataSource != nullptr && mDataSource->flags() & DataSource::kIsCachingDataSource) { 39853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get()); 39953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 40053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 40153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // For cached streaming cases, we need to wait for enough 40253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // buffering before reporting prepared. 40353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsStreaming = (mCachedSource != NULL); 40453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 40553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // init extractor from data source 40653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t err = initFromDataSource(); 40753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 40853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (err != OK) { 40953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("Failed to init from data source!"); 41053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyPreparedAndCleanup(err); 41153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 41253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 41353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4140cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mVideoTrack.mExtractor != NULL) { 41553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<MetaData> meta = getFormatMeta_l(false /* audio */); 41653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage; 41753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia err = convertMetaDataToMessage(meta, &msg); 41853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if(err != OK) { 41953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyPreparedAndCleanup(err); 42053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 42153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 42253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyVideoSizeChanged(msg); 42353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 42453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 42553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyFlagsChanged( 42653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // FLAG_SECURE will be known if/when prepareDrm is called by the app 42753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // FLAG_PROTECTED will be known if/when prepareDrm is called by the app 42853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia FLAG_CAN_PAUSE | 42953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia FLAG_CAN_SEEK_BACKWARD | 43053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia FLAG_CAN_SEEK_FORWARD | 43153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia FLAG_CAN_SEEK); 43253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 43353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia finishPrepareAsync(); 43453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 43553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("onPrepareAsync: Done"); 43653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 43753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4382409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::finishPrepareAsync() { 43953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("finishPrepareAsync"); 44053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 44153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mIsStreaming) { 44253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mCachedSource->resumeFetchingIfNecessary(); 44353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPreparing = true; 44453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia schedulePollBuffering(); 44553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 44653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyPrepared(); 44753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 44853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4490cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mAudioTrack.mExtractor != NULL) { 45053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia postReadBuffer(MEDIA_TRACK_TYPE_AUDIO); 45153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 45253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4530cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mVideoTrack.mExtractor != NULL) { 45453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia postReadBuffer(MEDIA_TRACK_TYPE_VIDEO); 45553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 45653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 45753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4582409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::notifyPreparedAndCleanup(status_t err) { 45953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (err != OK) { 46053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDataSource.clear(); 46153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mCachedSource.clear(); 46253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mHttpSource.clear(); 46353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 46453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mBitrate = -1; 46553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPrevBufferPercentage = -1; 46653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ++mPollBufferingGeneration; 46753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 46853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyPrepared(err); 46953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 47053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4712409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::start() { 47253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 47353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGI("start"); 47453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4750cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mAudioTrack.mExtractor != NULL) { 47653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia postReadBuffer(MEDIA_TRACK_TYPE_AUDIO); 47753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 47853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4790cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mVideoTrack.mExtractor != NULL) { 48053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia postReadBuffer(MEDIA_TRACK_TYPE_VIDEO); 48153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 48253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 48353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mStarted = true; 48453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 48553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4862409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::stop() { 48753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 48853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mStarted = false; 48953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 49053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4912409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::pause() { 49253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 49353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mStarted = false; 49453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 49553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4962409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::resume() { 49753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 49853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mStarted = true; 49953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 50053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5012409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::disconnect() { 50253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<DataSource> dataSource, httpSource; 50353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 50453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 50553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia dataSource = mDataSource; 50653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia httpSource = mHttpSource; 50753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDisconnected = true; 50853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 50953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 51053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (dataSource != NULL) { 51153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // disconnect data source 51253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (dataSource->flags() & DataSource::kIsCachingDataSource) { 51353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia static_cast<NuCachedSource2 *>(dataSource.get())->disconnect(); 51453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 51553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else if (httpSource != NULL) { 51653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia static_cast<HTTPBase *>(httpSource.get())->disconnect(); 51753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 5180cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 5190cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mDataSourceWrapper = NULL; 5200cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 52153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 52253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5232409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::feedMoreTSData() { 52453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 52553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 52653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5272409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::sendCacheStats() { 52853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t kbps = 0; 52953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t err = UNKNOWN_ERROR; 53053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 53153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mCachedSource != NULL) { 53253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia err = mCachedSource->getEstimatedBandwidthKbps(&kbps); 53353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 53453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 53553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (err == OK) { 53653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> notify = dupNotify(); 53753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setInt32("what", kWhatCacheStats); 53853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setInt32("bandwidth", kbps); 53953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->post(); 54053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 54153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 54253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5432409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::onMessageReceived(const sp<AMessage> &msg) { 54453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 54553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia switch (msg->what()) { 54653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatPrepareAsync: 54753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 54853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia onPrepareAsync(); 54953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 55053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 55153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatFetchSubtitleData: 55253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 55353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia fetchTextData(kWhatSendSubtitleData, MEDIA_TRACK_TYPE_SUBTITLE, 55453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchSubtitleDataGeneration, mSubtitleTrack.mPackets, msg); 55553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 55653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 55753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 55853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatFetchTimedTextData: 55953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 56053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia fetchTextData(kWhatSendTimedTextData, MEDIA_TRACK_TYPE_TIMEDTEXT, 56153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchTimedTextDataGeneration, mTimedTextTrack.mPackets, msg); 56253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 56353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 56453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 56553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatSendSubtitleData: 56653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 56753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sendTextData(kWhatSubtitleData, MEDIA_TRACK_TYPE_SUBTITLE, 56853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchSubtitleDataGeneration, mSubtitleTrack.mPackets, msg); 56953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 57053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 57153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 57253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatSendGlobalTimedTextData: 57353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 57453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sendGlobalTextData(kWhatTimedTextData, mFetchTimedTextDataGeneration, msg); 57553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 57653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 57753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatSendTimedTextData: 57853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 57953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sendTextData(kWhatTimedTextData, MEDIA_TRACK_TYPE_TIMEDTEXT, 58053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchTimedTextDataGeneration, mTimedTextTrack.mPackets, msg); 58153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 58253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 58353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 58453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatChangeAVSource: 58553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 58653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t trackIndex; 58753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt32("trackIndex", &trackIndex)); 5880cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih const sp<AMediaExtractorWrapper> extractor = mExtractors.itemAt(trackIndex); 58953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 59053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Track* track; 5910cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih AString mime; 59253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia media_track_type trackType, counterpartType; 5930cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMediaFormatWrapper> format = extractor->getTrackFormat(trackIndex); 5940cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih format->getString(AMEDIAFORMAT_KEY_MIME, &mime); 5950cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (!strncasecmp(mime.c_str(), "audio/", 6)) { 59653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mAudioTrack; 59753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia trackType = MEDIA_TRACK_TYPE_AUDIO; 59853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia counterpartType = MEDIA_TRACK_TYPE_VIDEO;; 59953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 6000cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih CHECK(!strncasecmp(mime.c_str(), "video/", 6)); 60153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mVideoTrack; 60253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia trackType = MEDIA_TRACK_TYPE_VIDEO; 60353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia counterpartType = MEDIA_TRACK_TYPE_AUDIO;; 60453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 60553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 60653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 6070cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mExtractor = extractor; 6080cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mExtractor->selectSingleTrack(trackIndex); 60953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track->mIndex = trackIndex; 61053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ++mAudioDataGeneration; 61153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ++mVideoDataGeneration; 61253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 61353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t timeUs, actualTimeUs; 61453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const bool formatChange = true; 61553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (trackType == MEDIA_TRACK_TYPE_AUDIO) { 61653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia timeUs = mAudioLastDequeueTimeUs; 61753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 61853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia timeUs = mVideoLastDequeueTimeUs; 61953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 62053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia readBuffer(trackType, timeUs, MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC /* mode */, 62153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia &actualTimeUs, formatChange); 62253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia readBuffer(counterpartType, -1, MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC /* mode */, 62353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia NULL, !formatChange); 62453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("timeUs %lld actualTimeUs %lld", (long long)timeUs, (long long)actualTimeUs); 62553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 62653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 62753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 62853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 62953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatSeek: 63053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 63153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia onSeek(msg); 63253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 63353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 63453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 63553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatReadBuffer: 63653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 63753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia onReadBuffer(msg); 63853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 63953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 64053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 64153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case kWhatPollBuffering: 64253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia { 64353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t generation; 64453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt32("generation", &generation)); 64553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (generation == mPollBufferingGeneration) { 64653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia onPollBuffering(); 64753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 64853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 64953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 65053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 65153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia default: 65253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Source::onMessageReceived(msg); 65353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 65453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 65553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 65653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 6572409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::fetchTextData( 65853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint32_t sendWhat, 65953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia media_track_type type, 66053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t curGen, 66153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const sp<AnotherPacketSource>& packets, 66253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const sp<AMessage>& msg) { 66353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t msgGeneration; 66453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt32("generation", &msgGeneration)); 66553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (msgGeneration != curGen) { 66653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // stale 66753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 66853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 66953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 67053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t avail; 67153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (packets->hasBufferAvailable(&avail)) { 67253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 67353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 67453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 67553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t timeUs; 67653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt64("timeUs", &timeUs)); 67753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 67853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t subTimeUs = 0; 67953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia readBuffer(type, timeUs, MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC /* mode */, &subTimeUs); 68053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 68153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t eosResult; 68253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!packets->hasBufferAvailable(&eosResult)) { 68353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 68453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 68553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 68653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (msg->what() == kWhatFetchSubtitleData) { 68753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia subTimeUs -= 1000000ll; // send subtile data one second earlier 68853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 68953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg2 = new AMessage(sendWhat, this); 69053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg2->setInt32("generation", msgGeneration); 69153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mMediaClock->addTimer(msg2, subTimeUs); 69253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 69353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 6942409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::sendTextData( 69553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint32_t what, 69653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia media_track_type type, 69753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t curGen, 69853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const sp<AnotherPacketSource>& packets, 69953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const sp<AMessage>& msg) { 70053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t msgGeneration; 70153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt32("generation", &msgGeneration)); 70253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (msgGeneration != curGen) { 70353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // stale 70453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 70553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 70653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 70753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t subTimeUs; 70853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (packets->nextBufferTime(&subTimeUs) != OK) { 70953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 71053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 71153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 71253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t nextSubTimeUs; 71353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia readBuffer(type, -1, MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC /* mode */, &nextSubTimeUs); 71453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 71553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<ABuffer> buffer; 71653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t dequeueStatus = packets->dequeueAccessUnit(&buffer); 71753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (dequeueStatus == OK) { 71853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> notify = dupNotify(); 71953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setInt32("what", what); 72053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setBuffer("buffer", buffer); 72153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->post(); 72253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 72353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (msg->what() == kWhatSendSubtitleData) { 72453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia nextSubTimeUs -= 1000000ll; // send subtile data one second earlier 72553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 72653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mMediaClock->addTimer(msg, nextSubTimeUs); 72753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 72853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 72953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7302409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::sendGlobalTextData( 73153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint32_t what, 73253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t curGen, 73353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg) { 73453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t msgGeneration; 73553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt32("generation", &msgGeneration)); 73653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (msgGeneration != curGen) { 73753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // stale 73853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 73953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 74053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7410cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih void *data = NULL; 74253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia size_t size = 0; 7430cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mTimedTextTrack.mExtractor->getTrackFormat(mTimedTextTrack.mIndex)->getBuffer( 7440cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih "text", &data, &size)) { 74553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mGlobalTimedText = new ABuffer(size); 74653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mGlobalTimedText->data()) { 74753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia memcpy(mGlobalTimedText->data(), data, size); 74853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> globalMeta = mGlobalTimedText->meta(); 74953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia globalMeta->setInt64("timeUs", 0); 75053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia globalMeta->setString("mime", MEDIA_MIMETYPE_TEXT_3GPP); 75153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia globalMeta->setInt32("global", 1); 75253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> notify = dupNotify(); 75353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setInt32("what", what); 75453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setBuffer("buffer", mGlobalTimedText); 75553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->post(); 75653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 75753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 75853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 75953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7600cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shihsp<AMessage> NuPlayer2::GenericSource2::getFormat(bool audio) { 7610cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih Mutex::Autolock _l(mLock); 7620cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih return getFormat_l(audio); 7630cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih} 7640cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 7652409c87361b78ec733e2481c52198bea245fe1daWei Jiasp<MetaData> NuPlayer2::GenericSource2::getFormatMeta(bool audio) { 76653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 76753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return getFormatMeta_l(audio); 76853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 76953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7700cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shihsp<AMessage> NuPlayer2::GenericSource2::getFormat_l(bool audio) { 7710cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMediaExtractorWrapper> extractor = audio ? mAudioTrack.mExtractor : mVideoTrack.mExtractor; 7720cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih size_t trackIndex = audio ? mAudioTrack.mIndex : mVideoTrack.mIndex; 7730cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 7740cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (extractor == NULL) { 7750cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih return NULL; 7760cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } 7770cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 7780cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih return extractor->getTrackFormat(trackIndex)->toAMessage(); 7790cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih} 7800cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 7812409c87361b78ec733e2481c52198bea245fe1daWei Jiasp<MetaData> NuPlayer2::GenericSource2::getFormatMeta_l(bool audio) { 7820cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMediaExtractorWrapper> extractor = audio ? mAudioTrack.mExtractor : mVideoTrack.mExtractor; 7830cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih size_t trackIndex = audio ? mAudioTrack.mIndex : mVideoTrack.mIndex; 78453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7850cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (extractor == NULL) { 78653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return NULL; 78753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 78853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7890cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih return convertMediaFormatWrapperToMetaData(extractor->getTrackFormat(trackIndex)); 79053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 79153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7922409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::dequeueAccessUnit( 79353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bool audio, sp<ABuffer> *accessUnit) { 79453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 79553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // If has gone through stop/releaseDrm sequence, we no longer send down any buffer b/c 79653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // the codec's crypto object has gone away (b/37960096). 79753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Note: This will be unnecessary when stop() changes behavior and releases codec (b/35248283). 79853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!mStarted && mIsDrmReleased) { 79953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return -EWOULDBLOCK; 80053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 80153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 80253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Track *track = audio ? &mAudioTrack : &mVideoTrack; 80353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8040cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (track->mExtractor == NULL) { 80553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return -EWOULDBLOCK; 80653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 80753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 80853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t finalResult; 80953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!track->mPackets->hasBufferAvailable(&finalResult)) { 81053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (finalResult == OK) { 81153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia postReadBuffer( 81253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia audio ? MEDIA_TRACK_TYPE_AUDIO : MEDIA_TRACK_TYPE_VIDEO); 81353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return -EWOULDBLOCK; 81453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 81553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return finalResult; 81653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 81753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 81853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t result = track->mPackets->dequeueAccessUnit(accessUnit); 81953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 82053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // start pulling in more buffers if cache is running low 82153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // so that decoder has less chance of being starved 82253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!mIsStreaming) { 82353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (track->mPackets->getAvailableBufferCount(&finalResult) < 2) { 82453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia postReadBuffer(audio? MEDIA_TRACK_TYPE_AUDIO : MEDIA_TRACK_TYPE_VIDEO); 82553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 82653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 82753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t durationUs = track->mPackets->getBufferedDurationUs(&finalResult); 82853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // TODO: maxRebufferingMarkMs could be larger than 82953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // mBufferingSettings.mResumePlaybackMarkMs 83053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t restartBufferingMarkUs = 83153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mBufferingSettings.mResumePlaybackMarkMs * 1000ll / 2; 83253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (finalResult == OK) { 83353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (durationUs < restartBufferingMarkUs) { 83453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia postReadBuffer(audio? MEDIA_TRACK_TYPE_AUDIO : MEDIA_TRACK_TYPE_VIDEO); 83553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 83653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (track->mPackets->getAvailableBufferCount(&finalResult) < 2 83753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia && !mSentPauseOnBuffering && !mPreparing) { 83853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mCachedSource->resumeFetchingIfNecessary(); 83953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sendCacheStats(); 84053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mSentPauseOnBuffering = true; 84153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> notify = dupNotify(); 84253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setInt32("what", kWhatPauseOnBufferingStart); 84353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->post(); 84453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 84553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 84653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 84753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 84853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (result != OK) { 8490cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mSubtitleTrack.mExtractor != NULL) { 85053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mSubtitleTrack.mPackets->clear(); 85153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchSubtitleDataGeneration++; 85253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 8530cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mTimedTextTrack.mExtractor != NULL) { 85453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mTimedTextTrack.mPackets->clear(); 85553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchTimedTextDataGeneration++; 85653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 85753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return result; 85853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 85953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 86053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t timeUs; 86153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t eosResult; // ignored 86253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK((*accessUnit)->meta()->findInt64("timeUs", &timeUs)); 86353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (audio) { 86453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioLastDequeueTimeUs = timeUs; 86553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 86653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mVideoLastDequeueTimeUs = timeUs; 86753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 86853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8690cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mSubtitleTrack.mExtractor != NULL 87053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia && !mSubtitleTrack.mPackets->hasBufferAvailable(&eosResult)) { 87153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatFetchSubtitleData, this); 87253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt64("timeUs", timeUs); 87353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt32("generation", mFetchSubtitleDataGeneration); 87453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->post(); 87553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 87653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8770cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mTimedTextTrack.mExtractor != NULL 87853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia && !mTimedTextTrack.mPackets->hasBufferAvailable(&eosResult)) { 87953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatFetchTimedTextData, this); 88053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt64("timeUs", timeUs); 88153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt32("generation", mFetchTimedTextDataGeneration); 88253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->post(); 88353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 88453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 88553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return result; 88653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 88753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8882409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::getDuration(int64_t *durationUs) { 88953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 89053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *durationUs = mDurationUs; 89153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 89253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 89353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8942409c87361b78ec733e2481c52198bea245fe1daWei Jiasize_t NuPlayer2::GenericSource2::getTrackCount() const { 89553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 8960cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih return mExtractors.size(); 89753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 89853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8992409c87361b78ec733e2481c52198bea245fe1daWei Jiasp<AMessage> NuPlayer2::GenericSource2::getTrackInfo(size_t trackIndex) const { 90053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 9010cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih size_t trackCount = mExtractors.size(); 90253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (trackIndex >= trackCount) { 90353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return NULL; 90453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 90553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9060cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMessage> format = mExtractors.itemAt(trackIndex)->getTrackFormat(trackIndex)->toAMessage(); 9070cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (format == NULL) { 90853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("no metadata for track %zu", trackIndex); 90953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return NULL; 91053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 91153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9120cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih AString mime; 9130cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih CHECK(format->findString(AMEDIAFORMAT_KEY_MIME, &mime)); 91453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 91553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t trackType; 9160cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (!strncasecmp(mime.c_str(), "video/", 6)) { 91753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia trackType = MEDIA_TRACK_TYPE_VIDEO; 9180cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } else if (!strncasecmp(mime.c_str(), "audio/", 6)) { 91953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia trackType = MEDIA_TRACK_TYPE_AUDIO; 9200cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_TEXT_3GPP)) { 92153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia trackType = MEDIA_TRACK_TYPE_TIMEDTEXT; 92253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 92353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia trackType = MEDIA_TRACK_TYPE_UNKNOWN; 92453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 92553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia format->setInt32("type", trackType); 92653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9270cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih AString lang; 9280cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (!format->findString("language", &lang)) { 9290cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih format->setString("language", "und"); 93053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 93153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 93253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (trackType == MEDIA_TRACK_TYPE_SUBTITLE) { 93353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t isAutoselect = 1, isDefault = 0, isForced = 0; 9340cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih format->findInt32(AMEDIAFORMAT_KEY_IS_AUTOSELECT, &isAutoselect); 9350cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih format->findInt32(AMEDIAFORMAT_KEY_IS_DEFAULT, &isDefault); 9360cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih format->findInt32(AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE, &isForced); 93753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 93853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia format->setInt32("auto", !!isAutoselect); 93953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia format->setInt32("default", !!isDefault); 94053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia format->setInt32("forced", !!isForced); 94153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 94253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 94353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return format; 94453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 94553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9462409c87361b78ec733e2481c52198bea245fe1daWei Jiassize_t NuPlayer2::GenericSource2::getSelectedTrack(media_track_type type) const { 94753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 94853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const Track *track = NULL; 94953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia switch (type) { 95053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_VIDEO: 95153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mVideoTrack; 95253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 95353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_AUDIO: 95453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mAudioTrack; 95553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 95653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_TIMEDTEXT: 95753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mTimedTextTrack; 95853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 95953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_SUBTITLE: 96053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mSubtitleTrack; 96153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 96253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia default: 96353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 96453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 96553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9660cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (track != NULL && track->mExtractor != NULL) { 96753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return track->mIndex; 96853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 96953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 97053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return -1; 97153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 97253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9732409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::selectTrack(size_t trackIndex, bool select, int64_t timeUs) { 97453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 97553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("%s track: %zu", select ? "select" : "deselect", trackIndex); 97653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9770cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (trackIndex >= mExtractors.size()) { 97853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return BAD_INDEX; 97953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 98053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 98153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!select) { 98253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Track* track = NULL; 9830cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mSubtitleTrack.mExtractor != NULL && trackIndex == mSubtitleTrack.mIndex) { 98453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mSubtitleTrack; 98553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchSubtitleDataGeneration++; 9860cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } else if (mTimedTextTrack.mExtractor != NULL && trackIndex == mTimedTextTrack.mIndex) { 98753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mTimedTextTrack; 98853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchTimedTextDataGeneration++; 98953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 99053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (track == NULL) { 99153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 99253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 9930cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mExtractor = NULL; 99453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track->mPackets->clear(); 99553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 99653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 99753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9980cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih const sp<AMediaExtractorWrapper> extractor = mExtractors.itemAt(trackIndex); 9990cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<MetaData> meta = convertMediaFormatWrapperToMetaData(extractor->getTrackFormat(trackIndex)); 100053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const char *mime; 100153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(meta->findCString(kKeyMIMEType, &mime)); 100253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (!strncasecmp(mime, "text/", 5)) { 100353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bool isSubtitle = strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP); 100453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Track *track = isSubtitle ? &mSubtitleTrack : &mTimedTextTrack; 10050cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (track->mExtractor != NULL && track->mIndex == trackIndex) { 100653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 100753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 100853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track->mIndex = trackIndex; 10090cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mExtractor = mExtractors.itemAt(trackIndex); 10100cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mExtractor->selectSingleTrack(trackIndex); 101153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (track->mPackets == NULL) { 10120cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mPackets = new AnotherPacketSource(meta); 101353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 101453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track->mPackets->clear(); 10150cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mPackets->setFormat(meta); 101653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 101753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 101853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 101953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (isSubtitle) { 102053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchSubtitleDataGeneration++; 102153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 102253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchTimedTextDataGeneration++; 102353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 102453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 102553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t eosResult; // ignored 10260cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mSubtitleTrack.mExtractor != NULL 102753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia && !mSubtitleTrack.mPackets->hasBufferAvailable(&eosResult)) { 102853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatFetchSubtitleData, this); 102953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt64("timeUs", timeUs); 103053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt32("generation", mFetchSubtitleDataGeneration); 103153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->post(); 103253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 103353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 103453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg2 = new AMessage(kWhatSendGlobalTimedTextData, this); 103553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg2->setInt32("generation", mFetchTimedTextDataGeneration); 103653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg2->post(); 103753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 10380cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mTimedTextTrack.mExtractor != NULL 103953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia && !mTimedTextTrack.mPackets->hasBufferAvailable(&eosResult)) { 104053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatFetchTimedTextData, this); 104153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt64("timeUs", timeUs); 104253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt32("generation", mFetchTimedTextDataGeneration); 104353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->post(); 104453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 104553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 104653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 104753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else if (!strncasecmp(mime, "audio/", 6) || !strncasecmp(mime, "video/", 6)) { 104853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bool audio = !strncasecmp(mime, "audio/", 6); 104953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Track *track = audio ? &mAudioTrack : &mVideoTrack; 10500cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (track->mExtractor != NULL && track->mIndex == trackIndex) { 105153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 105253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 105353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 105453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatChangeAVSource, this); 105553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt32("trackIndex", trackIndex); 105653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->post(); 105753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 105853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 105953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 106053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return INVALID_OPERATION; 106153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 106253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 10632409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::seekTo(int64_t seekTimeUs, MediaPlayer2SeekMode mode) { 106453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("seekTo: %lld, %d", (long long)seekTimeUs, mode); 106553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatSeek, this); 106653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt64("seekTimeUs", seekTimeUs); 106753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt32("mode", mode); 106853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 106953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Need to call readBuffer on |mLooper| to ensure the calls to 107053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // IMediaSource::read* are serialized. Note that IMediaSource::read* 107153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // is called without |mLock| acquired and MediaSource is not thread safe. 107253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> response; 107353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t err = msg->postAndAwaitResponse(&response); 107453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (err == OK && response != NULL) { 107553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(response->findInt32("err", &err)); 107653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 107753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 107853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return err; 107953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 108053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 10812409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::onSeek(const sp<AMessage>& msg) { 108253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t seekTimeUs; 108353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t mode; 108453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 108553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt32("mode", &mode)); 108653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 108753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> response = new AMessage; 108853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t err = doSeek(seekTimeUs, (MediaPlayer2SeekMode)mode); 108953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia response->setInt32("err", err); 109053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 109153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AReplyToken> replyID; 109253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->senderAwaitsResponse(&replyID)); 109353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia response->postReply(replyID); 109453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 109553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 10962409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::doSeek(int64_t seekTimeUs, MediaPlayer2SeekMode mode) { 10970cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mVideoTrack.mExtractor != NULL) { 109853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ++mVideoDataGeneration; 109953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 110053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t actualTimeUs; 110153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia readBuffer(MEDIA_TRACK_TYPE_VIDEO, seekTimeUs, mode, &actualTimeUs); 110253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 110353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mode != MediaPlayer2SeekMode::SEEK_CLOSEST) { 110453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia seekTimeUs = actualTimeUs; 110553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 110653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mVideoLastDequeueTimeUs = actualTimeUs; 110753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 110853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11090cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mAudioTrack.mExtractor != NULL) { 111053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ++mAudioDataGeneration; 111153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs, MediaPlayer2SeekMode::SEEK_CLOSEST); 111253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mAudioLastDequeueTimeUs = seekTimeUs; 111353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 111453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11150cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mSubtitleTrack.mExtractor != NULL) { 111653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mSubtitleTrack.mPackets->clear(); 111753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchSubtitleDataGeneration++; 111853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 111953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11200cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mTimedTextTrack.mExtractor != NULL) { 112153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mTimedTextTrack.mPackets->clear(); 112253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mFetchTimedTextDataGeneration++; 112353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 112453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 112553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ++mPollBufferingGeneration; 112653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia schedulePollBuffering(); 112753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 112853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 112953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11302409c87361b78ec733e2481c52198bea245fe1daWei Jiasp<ABuffer> NuPlayer2::GenericSource2::mediaBufferToABuffer( 11311889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase* mb, 113253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia media_track_type trackType) { 113353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bool audio = trackType == MEDIA_TRACK_TYPE_AUDIO; 113453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia size_t outLength = mb->range_length(); 113553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 113653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (audio && mAudioIsVorbis) { 113753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia outLength += sizeof(int32_t); 113853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 113953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 114053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<ABuffer> ab; 114153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 114253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mIsDrmProtected) { 114353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Modular DRM 114453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Enabled for both video/audio so 1) media buffer is reused without extra copying 114553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // 2) meta data can be retrieved in onInputBufferFetched for calling queueSecureInputBuffer. 114653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 114753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // data is already provided in the buffer 114853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ab = new ABuffer(NULL, mb->range_length()); 1149bc8f53b8c1c220d9ce01526b6e3834f14af98ed5Dongwon Kang ab->meta()->setObject("mediaBufferHolder", new MediaBufferHolder(mb)); 115053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 115153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Modular DRM: Required b/c of the above add_ref. 115253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // If ref>0, there must be an observer, or it'll crash at release(). 115353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // TODO: MediaBuffer might need to be revised to ease such need. 115453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mb->setObserver(this); 115553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // setMediaBufferBase() interestingly doesn't increment the ref count on its own. 115653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Extra increment (since we want to keep mb alive and attached to ab beyond this function 115753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // call. This is to counter the effect of mb->release() towards the end. 115853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mb->add_ref(); 115953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 116053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 116153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ab = new ABuffer(outLength); 116253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia memcpy(ab->data(), 116353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia (const uint8_t *)mb->data() + mb->range_offset(), 116453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mb->range_length()); 116553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 116653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 116753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (audio && mAudioIsVorbis) { 116853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t numPageSamples; 11693d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen if (!mb->meta_data().findInt32(kKeyValidSamples, &numPageSamples)) { 117053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia numPageSamples = -1; 117153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 117253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 117353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint8_t* abEnd = ab->data() + mb->range_length(); 117453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia memcpy(abEnd, &numPageSamples, sizeof(numPageSamples)); 117553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 117653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 117753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> meta = ab->meta(); 117853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 117953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t timeUs; 11803d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen CHECK(mb->meta_data().findInt64(kKeyTime, &timeUs)); 118153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia meta->setInt64("timeUs", timeUs); 118253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 118353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (trackType == MEDIA_TRACK_TYPE_VIDEO) { 118453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t layerId; 11853d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen if (mb->meta_data().findInt32(kKeyTemporalLayerId, &layerId)) { 118653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia meta->setInt32("temporal-layer-id", layerId); 118753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 118853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 118953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 119053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (trackType == MEDIA_TRACK_TYPE_TIMEDTEXT) { 11910cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih AString mime; 11920cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMediaExtractorWrapper> extractor = mTimedTextTrack.mExtractor; 11930cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih size_t trackIndex = mTimedTextTrack.mIndex; 11940cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih CHECK(extractor != NULL 11950cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih && extractor->getTrackFormat(trackIndex)->getString(AMEDIAFORMAT_KEY_MIME, &mime)); 11960cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih meta->setString("mime", mime.c_str()); 119753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 119853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 119953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t durationUs; 12003d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen if (mb->meta_data().findInt64(kKeyDuration, &durationUs)) { 120153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia meta->setInt64("durationUs", durationUs); 120253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 120353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 120453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (trackType == MEDIA_TRACK_TYPE_SUBTITLE) { 1205d83d4f4a43616f38217591ba2d3f10d77fd4e748Robert Shih meta->setInt32(AMEDIAFORMAT_KEY_TRACK_INDEX, mSubtitleTrack.mIndex); 120653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 120753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 120853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia uint32_t dataType; // unused 120953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const void *seiData; 121053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia size_t seiLength; 12113d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen if (mb->meta_data().findData(kKeySEI, &dataType, &seiData, &seiLength)) { 121253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<ABuffer> sei = ABuffer::CreateAsCopy(seiData, seiLength);; 121353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia meta->setBuffer("sei", sei); 121453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 121553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 121653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const void *mpegUserDataPointer; 121753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia size_t mpegUserDataLength; 12183d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen if (mb->meta_data().findData( 121953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia kKeyMpegUserData, &dataType, &mpegUserDataPointer, &mpegUserDataLength)) { 122053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<ABuffer> mpegUserData = ABuffer::CreateAsCopy(mpegUserDataPointer, mpegUserDataLength); 1221d83d4f4a43616f38217591ba2d3f10d77fd4e748Robert Shih meta->setBuffer(AMEDIAFORMAT_KEY_MPEG_USER_DATA, mpegUserData); 122253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 122353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 122453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mb->release(); 122553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mb = NULL; 122653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 122753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return ab; 122853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 122953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12302409c87361b78ec733e2481c52198bea245fe1daWei Jiaint32_t NuPlayer2::GenericSource2::getDataGeneration(media_track_type type) const { 123153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t generation = -1; 123253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia switch (type) { 123353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_VIDEO: 123453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia generation = mVideoDataGeneration; 123553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 123653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_AUDIO: 123753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia generation = mAudioDataGeneration; 123853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 123953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_TIMEDTEXT: 124053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia generation = mFetchTimedTextDataGeneration; 124153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 124253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_SUBTITLE: 124353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia generation = mFetchSubtitleDataGeneration; 124453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 124553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia default: 124653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 124753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 124853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 124953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return generation; 125053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 125153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12522409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::postReadBuffer(media_track_type trackType) { 125353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if ((mPendingReadBufferTypes & (1 << trackType)) == 0) { 125453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPendingReadBufferTypes |= (1 << trackType); 125553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatReadBuffer, this); 125653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt32("trackType", trackType); 125753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->post(); 125853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 125953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 126053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12612409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::onReadBuffer(const sp<AMessage>& msg) { 126253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t tmpType; 126353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(msg->findInt32("trackType", &tmpType)); 126453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia media_track_type trackType = (media_track_type)tmpType; 126553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPendingReadBufferTypes &= ~(1 << trackType); 126653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia readBuffer(trackType); 126753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 126853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12692409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::readBuffer( 127053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia media_track_type trackType, int64_t seekTimeUs, MediaPlayer2SeekMode mode, 127153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t *actualTimeUs, bool formatChange) { 127253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Track *track; 127353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia size_t maxBuffers = 1; 127453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia switch (trackType) { 127553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_VIDEO: 127653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mVideoTrack; 127753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia maxBuffers = 8; // too large of a number may influence seeks 127853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 127953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_AUDIO: 128053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mAudioTrack; 128153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia maxBuffers = 64; 128253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 128353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_SUBTITLE: 128453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mSubtitleTrack; 128553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 128653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia case MEDIA_TRACK_TYPE_TIMEDTEXT: 128753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track = &mTimedTextTrack; 128853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 128953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia default: 129053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia TRESPASS(); 129153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 129253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12930cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (track->mExtractor == NULL) { 129453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 129553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 129653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 129753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (actualTimeUs) { 129853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *actualTimeUs = seekTimeUs; 129953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 130053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 130153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 130253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bool seeking = false; 13030cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMediaExtractorWrapper> extractor = track->mExtractor; 130453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (seekTimeUs >= 0) { 13050cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih extractor->seekTo(seekTimeUs, mode); 130653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia seeking = true; 130753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 130853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 130953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int32_t generation = getDataGeneration(trackType); 131053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia for (size_t numBuffers = 0; numBuffers < maxBuffers; ) { 13110cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih Vector<sp<ABuffer> > aBuffers; 131253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 131353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mLock.unlock(); 13140cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 13150cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMediaFormatWrapper> format; 13160cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih ssize_t sampleSize = -1; 13170cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih status_t err = extractor->getSampleFormat(format); 13180cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (err == OK) { 13190cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sampleSize = extractor->getSampleSize(); 132053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 132153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13220cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (err != OK || sampleSize < 0) { 13230cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mLock.lock(); 13240cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mPackets->signalEOS(err != OK ? err : ERROR_END_OF_STREAM); 13250cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih break; 13260cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } 132753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13280cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<ABuffer> abuf = new ABuffer(sampleSize); 13290cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sampleSize = extractor->readSampleData(abuf); 13300cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mLock.lock(); 133153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 133253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // in case track has been changed since we don't have lock for some time. 133353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (generation != getDataGeneration(trackType)) { 133453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia break; 133553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 133653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13370cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih int64_t timeUs = extractor->getSampleTime(); 13380cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (timeUs < 0) { 13390cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mPackets->signalEOS(ERROR_MALFORMED); 13400cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih break; 13410cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } 134253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13430cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMessage> meta = abuf->meta(); 13440cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih format->writeToAMessage(meta); 13450cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih meta->setInt64("timeUs", timeUs); 13460cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (trackType == MEDIA_TRACK_TYPE_AUDIO) { 13470cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mAudioTimeUs = timeUs; 13480cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } else if (trackType == MEDIA_TRACK_TYPE_VIDEO) { 13490cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih mVideoTimeUs = timeUs; 13500cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih } 135153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13520cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih queueDiscontinuityIfNeeded(seeking, formatChange, trackType, track); 135353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13540cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (numBuffers == 0 && actualTimeUs != nullptr) { 13550cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih *actualTimeUs = timeUs; 135653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 13570cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (seeking) { 13580cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (meta != nullptr && mode == MediaPlayer2SeekMode::SEEK_CLOSEST 13590cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih && seekTimeUs > timeUs) { 13600cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<AMessage> extra = new AMessage; 13610cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih extra->setInt64("resume-at-mediaTimeUs", seekTimeUs); 13620cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih meta->setMessage("extra", extra); 136353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 136453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 136553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13660cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih track->mPackets->queueAccessUnit(abuf); 13670cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih formatChange = false; 13680cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih seeking = false; 13690cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih ++numBuffers; 13700cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih extractor->advance(); 13710cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih 137253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 137353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 137453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mIsStreaming 137553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia && (trackType == MEDIA_TRACK_TYPE_VIDEO || trackType == MEDIA_TRACK_TYPE_AUDIO)) { 137653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t finalResult; 137753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t durationUs = track->mPackets->getBufferedDurationUs(&finalResult); 137853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 137953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // TODO: maxRebufferingMarkMs could be larger than 138053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // mBufferingSettings.mResumePlaybackMarkMs 138153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t markUs = (mPreparing ? mBufferingSettings.mInitialMarkMs 138253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia : mBufferingSettings.mResumePlaybackMarkMs) * 1000ll; 138353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (finalResult == ERROR_END_OF_STREAM || durationUs >= markUs) { 138453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mPreparing || mSentPauseOnBuffering) { 138553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Track *counterTrack = 138653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia (trackType == MEDIA_TRACK_TYPE_VIDEO ? &mAudioTrack : &mVideoTrack); 13870cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (counterTrack->mExtractor != NULL) { 138853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia durationUs = counterTrack->mPackets->getBufferedDurationUs(&finalResult); 138953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 139053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (finalResult == ERROR_END_OF_STREAM || durationUs >= markUs) { 139153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mPreparing) { 139253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyPrepared(); 139353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPreparing = false; 139453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 139553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sendCacheStats(); 139653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mSentPauseOnBuffering = false; 139753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> notify = dupNotify(); 139853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setInt32("what", kWhatResumeOnBufferingEnd); 139953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->post(); 140053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 140153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 140253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 140353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 140453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 140553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 140653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia postReadBuffer(trackType); 140753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 140853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 140953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14102409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::queueDiscontinuityIfNeeded( 141153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bool seeking, bool formatChange, media_track_type trackType, Track *track) { 141253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // formatChange && seeking: track whose source is changed during selection 141353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // formatChange && !seeking: track whose source is not changed during selection 141453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // !formatChange: normal seek 141553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if ((seeking || formatChange) 141653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia && (trackType == MEDIA_TRACK_TYPE_AUDIO 141753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia || trackType == MEDIA_TRACK_TYPE_VIDEO)) { 141853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ATSParser::DiscontinuityType type = (formatChange && seeking) 141953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ? ATSParser::DISCONTINUITY_FORMATCHANGE 142053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia : ATSParser::DISCONTINUITY_NONE; 142153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia track->mPackets->queueDiscontinuity(type, NULL /* extra */, true /* discard */); 142253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 142353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 142453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14252409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::notifyBufferingUpdate(int32_t percentage) { 142653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Buffering percent could go backward as it's estimated from remaining 142753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // data and last access time. This could cause the buffering position 142853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // drawn on media control to jitter slightly. Remember previously reported 142953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // percentage and don't allow it to go backward. 143053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (percentage < mPrevBufferPercentage) { 143153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia percentage = mPrevBufferPercentage; 143253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else if (percentage > 100) { 143353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia percentage = 100; 143453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 143553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 143653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPrevBufferPercentage = percentage; 143753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 143853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("notifyBufferingUpdate: buffering %d%%", percentage); 143953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 144053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> notify = dupNotify(); 144153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setInt32("what", kWhatBufferingUpdate); 144253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->setInt32("percentage", percentage); 144353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notify->post(); 144453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 144553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14462409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::schedulePollBuffering() { 144753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMessage> msg = new AMessage(kWhatPollBuffering, this); 144853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->setInt32("generation", mPollBufferingGeneration); 144953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Enquires buffering status every second. 145053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg->post(1000000ll); 145153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 145253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14532409c87361b78ec733e2481c52198bea245fe1daWei Jiavoid NuPlayer2::GenericSource2::onPollBuffering() { 145453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t finalStatus = UNKNOWN_ERROR; 145553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t cachedDurationUs = -1ll; 145653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ssize_t cachedDataRemaining = -1; 145753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 145853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mCachedSource != NULL) { 145953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); 146053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 146153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (finalStatus == OK) { 146253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia off64_t size; 146353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t bitrate = 0ll; 146453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mDurationUs > 0 && mCachedSource->getSize(&size) == OK) { 146553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // |bitrate| uses bits/second unit, while size is number of bytes. 146653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bitrate = size * 8000000ll / mDurationUs; 146753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else if (mBitrate > 0) { 146853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bitrate = mBitrate; 146953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 147053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (bitrate > 0) { 147153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia cachedDurationUs = cachedDataRemaining * 8000000ll / bitrate; 147253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 147353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 147453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 147553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 147653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (finalStatus != OK) { 147753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("onPollBuffering: EOS (finalStatus = %d)", finalStatus); 147853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 147953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (finalStatus == ERROR_END_OF_STREAM) { 148053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyBufferingUpdate(100); 148153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 148253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 148353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 148453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 148553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 148653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (cachedDurationUs >= 0ll) { 148753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mDurationUs > 0ll) { 148853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t cachedPosUs = getLastReadPosition() + cachedDurationUs; 148953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int percentage = 100.0 * cachedPosUs / mDurationUs; 149053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (percentage > 100) { 149153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia percentage = 100; 149253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 149353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 149453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyBufferingUpdate(percentage); 149553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 149653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 149753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("onPollBuffering: cachedDurationUs %.1f sec", cachedDurationUs / 1000000.0f); 149853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 149953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 150053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia schedulePollBuffering(); 150153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 150253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 150353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia// Modular DRM 15042409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::prepareDrm( 150553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const uint8_t uuid[16], 150653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const Vector<uint8_t> &drmSessionId, 150753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMediaCryptoWrapper> *outCrypto) { 150853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 150953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("prepareDrm"); 151053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 151153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsDrmProtected = false; 151253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsDrmReleased = false; 151353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsSecure = false; 151453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 151553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t status = OK; 151653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<AMediaCryptoWrapper> crypto = 151753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia new AMediaCryptoWrapper(uuid, drmSessionId.array(), drmSessionId.size()); 151853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (crypto == NULL) { 151953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("prepareDrm: failed to create crypto."); 152053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return UNKNOWN_ERROR; 152153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 152253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("prepareDrm: crypto created for uuid: %s", 152353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia DrmUUID::toHexString(uuid).string()); 152453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 152553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *outCrypto = crypto; 152653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // as long a there is an active crypto 152753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsDrmProtected = true; 152853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 152953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mMimes.size() == 0) { 153053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status = UNKNOWN_ERROR; 153153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("prepareDrm: Unexpected. Must have at least one track. status: %d", status); 153253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return status; 153353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 153453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 153553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // first mime in this list is either the video track, or the first audio track 153653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia const char *mime = mMimes[0].string(); 153753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsSecure = crypto->requiresSecureDecoderComponent(mime); 153853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("prepareDrm: requiresSecureDecoderComponent mime: %s isSecure: %d", 153953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mime, mIsSecure); 154053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 154153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Checking the member flags while in the looper to send out the notification. 154253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // The legacy mDecryptHandle!=NULL check (for FLAG_PROTECTED) is equivalent to mIsDrmProtected. 154353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyFlagsChanged( 154453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia (mIsSecure ? FLAG_SECURE : 0) | 154553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Setting "protected screen" only for L1: b/38390836 154653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia (mIsSecure ? FLAG_PROTECTED : 0) | 154753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia FLAG_CAN_PAUSE | 154853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia FLAG_CAN_SEEK_BACKWARD | 154953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia FLAG_CAN_SEEK_FORWARD | 155053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia FLAG_CAN_SEEK); 155153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 155253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (status == OK) { 155353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("prepareDrm: mCrypto: %p", outCrypto->get()); 155453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGD("prepareDrm ret: %d ", status); 155553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 155653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("prepareDrm err: %d", status); 155753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 155853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return status; 155953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 156053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 15612409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::releaseDrm() { 156253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia Mutex::Autolock _l(mLock); 156353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("releaseDrm"); 156453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 156553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mIsDrmProtected) { 156653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsDrmProtected = false; 156753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // to prevent returning any more buffer after stop/releaseDrm (b/37960096) 156853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsDrmReleased = true; 156953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("releaseDrm: mIsDrmProtected is reset."); 157053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 157153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGE("releaseDrm: mIsDrmProtected is already false."); 157253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 157353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 157453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 157553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 157653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 15772409c87361b78ec733e2481c52198bea245fe1daWei Jiastatus_t NuPlayer2::GenericSource2::checkDrmInfo() 157853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia{ 157953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // clearing the flag at prepare in case the player is reused after stop/releaseDrm with the 158053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // same source without being reset (called by prepareAsync/initFromDataSource) 158153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mIsDrmReleased = false; 158253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 15830cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (mExtractor == NULL) { 15840cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih ALOGV("checkDrmInfo: No extractor"); 158553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; // letting the caller responds accordingly 158653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 158753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 15880cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih PsshInfo *psshInfo = mExtractor->getPsshInfo(); 15890cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih if (psshInfo == NULL) { 159053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGV("checkDrmInfo: No PSSH"); 159153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; // source without DRM info 159253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 159353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 15940cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih sp<ABuffer> drmInfoBuffer = NuPlayer2Drm::retrieveDrmInfo(psshInfo); 15950cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih ALOGV("checkDrmInfo: MEDIA_DRM_INFO PSSH drm info size: %d", (int)drmInfoBuffer->size()); 159653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 159748843255503e162706279a417c0bd4282a63dffeRobert Shih if (drmInfoBuffer->size() == 0) { 15980cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih ALOGE("checkDrmInfo: Unexpected parcel size: 0"); 159953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return UNKNOWN_ERROR; 160053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 160153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 160253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia notifyDrmInfo(drmInfoBuffer); 160353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 160453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return OK; 160553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 160653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 16071889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kangvoid NuPlayer2::GenericSource2::signalBufferReturned(MediaBufferBase *buffer) 160853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia{ 160953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia //ALOGV("signalBufferReturned %p refCount: %d", buffer, buffer->localRefcount()); 161053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 161153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia buffer->setObserver(NULL); 161253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia buffer->release(); // this leads to delete since that there is no observor 161353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 161453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 161553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} // namespace android 1616