GenericSource.h revision 55e2f4ca5bb23ce32fbdd627b0f648c27106b98e
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; 34ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass DataSource; 35ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IDataSource; 36bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhangstruct IMediaHTTPService; 37afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct MediaSource; 383423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shihclass MediaBuffer; 39d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhangstruct NuCachedSource2; 40ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass WVMExtractor; 41afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 42afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstruct NuPlayer::GenericSource : public NuPlayer::Source { 433de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang GenericSource(const sp<AMessage> ¬ify, 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 549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber virtual void prepareAsync(); 559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 56afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual void start(); 57802768790c131f8237364906fd13981a6bb91193Ronghua Wu virtual void stop(); 58802768790c131f8237364906fd13981a6bb91193Ronghua Wu virtual void pause(); 59802768790c131f8237364906fd13981a6bb91193Ronghua Wu virtual void resume(); 60afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 6148296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang virtual void disconnect(); 6248296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang 63afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual status_t feedMoreTSData(); 64afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 65f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen virtual sp<MetaData> getFileFormatMeta() const; 66f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen 67afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); 68afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 69afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual status_t getDuration(int64_t *durationUs); 70dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih virtual size_t getTrackCount() const; 71dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih virtual sp<AMessage> getTrackInfo(size_t trackIndex) const; 72e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar virtual ssize_t getSelectedTrack(media_track_type type) const; 736ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih virtual status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs); 74afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual status_t seekTo(int64_t seekTimeUs); 75b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 76cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar virtual status_t setBuffers(bool audio, Vector<MediaBuffer *> &buffers); 77cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar 7802cb98d726b97d8e6dbb9c6c60d32a3cedc7f82dRonghua Wu virtual bool isStreaming() const; 7902cb98d726b97d8e6dbb9c6c60d32a3cedc7f82dRonghua Wu 80afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberprotected: 81afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber virtual ~GenericSource(); 82afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 833423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih virtual void onMessageReceived(const sp<AMessage> &msg); 843423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 85840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual sp<MetaData> getFormatMeta(bool audio); 86840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 87afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberprivate: 883423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih enum { 891228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang kWhatPrepareAsync, 903423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih kWhatFetchSubtitleData, 91e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar kWhatFetchTimedTextData, 923423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih kWhatSendSubtitleData, 9355e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen kWhatSendGlobalTimedTextData, 94e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar kWhatSendTimedTextData, 953423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih kWhatChangeAVSource, 962a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang kWhatPollBuffering, 9717f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih kWhatGetFormat, 9817f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih kWhatGetSelectedTrack, 9917f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih kWhatSelectTrack, 10017f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih kWhatSeek, 10117f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih kWhatReadBuffer, 1022abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung kWhatStopWidevine, 103efbb61950db36a5eb789be83f077246172507c67Chong Zhang kWhatStart, 104efbb61950db36a5eb789be83f077246172507c67Chong Zhang kWhatResume, 105fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar kWhatSecureDecodersInstantiated, 1063423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih }; 1073423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber struct Track { 109dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih size_t mIndex; 110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<MediaSource> mSource; 111afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<AnotherPacketSource> mPackets; 112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber }; 113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 114efbb61950db36a5eb789be83f077246172507c67Chong Zhang Vector<sp<MediaSource> > mSources; 115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber Track mAudioTrack; 116802768790c131f8237364906fd13981a6bb91193Ronghua Wu int64_t mAudioTimeUs; 1175c67ddcf987b1f07c9abc1d051a0c051e7c73ff7Robert Shih int64_t mAudioLastDequeueTimeUs; 118afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber Track mVideoTrack; 119802768790c131f8237364906fd13981a6bb91193Ronghua Wu int64_t mVideoTimeUs; 1205c67ddcf987b1f07c9abc1d051a0c051e7c73ff7Robert Shih int64_t mVideoLastDequeueTimeUs; 1213423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih Track mSubtitleTrack; 122e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar Track mTimedTextTrack; 123afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1243423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int32_t mFetchSubtitleDataGeneration; 125e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t mFetchTimedTextDataGeneration; 126afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber int64_t mDurationUs; 127afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber bool mAudioIsVorbis; 128cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar bool mIsWidevine; 12942e8153cf7271b572e4a94ade332b68521977f36Chong Zhang bool mIsSecure; 130efbb61950db36a5eb789be83f077246172507c67Chong Zhang bool mIsStreaming; 131cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar bool mUIDValid; 132cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar uid_t mUID; 133bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang sp<IMediaHTTPService> mHTTPService; 134bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang AString mUri; 135bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang KeyedVector<String8, String8> mUriHeaders; 136bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int mFd; 137bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int64_t mOffset; 138bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang int64_t mLength; 139bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang 140d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<DataSource> mDataSource; 141d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<NuCachedSource2> mCachedSource; 142360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih sp<DataSource> mHttpSource; 1432a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang sp<WVMExtractor> mWVMExtractor; 144f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen sp<MetaData> mFileMeta; 145802768790c131f8237364906fd13981a6bb91193Ronghua Wu DrmManagerClient *mDrmManagerClient; 146802768790c131f8237364906fd13981a6bb91193Ronghua Wu sp<DecryptHandle> mDecryptHandle; 147802768790c131f8237364906fd13981a6bb91193Ronghua Wu bool mStarted; 1482abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung bool mStopRead; 1492a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang int64_t mBitrate; 1502a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang int32_t mPollBufferingGeneration; 15184f5278a36f2816cc38f64307b4a1ad8a6818507Lajos Molnar uint32_t mPendingReadBufferTypes; 152efbb61950db36a5eb789be83f077246172507c67Chong Zhang bool mBuffering; 153efbb61950db36a5eb789be83f077246172507c67Chong Zhang bool mPrepareBuffering; 154c287cad65bd0c7a79e43f4decc5e04593027a7c8Chong Zhang int32_t mPrevBufferPercentage; 15555e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen sp<ABuffer> mGlobalTimedText; 156c287cad65bd0c7a79e43f4decc5e04593027a7c8Chong Zhang 15784f5278a36f2816cc38f64307b4a1ad8a6818507Lajos Molnar mutable Mutex mReadBufferLock; 1581228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 159d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang sp<ALooper> mLooper; 1601228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 161bf9b95d712a24b654761cb9fea0d94d383cfc661Chong Zhang void resetDataSource(); 162afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 163d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang status_t initFromDataSource(); 164802768790c131f8237364906fd13981a6bb91193Ronghua Wu void checkDrmStatus(const sp<DataSource>& dataSource); 165802768790c131f8237364906fd13981a6bb91193Ronghua Wu int64_t getLastReadPosition(); 166802768790c131f8237364906fd13981a6bb91193Ronghua Wu void setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position); 167d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang 168d354d8d1b09503c0166c1f3e626cda72a3eeb83cChong Zhang void notifyPreparedAndCleanup(status_t err); 169fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar void onSecureDecodersInstantiated(status_t err); 170fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar void finishPrepareAsync(); 171fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar status_t startSources(); 172afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 17317f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onGetFormatMeta(sp<AMessage> msg) const; 17417f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih sp<MetaData> doGetFormatMeta(bool audio) const; 17517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih 17617f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onGetSelectedTrack(sp<AMessage> msg) const; 17717f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih ssize_t doGetSelectedTrack(media_track_type type) const; 17817f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih 17917f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onSelectTrack(sp<AMessage> msg); 1806ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih status_t doSelectTrack(size_t trackIndex, bool select, int64_t timeUs); 18117f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih 18217f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onSeek(sp<AMessage> msg); 18317f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih status_t doSeek(int64_t seekTimeUs); 18417f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih 1851228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang void onPrepareAsync(); 1861228d6b175de8b21787cbe0c6c4bb5642f4d555eChong Zhang 187e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar void fetchTextData( 188e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar uint32_t what, media_track_type type, 189e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg); 190e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar 19155e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen void sendGlobalTextData( 19255e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen uint32_t what, 19355e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen int32_t curGen, sp<AMessage> msg); 19455e2f4ca5bb23ce32fbdd627b0f648c27106b98eMarco Nelissen 195e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar void sendTextData( 196e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar uint32_t what, media_track_type type, 197e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg); 198e26940f11c3f2040bced09f06a8f374b50c985fbLajos Molnar 1993423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih sp<ABuffer> mediaBufferToABuffer( 2003423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih MediaBuffer *mbuf, 2013423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih media_track_type trackType, 202474d7c778b63aa33dcf25a92e23a52c1c47f0ac1Wei Jia int64_t seekTimeUs, 2033423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int64_t *actualTimeUs = NULL); 2043423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih 20517f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void postReadBuffer(media_track_type trackType); 20617f6dd64cd749f4e38e12b672b551047f4cbe9b4Robert Shih void onReadBuffer(sp<AMessage> msg); 207afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber void readBuffer( 2083423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih media_track_type trackType, 2093423bbdb05f843a64356fa24e8657f03ecbb7d65Robert Shih int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL, bool formatChange = false); 210afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 2118f291bc99e92015ebb959654a73c87e98bd46958Ronghua Wu void queueDiscontinuityIfNeeded( 2128f291bc99e92015ebb959654a73c87e98bd46958Ronghua Wu bool seeking, bool formatChange, media_track_type trackType, Track *track); 2138f291bc99e92015ebb959654a73c87e98bd46958Ronghua Wu 2142a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void schedulePollBuffering(); 2152a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void cancelPollBuffering(); 216efbb61950db36a5eb789be83f077246172507c67Chong Zhang void restartPollBuffering(); 2172a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang void onPollBuffering(); 218c287cad65bd0c7a79e43f4decc5e04593027a7c8Chong Zhang void notifyBufferingUpdate(int32_t percentage); 219efbb61950db36a5eb789be83f077246172507c67Chong Zhang void startBufferingIfNecessary(); 220efbb61950db36a5eb789be83f077246172507c67Chong Zhang void stopBufferingIfNecessary(); 221efbb61950db36a5eb789be83f077246172507c67Chong Zhang void sendCacheStats(); 222efbb61950db36a5eb789be83f077246172507c67Chong Zhang void ensureCacheIsFetching(); 2232a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang 224afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(GenericSource); 225afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber}; 226afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 227afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} // namespace android 228afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 229afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#endif // GENERIC_SOURCE_H_ 230