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> &notify,
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