1afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber/*
2afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Copyright (C) 2012 The Android Open Source Project
3afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
4afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * you may not use this file except in compliance with the License.
6afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * You may obtain a copy of the License at
7afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
8afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber *
10afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * Unless required by applicable law or agreed to in writing, software
11afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * See the License for the specific language governing permissions and
14afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber * limitations under the License.
15afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber */
16afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
17afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#ifndef GENERIC_SOURCE_H_
18afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
19afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#define GENERIC_SOURCE_H_
20afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
21afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "NuPlayer.h"
22afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "NuPlayerSource.h"
23afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
24afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "ATSParser.h"
25afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
263423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih#include <media/mediaplayer.h>
273423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
28afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubernamespace android {
29afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
30802768790c131f8237364906fd13981a6bb91193Ronghua Wuclass DecryptHandle;
31afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct AnotherPacketSource;
32afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct ARTSPController;
33ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass DataSource;
34ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IDataSource;
35bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhangstruct IMediaHTTPService;
36afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct MediaSource;
373423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shihclass MediaBuffer;
38d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhangstruct NuCachedSource2;
39afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
40cefac14261a32fb856b0d1ab31541787112e306eHassan Shojaniastruct NuPlayer::GenericSource : public NuPlayer::Source,
41cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania                                 public MediaBufferObserver // Modular DRM
42cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania{
433de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang    GenericSource(const sp<AMessage> &notify, bool uidValid, uid_t uid);
443de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang
45bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    status_t setDataSource(
461b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
47afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            const char *url,
483de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang            const KeyedVector<String8, String8> *headers);
49afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
50bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    status_t setDataSource(int fd, int64_t offset, int64_t length);
51afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
5299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    status_t setDataSource(const sp<DataSource>& dataSource);
5399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
5448fa06d1e80a872c7495804979256e021e566ae0Wei Jia    virtual status_t getDefaultBufferingSettings(
5548fa06d1e80a872c7495804979256e021e566ae0Wei Jia            BufferingSettings* buffering /* nonnull */) override;
5648fa06d1e80a872c7495804979256e021e566ae0Wei Jia    virtual status_t setBufferingSettings(const BufferingSettings& buffering) override;
5748fa06d1e80a872c7495804979256e021e566ae0Wei Jia
589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    virtual void prepareAsync();
599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
60afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual void start();
61802768790c131f8237364906fd13981a6bb91193Ronghua Wu    virtual void stop();
62802768790c131f8237364906fd13981a6bb91193Ronghua Wu    virtual void pause();
63802768790c131f8237364906fd13981a6bb91193Ronghua Wu    virtual void resume();
64afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
6548296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang    virtual void disconnect();
6648296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang
67afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual status_t feedMoreTSData();
68afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
69f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    virtual sp<MetaData> getFileFormatMeta() const;
70f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen
71afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
72afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
73afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual status_t getDuration(int64_t *durationUs);
74dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    virtual size_t getTrackCount() const;
75dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    virtual sp<AMessage> getTrackInfo(size_t trackIndex) const;
76e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    virtual ssize_t getSelectedTrack(media_track_type type) const;
776ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih    virtual status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs);
78c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    virtual status_t seekTo(
79c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia        int64_t seekTimeUs,
80c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia        MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) override;
81b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
82cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    virtual status_t setBuffers(bool audio, Vector<MediaBuffer *> &buffers);
83cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar
8402cb98d726b97d8e6dbb9c6c60d32a3cedc7f82dRonghua Wu    virtual bool isStreaming() const;
8502cb98d726b97d8e6dbb9c6c60d32a3cedc7f82dRonghua Wu
8614532f2383c3849d0db59a607ed0bd802f57155cWei Jia    virtual void setOffloadAudio(bool offload);
8714532f2383c3849d0db59a607ed0bd802f57155cWei Jia
88cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    // Modular DRM
89cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    virtual void signalBufferReturned(MediaBuffer *buffer);
90cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
91cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    virtual status_t prepareDrm(
92cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania            const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId, sp<ICrypto> *crypto);
93cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
94355e8473df4a5b197f0cf136edfbede586416067Hassan Shojania    virtual status_t releaseDrm();
95355e8473df4a5b197f0cf136edfbede586416067Hassan Shojania
96cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberprotected:
98afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual ~GenericSource();
99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1003423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    virtual void onMessageReceived(const sp<AMessage> &msg);
1013423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
102840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    virtual sp<MetaData> getFormatMeta(bool audio);
103840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberprivate:
1053423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    enum {
1061228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        kWhatPrepareAsync,
1073423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        kWhatFetchSubtitleData,
108e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar        kWhatFetchTimedTextData,
1093423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        kWhatSendSubtitleData,
11055e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen        kWhatSendGlobalTimedTextData,
111e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar        kWhatSendTimedTextData,
1123423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        kWhatChangeAVSource,
1132a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang        kWhatPollBuffering,
11417f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatGetFormat,
11517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatGetSelectedTrack,
11617f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatSelectTrack,
11717f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatSeek,
11817f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatReadBuffer,
119efbb61950db36a5eb789be83f077246172507c67Chong Zhang        kWhatStart,
120efbb61950db36a5eb789be83f077246172507c67Chong Zhang        kWhatResume,
121fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar        kWhatSecureDecodersInstantiated,
122cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        // Modular DRM
123cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        kWhatPrepareDrm,
124355e8473df4a5b197f0cf136edfbede586416067Hassan Shojania        kWhatReleaseDrm,
1253423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    };
1263423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
127afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    struct Track {
128dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih        size_t mIndex;
129b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen        sp<IMediaSource> mSource;
130afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<AnotherPacketSource> mPackets;
131afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    };
132afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
13314532f2383c3849d0db59a607ed0bd802f57155cWei Jia    // Helper to monitor buffering status. The polling happens every second.
13414532f2383c3849d0db59a607ed0bd802f57155cWei Jia    // When necessary, it will send out buffering events to the player.
13514532f2383c3849d0db59a607ed0bd802f57155cWei Jia    struct BufferingMonitor : public AHandler {
13614532f2383c3849d0db59a607ed0bd802f57155cWei Jia    public:
137724e04107548bfdb67f4be5772c0f08a0bd65f3eChih-Hung Hsieh        explicit BufferingMonitor(const sp<AMessage> &notify);
13814532f2383c3849d0db59a607ed0bd802f57155cWei Jia
13948fa06d1e80a872c7495804979256e021e566ae0Wei Jia        void getDefaultBufferingSettings(BufferingSettings *buffering /* nonnull */);
14048fa06d1e80a872c7495804979256e021e566ae0Wei Jia        status_t setBufferingSettings(const BufferingSettings &buffering);
14148fa06d1e80a872c7495804979256e021e566ae0Wei Jia
14214532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Set up state.
14314532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void prepare(const sp<NuCachedSource2> &cachedSource,
14414532f2383c3849d0db59a607ed0bd802f57155cWei Jia                int64_t durationUs,
14514532f2383c3849d0db59a607ed0bd802f57155cWei Jia                int64_t bitrate,
14614532f2383c3849d0db59a607ed0bd802f57155cWei Jia                bool isStreaming);
14714532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Stop and reset buffering monitor.
14814532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void stop();
14914532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Cancel the current monitor task.
15014532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void cancelPollBuffering();
15114532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Restart the monitor task.
15214532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void restartPollBuffering();
15314532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Stop buffering task and send out corresponding events.
15414532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void stopBufferingIfNecessary();
15514532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Make sure data source is getting data.
15614532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void ensureCacheIsFetching();
15714532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Update media time of just extracted buffer from data source.
15814532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void updateQueuedTime(bool isAudio, int64_t timeUs);
15914532f2383c3849d0db59a607ed0bd802f57155cWei Jia
16014532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Set the offload mode.
16114532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void setOffloadAudio(bool offload);
16214532f2383c3849d0db59a607ed0bd802f57155cWei Jia        // Update media time of last dequeued buffer which is sent to the decoder.
16314532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void updateDequeuedBufferTime(int64_t mediaUs);
16414532f2383c3849d0db59a607ed0bd802f57155cWei Jia
16514532f2383c3849d0db59a607ed0bd802f57155cWei Jia    protected:
16614532f2383c3849d0db59a607ed0bd802f57155cWei Jia        virtual ~BufferingMonitor();
16714532f2383c3849d0db59a607ed0bd802f57155cWei Jia        virtual void onMessageReceived(const sp<AMessage> &msg);
16814532f2383c3849d0db59a607ed0bd802f57155cWei Jia
16914532f2383c3849d0db59a607ed0bd802f57155cWei Jia    private:
17014532f2383c3849d0db59a607ed0bd802f57155cWei Jia        enum {
17114532f2383c3849d0db59a607ed0bd802f57155cWei Jia            kWhatPollBuffering,
17214532f2383c3849d0db59a607ed0bd802f57155cWei Jia        };
17314532f2383c3849d0db59a607ed0bd802f57155cWei Jia
17414532f2383c3849d0db59a607ed0bd802f57155cWei Jia        sp<AMessage> mNotify;
17514532f2383c3849d0db59a607ed0bd802f57155cWei Jia
17614532f2383c3849d0db59a607ed0bd802f57155cWei Jia        sp<NuCachedSource2> mCachedSource;
17714532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int64_t mDurationUs;
17814532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int64_t mBitrate;
17914532f2383c3849d0db59a607ed0bd802f57155cWei Jia        bool mIsStreaming;
18014532f2383c3849d0db59a607ed0bd802f57155cWei Jia
18114532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int64_t mAudioTimeUs;
18214532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int64_t mVideoTimeUs;
18314532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int32_t mPollBufferingGeneration;
18414532f2383c3849d0db59a607ed0bd802f57155cWei Jia        bool mPrepareBuffering;
18514532f2383c3849d0db59a607ed0bd802f57155cWei Jia        bool mBuffering;
18614532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int32_t mPrevBufferPercentage;
18714532f2383c3849d0db59a607ed0bd802f57155cWei Jia
18814532f2383c3849d0db59a607ed0bd802f57155cWei Jia        mutable Mutex mLock;
18914532f2383c3849d0db59a607ed0bd802f57155cWei Jia
19048fa06d1e80a872c7495804979256e021e566ae0Wei Jia        BufferingSettings mSettings;
19114532f2383c3849d0db59a607ed0bd802f57155cWei Jia        bool mOffloadAudio;
19214532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int64_t mFirstDequeuedBufferRealUs;
19314532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int64_t mFirstDequeuedBufferMediaUs;
19414532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int64_t mlastDequeuedBufferMediaUs;
19514532f2383c3849d0db59a607ed0bd802f57155cWei Jia
19614532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void prepare_l(const sp<NuCachedSource2> &cachedSource,
19714532f2383c3849d0db59a607ed0bd802f57155cWei Jia                int64_t durationUs,
19814532f2383c3849d0db59a607ed0bd802f57155cWei Jia                int64_t bitrate,
19914532f2383c3849d0db59a607ed0bd802f57155cWei Jia                bool isStreaming);
20014532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void cancelPollBuffering_l();
20114532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void notifyBufferingUpdate_l(int32_t percentage);
20214532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void startBufferingIfNecessary_l();
20314532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void stopBufferingIfNecessary_l();
20414532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void sendCacheStats_l();
20514532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void ensureCacheIsFetching_l();
20614532f2383c3849d0db59a607ed0bd802f57155cWei Jia        int64_t getLastReadPosition_l();
20714532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void onPollBuffering_l();
20814532f2383c3849d0db59a607ed0bd802f57155cWei Jia        void schedulePollBuffering_l();
20914532f2383c3849d0db59a607ed0bd802f57155cWei Jia    };
21014532f2383c3849d0db59a607ed0bd802f57155cWei Jia
211b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    Vector<sp<IMediaSource> > mSources;
212afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track mAudioTrack;
213802768790c131f8237364906fd13981a6bb91193Ronghua Wu    int64_t mAudioTimeUs;
2145c67ddcf987b1f07c9abc1d051a0c051e7c73ff7Robert Shih    int64_t mAudioLastDequeueTimeUs;
215afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track mVideoTrack;
216802768790c131f8237364906fd13981a6bb91193Ronghua Wu    int64_t mVideoTimeUs;
2175c67ddcf987b1f07c9abc1d051a0c051e7c73ff7Robert Shih    int64_t mVideoLastDequeueTimeUs;
2183423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    Track mSubtitleTrack;
219e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    Track mTimedTextTrack;
220afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
2213423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    int32_t mFetchSubtitleDataGeneration;
222e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    int32_t mFetchTimedTextDataGeneration;
223afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    int64_t mDurationUs;
224afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    bool mAudioIsVorbis;
225838be3907fc58eab119d7093a3d73be7267bd4d2Hassan Shojania    // Secure codec is required.
22642e8153cf7271b572e4a94ade332b68521977f36Chong Zhang    bool mIsSecure;
227efbb61950db36a5eb789be83f077246172507c67Chong Zhang    bool mIsStreaming;
228cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    bool mUIDValid;
229cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    uid_t mUID;
230bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    sp<IMediaHTTPService> mHTTPService;
231bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    AString mUri;
232bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    KeyedVector<String8, String8> mUriHeaders;
233bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    int mFd;
234bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    int64_t mOffset;
235bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    int64_t mLength;
236bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang
237d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    sp<DataSource> mDataSource;
238d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    sp<NuCachedSource2> mCachedSource;
239360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih    sp<DataSource> mHttpSource;
240f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    sp<MetaData> mFileMeta;
241802768790c131f8237364906fd13981a6bb91193Ronghua Wu    bool mStarted;
2422abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung    bool mStopRead;
2432a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    int64_t mBitrate;
24414532f2383c3849d0db59a607ed0bd802f57155cWei Jia    sp<BufferingMonitor> mBufferingMonitor;
24584f5278a36f2816cc38f64307b4a1ad8a6818507Lajos Molnar    uint32_t mPendingReadBufferTypes;
24655e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen    sp<ABuffer> mGlobalTimedText;
247c287cad65bd0c7a79e43f4decc5e04593027a7c8Chong Zhang
24884f5278a36f2816cc38f64307b4a1ad8a6818507Lajos Molnar    mutable Mutex mReadBufferLock;
249ebc2712d5e8a66f8d6652e7cc7fb14cdbec7f235Robert Shih    mutable Mutex mDisconnectLock;
2501228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
251d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    sp<ALooper> mLooper;
25214532f2383c3849d0db59a607ed0bd802f57155cWei Jia    sp<ALooper> mBufferingMonitorLooper;
2531228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
254bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    void resetDataSource();
255afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
256d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    status_t initFromDataSource();
257802768790c131f8237364906fd13981a6bb91193Ronghua Wu    int64_t getLastReadPosition();
258d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang
259d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    void notifyPreparedAndCleanup(status_t err);
260fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar    void onSecureDecodersInstantiated(status_t err);
261fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar    void finishPrepareAsync();
262fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar    status_t startSources();
263afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
26436d0ca16024820df9a12903d2ac443fabcc180bcChih-Hung Hsieh    void onGetFormatMeta(const sp<AMessage>& msg) const;
26517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    sp<MetaData> doGetFormatMeta(bool audio) const;
26617f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
2679935bd490fc3c15693156ca5c10d7d533f71d448qinzhichao    void onGetTrackInfo(const sp<AMessage>& msg) const;
2689935bd490fc3c15693156ca5c10d7d533f71d448qinzhichao    sp<AMessage> doGetTrackInfo(size_t trackIndex) const;
2699935bd490fc3c15693156ca5c10d7d533f71d448qinzhichao
27036d0ca16024820df9a12903d2ac443fabcc180bcChih-Hung Hsieh    void onGetSelectedTrack(const sp<AMessage>& msg) const;
27117f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    ssize_t doGetSelectedTrack(media_track_type type) const;
27217f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
27336d0ca16024820df9a12903d2ac443fabcc180bcChih-Hung Hsieh    void onSelectTrack(const sp<AMessage>& msg);
2746ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih    status_t doSelectTrack(size_t trackIndex, bool select, int64_t timeUs);
27517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
27636d0ca16024820df9a12903d2ac443fabcc180bcChih-Hung Hsieh    void onSeek(const sp<AMessage>& msg);
277c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    status_t doSeek(int64_t seekTimeUs, MediaPlayerSeekMode mode);
27817f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
2791228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang    void onPrepareAsync();
2801228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
281e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    void fetchTextData(
282e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar            uint32_t what, media_track_type type,
28336d0ca16024820df9a12903d2ac443fabcc180bcChih-Hung Hsieh            int32_t curGen, const sp<AnotherPacketSource>& packets, const sp<AMessage>& msg);
284e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar
28555e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen    void sendGlobalTextData(
28655e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen            uint32_t what,
28755e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen            int32_t curGen, sp<AMessage> msg);
28855e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen
289e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    void sendTextData(
290e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar            uint32_t what, media_track_type type,
29136d0ca16024820df9a12903d2ac443fabcc180bcChih-Hung Hsieh            int32_t curGen, const sp<AnotherPacketSource>& packets, const sp<AMessage>& msg);
292e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar
2933423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    sp<ABuffer> mediaBufferToABuffer(
2943423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih            MediaBuffer *mbuf,
295144868295f75a650a0b487c60f6983a0790fe39aWei Jia            media_track_type trackType);
2963423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
29717f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    void postReadBuffer(media_track_type trackType);
29836d0ca16024820df9a12903d2ac443fabcc180bcChih-Hung Hsieh    void onReadBuffer(const sp<AMessage>& msg);
299c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    // When |mode| is MediaPlayerSeekMode::SEEK_CLOSEST, the buffer read shall
300c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    // include an item indicating skipping rendering all buffers with timestamp
301c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    // earlier than |seekTimeUs|.
302c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    // For other modes, the buffer read will not include the item as above in order
303144868295f75a650a0b487c60f6983a0790fe39aWei Jia    // to facilitate fast seek operation.
304afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    void readBuffer(
3053423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih            media_track_type trackType,
306c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            int64_t seekTimeUs = -1ll,
307c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC,
3085ec347fcaf7fefe8fd9ccbaa365ffb070921a970Wei Jia            int64_t *actualTimeUs = NULL, bool formatChange = false);
309afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
3108f291bc99e92015ebb959654a73c87e98bd46958Ronghua Wu    void queueDiscontinuityIfNeeded(
3118f291bc99e92015ebb959654a73c87e98bd46958Ronghua Wu            bool seeking, bool formatChange, media_track_type trackType, Track *track);
3128f291bc99e92015ebb959654a73c87e98bd46958Ronghua Wu
313cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    // Modular DRM
314838be3907fc58eab119d7093a3d73be7267bd4d2Hassan Shojania    // The source is DRM protected and is prepared for DRM.
315cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    bool mIsDrmProtected;
316838be3907fc58eab119d7093a3d73be7267bd4d2Hassan Shojania    // releaseDrm has been processed.
317355e8473df4a5b197f0cf136edfbede586416067Hassan Shojania    bool mIsDrmReleased;
318cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    Vector<String8> mMimes;
319cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
320cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    status_t checkDrmInfo();
321cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    status_t onPrepareDrm(const sp<AMessage> &msg);
322355e8473df4a5b197f0cf136edfbede586416067Hassan Shojania    status_t onReleaseDrm();
323cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
324afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(GenericSource);
325afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber};
326afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
327afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}  // namespace android
328afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
329afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#endif  // GENERIC_SOURCE_H_
330