NuPlayer.h revision 99f31604136d66ae10e20669fb6b5716f342bde0
197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten/* 297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * 497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * you may not use this file except in compliance with the License. 697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * You may obtain a copy of the License at 797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * 897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * 1097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * Unless required by applicable law or agreed to in writing, software 1197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * See the License for the specific language governing permissions and 1497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten * limitations under the License. 1597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten */ 1697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 1760fd12ab581e151522cf6d73f86031acf8fb46e7Glenn Kasten#ifndef NU_PLAYER_H_ 1860fd12ab581e151522cf6d73f86031acf8fb46e7Glenn Kasten 1960fd12ab581e151522cf6d73f86031acf8fb46e7Glenn Kasten#define NU_PLAYER_H_ 20dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten 2197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include <media/MediaPlayerInterface.h> 2297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include <media/stagefright/foundation/AHandler.h> 2397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten#include <media/stagefright/NativeWindowWrapper.h> 2497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 2597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastennamespace android { 263ce28aa3cb5262775180a8b423cfb4a5670ebc59Martin Storsjo 27e8a1ced4da17dc6c07803dc2af8060f62a8389c1Andy Hungstruct ABuffer; 2897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct AMessage; 2997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct IDataSource; 3097b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenclass MetaData; 3197b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct NuPlayerDriver; 3297b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 3397b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kastenstruct NuPlayer : public AHandler { 3497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten NuPlayer(); 35f7160b5dc3091fd9624f25d534c6848ee831b706Glenn Kasten 362234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten void setUID(uid_t uid); 3797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 382234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten void setDriver(const wp<NuPlayerDriver> &driver); 3997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 40dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten void setDataSourceAsync(const sp<IStreamSource> &source); 41dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten 42dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten void setDataSourceAsync( 43dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten const sp<IMediaHTTPService> &httpService, 4497b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten const char *url, 4597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten const KeyedVector<String8, String8> *headers); 4697b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 4797b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten void setDataSourceAsync(int fd, int64_t offset, int64_t length); 4897b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten 4997b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten void setDataSourceAsync(const sp<DataSource> &source); 50d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten 51dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten void prepareAsync(); 52dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten 53dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten void setVideoSurfaceTextureAsync( 54dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten const sp<IGraphicBufferProducer> &bufferProducer); 55dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten 56dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink); 57d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten void setPlaybackRate(float rate); 58d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten void start(); 59d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten 60d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten void pause(); 61d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten 62d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten // Will notify the driver through "notifyResetComplete" once finished. 63d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten void resetAsync(); 64d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten 65d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten // Will notify the driver through "notifySeekComplete" once finished 66d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten // and needNotify is true. 67d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten void seekToAsync(int64_t seekTimeUs, bool needNotify = false); 68d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten 69d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten status_t setVideoScalingMode(int32_t mode); 70d702a568cb62e5aebe048147350bb3c76f9386baGlenn Kasten status_t getTrackInfo(Parcel* reply) const; 71dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten status_t getSelectedTrack(int32_t type, Parcel* reply) const; 72dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs); 73dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten status_t getCurrentPosition(int64_t *mediaUs); 74dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten void getStats(int64_t *mNumFramesTotal, int64_t *mNumFramesDropped); 75dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten 76dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten sp<MetaData> getFileMeta(); 77dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten 78dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kastenprotected: 79dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten virtual ~NuPlayer(); 80dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten 81dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten virtual void onMessageReceived(const sp<AMessage> &msg); 82dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten 83dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kastenpublic: 84dc2c50bad491d2c0c8a2efc0e24491076701c63cGlenn Kasten struct NuPlayerStreamListener; 8597b5d0d5b5ef766eb5dd680d05a5d199662d4ae0Glenn Kasten struct Source; 86 87private: 88 struct Decoder; 89 struct DecoderBase; 90 struct DecoderPassThrough; 91 struct CCDecoder; 92 struct GenericSource; 93 struct HTTPLiveSource; 94 struct Renderer; 95 struct RTSPSource; 96 struct StreamingSource; 97 struct Action; 98 struct SeekAction; 99 struct SetSurfaceAction; 100 struct ResumeDecoderAction; 101 struct FlushDecoderAction; 102 struct PostMessageAction; 103 struct SimpleAction; 104 105 enum { 106 kWhatSetDataSource = '=DaS', 107 kWhatPrepare = 'prep', 108 kWhatSetVideoNativeWindow = '=NaW', 109 kWhatSetAudioSink = '=AuS', 110 kWhatMoreDataQueued = 'more', 111 kWhatSetRate = 'setR', 112 kWhatStart = 'strt', 113 kWhatScanSources = 'scan', 114 kWhatVideoNotify = 'vidN', 115 kWhatAudioNotify = 'audN', 116 kWhatClosedCaptionNotify = 'capN', 117 kWhatRendererNotify = 'renN', 118 kWhatReset = 'rset', 119 kWhatSeek = 'seek', 120 kWhatPause = 'paus', 121 kWhatResume = 'rsme', 122 kWhatPollDuration = 'polD', 123 kWhatSourceNotify = 'srcN', 124 kWhatGetTrackInfo = 'gTrI', 125 kWhatGetSelectedTrack = 'gSel', 126 kWhatSelectTrack = 'selT', 127 }; 128 129 wp<NuPlayerDriver> mDriver; 130 bool mUIDValid; 131 uid_t mUID; 132 sp<Source> mSource; 133 uint32_t mSourceFlags; 134 sp<NativeWindowWrapper> mNativeWindow; 135 sp<MediaPlayerBase::AudioSink> mAudioSink; 136 sp<DecoderBase> mVideoDecoder; 137 bool mOffloadAudio; 138 sp<DecoderBase> mAudioDecoder; 139 sp<CCDecoder> mCCDecoder; 140 sp<Renderer> mRenderer; 141 sp<ALooper> mRendererLooper; 142 int32_t mAudioDecoderGeneration; 143 int32_t mVideoDecoderGeneration; 144 int32_t mRendererGeneration; 145 146 List<sp<Action> > mDeferredActions; 147 148 bool mAudioEOS; 149 bool mVideoEOS; 150 151 bool mScanSourcesPending; 152 int32_t mScanSourcesGeneration; 153 154 int32_t mPollDurationGeneration; 155 int32_t mTimedTextGeneration; 156 157 enum FlushStatus { 158 NONE, 159 FLUSHING_DECODER, 160 FLUSHING_DECODER_SHUTDOWN, 161 SHUTTING_DOWN_DECODER, 162 FLUSHED, 163 SHUT_DOWN, 164 }; 165 166 enum FlushCommand { 167 FLUSH_CMD_NONE, 168 FLUSH_CMD_FLUSH, 169 FLUSH_CMD_SHUTDOWN, 170 }; 171 172 // Status of flush responses from the decoder and renderer. 173 bool mFlushComplete[2][2]; 174 175 FlushStatus mFlushingAudio; 176 FlushStatus mFlushingVideo; 177 178 // Status of flush responses from the decoder and renderer. 179 bool mResumePending; 180 181 int32_t mVideoScalingMode; 182 183 float mPlaybackRate; 184 bool mStarted; 185 186 // Actual pause state, either as requested by client or due to buffering. 187 bool mPaused; 188 189 // Pause state as requested by client. Note that if mPausedByClient is 190 // true, mPaused is always true; if mPausedByClient is false, mPaused could 191 // still become true, when we pause internally due to buffering. 192 bool mPausedByClient; 193 194 inline const sp<DecoderBase> &getDecoder(bool audio) { 195 return audio ? mAudioDecoder : mVideoDecoder; 196 } 197 198 inline void clearFlushComplete() { 199 mFlushComplete[0][0] = false; 200 mFlushComplete[0][1] = false; 201 mFlushComplete[1][0] = false; 202 mFlushComplete[1][1] = false; 203 } 204 205 void tryOpenAudioSinkForOffload(const sp<AMessage> &format, bool hasVideo); 206 void closeAudioSink(); 207 208 status_t instantiateDecoder(bool audio, sp<DecoderBase> *decoder); 209 210 status_t onInstantiateSecureDecoders(); 211 212 void updateVideoSize( 213 const sp<AMessage> &inputFormat, 214 const sp<AMessage> &outputFormat = NULL); 215 216 void notifyListener(int msg, int ext1, int ext2, const Parcel *in = NULL); 217 218 void handleFlushComplete(bool audio, bool isDecoder); 219 void finishFlushIfPossible(); 220 221 void onStart(); 222 void onResume(); 223 void onPause(); 224 225 bool audioDecoderStillNeeded(); 226 227 void flushDecoder(bool audio, bool needShutdown); 228 229 void finishResume(); 230 231 void postScanSources(); 232 233 void schedulePollDuration(); 234 void cancelPollDuration(); 235 236 void processDeferredActions(); 237 238 void performSeek(int64_t seekTimeUs, bool needNotify); 239 void performDecoderFlush(FlushCommand audio, FlushCommand video); 240 void performReset(); 241 void performScanSources(); 242 void performSetSurface(const sp<NativeWindowWrapper> &wrapper); 243 void performResumeDecoders(bool needNotify); 244 245 void onSourceNotify(const sp<AMessage> &msg); 246 void onClosedCaptionNotify(const sp<AMessage> &msg); 247 248 void queueDecoderShutdown( 249 bool audio, bool video, const sp<AMessage> &reply); 250 251 void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex); 252 void sendTimedTextData(const sp<ABuffer> &buffer); 253 254 void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const; 255 256 DISALLOW_EVIL_CONSTRUCTORS(NuPlayer); 257}; 258 259} // namespace android 260 261#endif // NU_PLAYER_H_ 262