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
172409c87361b78ec733e2481c52198bea245fe1daWei Jia#ifndef GENERIC_SOURCE2_H_
1853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
192409c87361b78ec733e2481c52198bea245fe1daWei Jia#define GENERIC_SOURCE2_H_
2053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "NuPlayer2.h"
2253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "NuPlayer2Source.h"
2353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "ATSParser.h"
2553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/MediaBuffer.h>
2751b6956bc8e09eb2237a10a401baebb35096e6abWei Jia#include <mediaplayer2/mediaplayer2.h>
280cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih#include <media/NdkMediaDataSource.h>
290cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih#include <media/NdkMediaExtractor.h>
300cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih#include <media/NdkWrapper.h>
3153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
3253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jianamespace android {
3353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
3453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass DecryptHandle;
3553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct AnotherPacketSource;
3653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct ARTSPController;
3753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass DataSource;
3853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass IDataSource;
3949ce671c4efa4c5d038351ca441e34c5afa5241fDongwon Kangclass IMediaSource;
4053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct MediaHTTPService;
4153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct MediaSource;
4253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass MediaBuffer;
4353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct MediaClock;
4453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiastruct NuCachedSource2;
4553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
462409c87361b78ec733e2481c52198bea245fe1daWei Jiastruct NuPlayer2::GenericSource2 : public NuPlayer2::Source,
472409c87361b78ec733e2481c52198bea245fe1daWei Jia                                   public MediaBufferObserver // Modular DRM
4853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia{
49003fdb5b76ccc537d4ab7ef19c8a2e3be19b594cWei Jia    GenericSource2(const sp<AMessage> &notify, uid_t uid,
502409c87361b78ec733e2481c52198bea245fe1daWei Jia                   const sp<MediaClock> &mediaClock);
5153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
5253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    status_t setDataSource(
5353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            const sp<MediaHTTPService> &httpService,
5453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            const char *url,
5553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            const KeyedVector<String8, String8> *headers);
5653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
5753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    status_t setDataSource(int fd, int64_t offset, int64_t length);
5853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
5953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    status_t setDataSource(const sp<DataSource>& dataSource);
6053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
6153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t getBufferingSettings(
6253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            BufferingSettings* buffering /* nonnull */) override;
6353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t setBufferingSettings(const BufferingSettings& buffering) override;
6453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
6553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void prepareAsync();
6653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
6753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void start();
6853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void stop();
6953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void pause();
7053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void resume();
7153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
7253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void disconnect();
7353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
7453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t feedMoreTSData();
7553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
7653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual sp<MetaData> getFileFormatMeta() const;
7753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
7853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
7953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
8053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t getDuration(int64_t *durationUs);
8153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual size_t getTrackCount() const;
8253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual sp<AMessage> getTrackInfo(size_t trackIndex) const;
8353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual ssize_t getSelectedTrack(media_track_type type) const;
8453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs);
8553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t seekTo(
8653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        int64_t seekTimeUs,
8753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC) override;
8853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
8953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual bool isStreaming() const;
9053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
9153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // Modular DRM
921889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang    virtual void signalBufferReturned(MediaBufferBase *buffer);
9353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
9453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t prepareDrm(
9553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            const uint8_t uuid[16],
9653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            const Vector<uint8_t> &drmSessionId,
9753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            sp<AMediaCryptoWrapper> *outCrypto);
9853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
9953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual status_t releaseDrm();
10053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
10153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
10253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaprotected:
1032409c87361b78ec733e2481c52198bea245fe1daWei Jia    virtual ~GenericSource2();
10453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
10553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual void onMessageReceived(const sp<AMessage> &msg);
10653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
1070cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    virtual sp<AMessage> getFormat(bool audio);
10853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    virtual sp<MetaData> getFormatMeta(bool audio);
10953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
11053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaprivate:
11153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    enum {
11253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatPrepareAsync,
11353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatFetchSubtitleData,
11453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatFetchTimedTextData,
11553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatSendSubtitleData,
11653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatSendGlobalTimedTextData,
11753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatSendTimedTextData,
11853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatChangeAVSource,
11953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatPollBuffering,
12053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatSeek,
12153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatReadBuffer,
12253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatStart,
12353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatResume,
12453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        kWhatSecureDecodersInstantiated,
12553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    };
12653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
12753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    struct Track {
12853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        size_t mIndex;
1290cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih        sp<AMediaExtractorWrapper> mExtractor;
13053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        sp<AnotherPacketSource> mPackets;
13153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    };
13253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
13353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t mAudioTimeUs;
13453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t mAudioLastDequeueTimeUs;
13553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t mVideoTimeUs;
13653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t mVideoLastDequeueTimeUs;
13753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
13853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    BufferingSettings mBufferingSettings;
13953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int32_t mPrevBufferPercentage;
14053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int32_t mPollBufferingGeneration;
14153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mSentPauseOnBuffering;
14253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
14353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int32_t mAudioDataGeneration;
14453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int32_t mVideoDataGeneration;
14553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int32_t mFetchSubtitleDataGeneration;
14653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int32_t mFetchTimedTextDataGeneration;
14753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t mDurationUs;
14853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mAudioIsVorbis;
14953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // Secure codec is required.
15053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mIsSecure;
15153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mIsStreaming;
15253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    uid_t mUID;
15353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    const sp<MediaClock> mMediaClock;
15453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<MediaHTTPService> mHTTPService;
15553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    AString mUri;
15653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    KeyedVector<String8, String8> mUriHeaders;
15753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int mFd;
15853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t mOffset;
15953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t mLength;
16053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
16153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mDisconnected;
16253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<DataSource> mDataSource;
16353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<NuCachedSource2> mCachedSource;
16453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<DataSource> mHttpSource;
16553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<MetaData> mFileMeta;
1660cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    sp<AMediaDataSourceWrapper> mDataSourceWrapper;
1670cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    sp<AMediaExtractorWrapper> mExtractor;
1680cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    Vector<sp<AMediaExtractorWrapper> > mExtractors;
16953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mStarted;
17053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mPreparing;
17153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t mBitrate;
17253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    uint32_t mPendingReadBufferTypes;
17353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<ABuffer> mGlobalTimedText;
17453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
1750cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    Track mVideoTrack;
1760cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    Track mAudioTrack;
1770cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    Track mSubtitleTrack;
1780cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    Track mTimedTextTrack;
1790cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih
18053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    mutable Mutex mLock;
18153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
18253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<ALooper> mLooper;
18353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
18453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void resetDataSource();
18553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
18653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    status_t initFromDataSource();
18753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int64_t getLastReadPosition();
18853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
18953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void notifyPreparedAndCleanup(status_t err);
19053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void onSecureDecodersInstantiated(status_t err);
19153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void finishPrepareAsync();
19253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    status_t startSources();
19353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
19453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void onSeek(const sp<AMessage>& msg);
19553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    status_t doSeek(int64_t seekTimeUs, MediaPlayer2SeekMode mode);
19653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
19753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void onPrepareAsync();
19853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
19953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void fetchTextData(
20053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            uint32_t what, media_track_type type,
20153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            int32_t curGen, const sp<AnotherPacketSource>& packets, const sp<AMessage>& msg);
20253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
20353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void sendGlobalTextData(
20453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            uint32_t what,
20553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            int32_t curGen, sp<AMessage> msg);
20653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
20753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void sendTextData(
20853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            uint32_t what, media_track_type type,
20953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            int32_t curGen, const sp<AnotherPacketSource>& packets, const sp<AMessage>& msg);
21053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
21153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<ABuffer> mediaBufferToABuffer(
2121889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang            MediaBufferBase *mbuf,
21353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            media_track_type trackType);
21453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
21553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void postReadBuffer(media_track_type trackType);
21653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void onReadBuffer(const sp<AMessage>& msg);
21753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // When |mode| is MediaPlayer2SeekMode::SEEK_CLOSEST, the buffer read shall
21853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // include an item indicating skipping rendering all buffers with timestamp
21953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // earlier than |seekTimeUs|.
22053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // For other modes, the buffer read will not include the item as above in order
22153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // to facilitate fast seek operation.
22253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void readBuffer(
22353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            media_track_type trackType,
22453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            int64_t seekTimeUs = -1ll,
22553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC,
22653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            int64_t *actualTimeUs = NULL, bool formatChange = false);
22753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
22853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void queueDiscontinuityIfNeeded(
22953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            bool seeking, bool formatChange, media_track_type trackType, Track *track);
23053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
23153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void schedulePollBuffering();
23253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void onPollBuffering();
23353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void notifyBufferingUpdate(int32_t percentage);
23453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
23553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    void sendCacheStats();
23653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2370cd95065c5d293f0d6e53cd75e44d20106dd2e6eRobert Shih    sp<AMessage> getFormat_l(bool audio);
23853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    sp<MetaData> getFormatMeta_l(bool audio);
23953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    int32_t getDataGeneration(media_track_type type) const;
24053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
24153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // Modular DRM
24253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // The source is DRM protected and is prepared for DRM.
24353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mIsDrmProtected;
24453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    // releaseDrm has been processed.
24553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    bool mIsDrmReleased;
24653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    Vector<String8> mMimes;
24753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
24853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    status_t checkDrmInfo();
24953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2502409c87361b78ec733e2481c52198bea245fe1daWei Jia    DISALLOW_EVIL_CONSTRUCTORS(GenericSource2);
25153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia};
25253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
25353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}  // namespace android
25453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2552409c87361b78ec733e2481c52198bea245fe1daWei Jia#endif  // GENERIC_SOURCE2_H_
256