GenericSource.h revision 2abde2c118a94f843a7450818c925d3f0b673cd3
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;
31802768790c131f8237364906fd13981a6bb91193Ronghua Wuclass DrmManagerClient;
32afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct AnotherPacketSource;
33afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct ARTSPController;
34afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct DataSource;
35bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhangstruct IMediaHTTPService;
36afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct MediaSource;
373423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shihclass MediaBuffer;
38d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhangstruct NuCachedSource2;
392a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhangstruct WVMExtractor;
40afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
41afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct NuPlayer::GenericSource : public NuPlayer::Source {
423de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang    GenericSource(const sp<AMessage> &notify, bool uidValid, uid_t uid);
433de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang
44bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    status_t setDataSource(
451b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
46afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber            const char *url,
473de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang            const KeyedVector<String8, String8> *headers);
48afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
49bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    status_t setDataSource(int fd, int64_t offset, int64_t length);
50afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    virtual void prepareAsync();
529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
53afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual void start();
54802768790c131f8237364906fd13981a6bb91193Ronghua Wu    virtual void stop();
55802768790c131f8237364906fd13981a6bb91193Ronghua Wu    virtual void pause();
56802768790c131f8237364906fd13981a6bb91193Ronghua Wu    virtual void resume();
57afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
5848296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang    virtual void disconnect();
5948296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang
60afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual status_t feedMoreTSData();
61afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
62f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    virtual sp<MetaData> getFileFormatMeta() const;
63f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen
64afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
65afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
66afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual status_t getDuration(int64_t *durationUs);
67dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    virtual size_t getTrackCount() const;
68dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    virtual sp<AMessage> getTrackInfo(size_t trackIndex) const;
69e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    virtual ssize_t getSelectedTrack(media_track_type type) const;
703423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    virtual status_t selectTrack(size_t trackIndex, bool select);
71afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual status_t seekTo(int64_t seekTimeUs);
72b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
73cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    virtual status_t setBuffers(bool audio, Vector<MediaBuffer *> &buffers);
74cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar
75afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberprotected:
76afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    virtual ~GenericSource();
77afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
783423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    virtual void onMessageReceived(const sp<AMessage> &msg);
793423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
80840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    virtual sp<MetaData> getFormatMeta(bool audio);
81840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
82afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberprivate:
833423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    enum {
841228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang        kWhatPrepareAsync,
853423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        kWhatFetchSubtitleData,
86e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar        kWhatFetchTimedTextData,
873423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        kWhatSendSubtitleData,
88e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar        kWhatSendTimedTextData,
893423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih        kWhatChangeAVSource,
902a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang        kWhatPollBuffering,
9117f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatGetFormat,
9217f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatGetSelectedTrack,
9317f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatSelectTrack,
9417f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatSeek,
9517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih        kWhatReadBuffer,
962abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung        kWhatStopWidevine,
973423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    };
983423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
99dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    Vector<sp<MediaSource> > mSources;
100dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih
101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    struct Track {
102dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih        size_t mIndex;
103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<MediaSource> mSource;
104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber        sp<AnotherPacketSource> mPackets;
105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    };
106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track mAudioTrack;
108802768790c131f8237364906fd13981a6bb91193Ronghua Wu    int64_t mAudioTimeUs;
109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    Track mVideoTrack;
110802768790c131f8237364906fd13981a6bb91193Ronghua Wu    int64_t mVideoTimeUs;
1113423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    Track mSubtitleTrack;
112e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    Track mTimedTextTrack;
113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1143423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    int32_t mFetchSubtitleDataGeneration;
115e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    int32_t mFetchTimedTextDataGeneration;
116afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    int64_t mDurationUs;
117afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    bool mAudioIsVorbis;
118cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    bool mIsWidevine;
119cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    bool mUIDValid;
120cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    uid_t mUID;
121bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    sp<IMediaHTTPService> mHTTPService;
122bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    AString mUri;
123bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    KeyedVector<String8, String8> mUriHeaders;
124bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    int mFd;
125bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    int64_t mOffset;
126bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    int64_t mLength;
127bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang
128d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    sp<DataSource> mDataSource;
129d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    sp<NuCachedSource2> mCachedSource;
1302a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    sp<WVMExtractor> mWVMExtractor;
131f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    sp<MetaData> mFileMeta;
132802768790c131f8237364906fd13981a6bb91193Ronghua Wu    DrmManagerClient *mDrmManagerClient;
133802768790c131f8237364906fd13981a6bb91193Ronghua Wu    sp<DecryptHandle> mDecryptHandle;
134802768790c131f8237364906fd13981a6bb91193Ronghua Wu    bool mStarted;
1352abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung    bool mStopRead;
136d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    String8 mContentType;
137d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    AString mSniffedMIME;
138d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    off64_t mMetaDataSize;
1392a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    int64_t mBitrate;
1402a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    int32_t mPollBufferingGeneration;
14184f5278a36f2816cc38f64307b4a1ad8a6818507Lajos Molnar    uint32_t mPendingReadBufferTypes;
14284f5278a36f2816cc38f64307b4a1ad8a6818507Lajos Molnar    mutable Mutex mReadBufferLock;
1431228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
144d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    sp<ALooper> mLooper;
1451228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
146bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang    void resetDataSource();
147afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
148d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    status_t initFromDataSource();
149802768790c131f8237364906fd13981a6bb91193Ronghua Wu    void checkDrmStatus(const sp<DataSource>& dataSource);
150802768790c131f8237364906fd13981a6bb91193Ronghua Wu    int64_t getLastReadPosition();
151802768790c131f8237364906fd13981a6bb91193Ronghua Wu    void setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position);
152d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang
153d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    status_t prefillCacheIfNecessary();
154d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang
155d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang    void notifyPreparedAndCleanup(status_t err);
156afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
15717f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    void onGetFormatMeta(sp<AMessage> msg) const;
15817f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    sp<MetaData> doGetFormatMeta(bool audio) const;
15917f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
16017f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    void onGetSelectedTrack(sp<AMessage> msg) const;
16117f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    ssize_t doGetSelectedTrack(media_track_type type) const;
16217f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
16317f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    void onSelectTrack(sp<AMessage> msg);
16417f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    status_t doSelectTrack(size_t trackIndex, bool select);
16517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
16617f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    void onSeek(sp<AMessage> msg);
16717f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    status_t doSeek(int64_t seekTimeUs);
16817f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih
1691228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang    void onPrepareAsync();
1701228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang
171e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    void fetchTextData(
172e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar            uint32_t what, media_track_type type,
173e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar            int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg);
174e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar
175e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar    void sendTextData(
176e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar            uint32_t what, media_track_type type,
177e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar            int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg);
178e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar
1793423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih    sp<ABuffer> mediaBufferToABuffer(
1803423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih            MediaBuffer *mbuf,
1813423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih            media_track_type trackType,
1823423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih            int64_t *actualTimeUs = NULL);
1833423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih
18417f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    void postReadBuffer(media_track_type trackType);
18517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih    void onReadBuffer(sp<AMessage> msg);
186afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    void readBuffer(
1873423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih            media_track_type trackType,
1883423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih            int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL, bool formatChange = false);
189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1902a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    void schedulePollBuffering();
1912a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    void cancelPollBuffering();
1922a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    void onPollBuffering();
1932a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang    void notifyBufferingUpdate(int percentage);
1942a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang
195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(GenericSource);
196afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber};
197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}  // namespace android
199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#endif  // GENERIC_SOURCE_H_
201