GenericSource.h revision 802768790c131f8237364906fd13981a6bb91193
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 58afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual status_t feedMoreTSData(); 59afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 60afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); 61afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 62afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual status_t getDuration(int64_t *durationUs); 63dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih virtual size_t getTrackCount() const; 64dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih virtual sp<AMessage> getTrackInfo(size_t trackIndex) const; 65e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar virtual ssize_t getSelectedTrack(media_track_type type) const; 663423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih virtual status_t selectTrack(size_t trackIndex, bool select); 67afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual status_t seekTo(int64_t seekTimeUs); 68b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 69cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar virtual status_t setBuffers(bool audio, Vector<MediaBuffer *> &buffers); 70cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar 71afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberprotected: 72afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual ~GenericSource(); 73afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 743423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih virtual void onMessageReceived(const sp<AMessage> &msg); 753423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 76840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual sp<MetaData> getFormatMeta(bool audio); 77840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 78afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberprivate: 793423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih enum { 801228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang kWhatPrepareAsync, 813423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih kWhatFetchSubtitleData, 82e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar kWhatFetchTimedTextData, 833423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih kWhatSendSubtitleData, 84e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar kWhatSendTimedTextData, 853423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih kWhatChangeAVSource, 862a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang kWhatPollBuffering, 873423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih }; 883423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 89dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih Vector<sp<MediaSource> > mSources; 90dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih 91afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber struct Track { 92dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih size_t mIndex; 93afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<MediaSource> mSource; 94afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<AnotherPacketSource> mPackets; 95afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber }; 96afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber Track mAudioTrack; 98802768790c131f8237364906fd13981a6bb91193Ronghua Wu int64_t mAudioTimeUs; 99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber Track mVideoTrack; 100802768790c131f8237364906fd13981a6bb91193Ronghua Wu int64_t mVideoTimeUs; 1013423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih Track mSubtitleTrack; 102e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar Track mTimedTextTrack; 103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1043423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int32_t mFetchSubtitleDataGeneration; 105e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t mFetchTimedTextDataGeneration; 106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber int64_t mDurationUs; 107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber bool mAudioIsVorbis; 108cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar bool mIsWidevine; 109cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar bool mUIDValid; 110cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar uid_t mUID; 111bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang sp<IMediaHTTPService> mHTTPService; 112bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang AString mUri; 113bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang KeyedVector<String8, String8> mUriHeaders; 114bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int mFd; 115bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int64_t mOffset; 116bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int64_t mLength; 117bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang 118d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<DataSource> mDataSource; 119d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<NuCachedSource2> mCachedSource; 1202a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang sp<WVMExtractor> mWVMExtractor; 121802768790c131f8237364906fd13981a6bb91193Ronghua Wu DrmManagerClient *mDrmManagerClient; 122802768790c131f8237364906fd13981a6bb91193Ronghua Wu sp<DecryptHandle> mDecryptHandle; 123802768790c131f8237364906fd13981a6bb91193Ronghua Wu bool mStarted; 124d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang String8 mContentType; 125d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang AString mSniffedMIME; 126d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang off64_t mMetaDataSize; 1272a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang int64_t mBitrate; 1282a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang int32_t mPollBufferingGeneration; 1291228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 130d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<ALooper> mLooper; 1311228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 132bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang void resetDataSource(); 133afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 134d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang status_t initFromDataSource(); 135802768790c131f8237364906fd13981a6bb91193Ronghua Wu void checkDrmStatus(const sp<DataSource>& dataSource); 136802768790c131f8237364906fd13981a6bb91193Ronghua Wu int64_t getLastReadPosition(); 137802768790c131f8237364906fd13981a6bb91193Ronghua Wu void setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position); 138d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang 139d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang status_t prefillCacheIfNecessary(); 140d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang 141d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang void notifyPreparedAndCleanup(status_t err); 142afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1431228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang void onPrepareAsync(); 1441228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 145e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar void fetchTextData( 146e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar uint32_t what, media_track_type type, 147e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg); 148e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar 149e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar void sendTextData( 150e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar uint32_t what, media_track_type type, 151e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg); 152e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar 1533423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih sp<ABuffer> mediaBufferToABuffer( 1543423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih MediaBuffer *mbuf, 1553423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih media_track_type trackType, 1563423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int64_t *actualTimeUs = NULL); 1573423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 158afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber void readBuffer( 1593423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih media_track_type trackType, 1603423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL, bool formatChange = false); 161afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1622a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void schedulePollBuffering(); 1632a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void cancelPollBuffering(); 1642a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void onPollBuffering(); 1652a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void notifyBufferingUpdate(int percentage); 1662a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang 167afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(GenericSource); 168afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}; 169afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 170afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} // namespace android 171afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 172afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#endif // GENERIC_SOURCE_H_ 173