GenericSource.h revision 5c67ddcf987b1f07c9abc1d051a0c051e7c73ff7
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> ¬ify, 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; 1095c67ddcf987b1f07c9abc1d051a0c051e7c73ff7Robert Shih int64_t mAudioLastDequeueTimeUs; 110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber Track mVideoTrack; 111802768790c131f8237364906fd13981a6bb91193Ronghua Wu int64_t mVideoTimeUs; 1125c67ddcf987b1f07c9abc1d051a0c051e7c73ff7Robert Shih int64_t mVideoLastDequeueTimeUs; 1133423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih Track mSubtitleTrack; 114e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar Track mTimedTextTrack; 115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1163423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int32_t mFetchSubtitleDataGeneration; 117e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t mFetchTimedTextDataGeneration; 118afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber int64_t mDurationUs; 119afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber bool mAudioIsVorbis; 120cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar bool mIsWidevine; 121cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar bool mUIDValid; 122cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar uid_t mUID; 123bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang sp<IMediaHTTPService> mHTTPService; 124bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang AString mUri; 125bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang KeyedVector<String8, String8> mUriHeaders; 126bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int mFd; 127bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int64_t mOffset; 128bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int64_t mLength; 129bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang 130d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<DataSource> mDataSource; 131d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<NuCachedSource2> mCachedSource; 132360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih sp<DataSource> mHttpSource; 1332a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang sp<WVMExtractor> mWVMExtractor; 134f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen sp<MetaData> mFileMeta; 135802768790c131f8237364906fd13981a6bb91193Ronghua Wu DrmManagerClient *mDrmManagerClient; 136802768790c131f8237364906fd13981a6bb91193Ronghua Wu sp<DecryptHandle> mDecryptHandle; 137802768790c131f8237364906fd13981a6bb91193Ronghua Wu bool mStarted; 1382abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung bool mStopRead; 139d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang String8 mContentType; 140d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang AString mSniffedMIME; 141d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang off64_t mMetaDataSize; 1422a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang int64_t mBitrate; 1432a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang int32_t mPollBufferingGeneration; 14484f5278a36f2816cc38f64307b4a1ad8a6818507Lajos Molnar uint32_t mPendingReadBufferTypes; 14584f5278a36f2816cc38f64307b4a1ad8a6818507Lajos Molnar mutable Mutex mReadBufferLock; 1461228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 147d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<ALooper> mLooper; 1481228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 149bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang void resetDataSource(); 150afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 151d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang status_t initFromDataSource(); 152802768790c131f8237364906fd13981a6bb91193Ronghua Wu void checkDrmStatus(const sp<DataSource>& dataSource); 153802768790c131f8237364906fd13981a6bb91193Ronghua Wu int64_t getLastReadPosition(); 154802768790c131f8237364906fd13981a6bb91193Ronghua Wu void setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position); 155d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang 156d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang status_t prefillCacheIfNecessary(); 157d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang 158d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang void notifyPreparedAndCleanup(status_t err); 159afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 16017f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onGetFormatMeta(sp<AMessage> msg) const; 16117f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih sp<MetaData> doGetFormatMeta(bool audio) const; 16217f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih 16317f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onGetSelectedTrack(sp<AMessage> msg) const; 16417f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih ssize_t doGetSelectedTrack(media_track_type type) const; 16517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih 16617f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onSelectTrack(sp<AMessage> msg); 16717f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih status_t doSelectTrack(size_t trackIndex, bool select); 16817f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih 16917f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onSeek(sp<AMessage> msg); 17017f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih status_t doSeek(int64_t seekTimeUs); 17117f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih 1721228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang void onPrepareAsync(); 1731228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 174e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar void fetchTextData( 175e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar uint32_t what, media_track_type type, 176e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg); 177e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar 178e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar void sendTextData( 179e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar uint32_t what, media_track_type type, 180e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg); 181e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar 1823423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih sp<ABuffer> mediaBufferToABuffer( 1833423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih MediaBuffer *mbuf, 1843423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih media_track_type trackType, 1853423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int64_t *actualTimeUs = NULL); 1863423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 18717f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void postReadBuffer(media_track_type trackType); 18817f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onReadBuffer(sp<AMessage> msg); 189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber void readBuffer( 1903423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih media_track_type trackType, 1913423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL, bool formatChange = false); 192afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1932a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void schedulePollBuffering(); 1942a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void cancelPollBuffering(); 1952a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void onPollBuffering(); 1962a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void notifyBufferingUpdate(int percentage); 1972a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang 198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(GenericSource); 199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}; 200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 201afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} // namespace android 202afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 203afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#endif // GENERIC_SOURCE_H_ 204