NuPlayer.h revision c45a4b26d188a7e4287f672565792479bcf67b9d
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef NU_PLAYER_H_ 18 19#define NU_PLAYER_H_ 20 21#include <media/AudioResamplerPublic.h> 22#include <media/MediaPlayerInterface.h> 23#include <media/stagefright/foundation/AHandler.h> 24 25namespace android { 26 27struct ABuffer; 28struct AMessage; 29struct AudioPlaybackRate; 30struct AVSyncSettings; 31class IDataSource; 32class MetaData; 33struct NuPlayerDriver; 34 35struct NuPlayer : public AHandler { 36 NuPlayer(pid_t pid); 37 38 void setUID(uid_t uid); 39 40 void setDriver(const wp<NuPlayerDriver> &driver); 41 42 void setDataSourceAsync(const sp<IStreamSource> &source); 43 44 void setDataSourceAsync( 45 const sp<IMediaHTTPService> &httpService, 46 const char *url, 47 const KeyedVector<String8, String8> *headers); 48 49 void setDataSourceAsync(int fd, int64_t offset, int64_t length); 50 51 void setDataSourceAsync(const sp<DataSource> &source); 52 53 void prepareAsync(); 54 55 void setVideoSurfaceTextureAsync( 56 const sp<IGraphicBufferProducer> &bufferProducer); 57 58 void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink); 59 status_t setPlaybackSettings(const AudioPlaybackRate &rate); 60 status_t getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */); 61 status_t setSyncSettings(const AVSyncSettings &sync, float videoFpsHint); 62 status_t getSyncSettings(AVSyncSettings *sync /* nonnull */, float *videoFps /* nonnull */); 63 64 void start(); 65 66 void pause(); 67 68 // Will notify the driver through "notifyResetComplete" once finished. 69 void resetAsync(); 70 71 // Will notify the driver through "notifySeekComplete" once finished 72 // and needNotify is true. 73 void seekToAsync(int64_t seekTimeUs, bool needNotify = false); 74 75 status_t setVideoScalingMode(int32_t mode); 76 status_t getTrackInfo(Parcel* reply) const; 77 status_t getSelectedTrack(int32_t type, Parcel* reply) const; 78 status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs); 79 status_t getCurrentPosition(int64_t *mediaUs); 80 void getStats(Vector<sp<AMessage> > *mTrackStats); 81 82 sp<MetaData> getFileMeta(); 83 float getFrameRate(); 84 85protected: 86 virtual ~NuPlayer(); 87 88 virtual void onMessageReceived(const sp<AMessage> &msg); 89 90public: 91 struct NuPlayerStreamListener; 92 struct Source; 93 94private: 95 struct Decoder; 96 struct DecoderBase; 97 struct DecoderPassThrough; 98 struct CCDecoder; 99 struct GenericSource; 100 struct HTTPLiveSource; 101 struct Renderer; 102 struct RTSPSource; 103 struct StreamingSource; 104 struct Action; 105 struct SeekAction; 106 struct SetSurfaceAction; 107 struct ResumeDecoderAction; 108 struct FlushDecoderAction; 109 struct PostMessageAction; 110 struct SimpleAction; 111 112 enum { 113 kWhatSetDataSource = '=DaS', 114 kWhatPrepare = 'prep', 115 kWhatSetVideoSurface = '=VSu', 116 kWhatSetAudioSink = '=AuS', 117 kWhatMoreDataQueued = 'more', 118 kWhatConfigPlayback = 'cfPB', 119 kWhatConfigSync = 'cfSy', 120 kWhatGetPlaybackSettings = 'gPbS', 121 kWhatGetSyncSettings = 'gSyS', 122 kWhatStart = 'strt', 123 kWhatScanSources = 'scan', 124 kWhatVideoNotify = 'vidN', 125 kWhatAudioNotify = 'audN', 126 kWhatClosedCaptionNotify = 'capN', 127 kWhatRendererNotify = 'renN', 128 kWhatReset = 'rset', 129 kWhatSeek = 'seek', 130 kWhatPause = 'paus', 131 kWhatResume = 'rsme', 132 kWhatPollDuration = 'polD', 133 kWhatSourceNotify = 'srcN', 134 kWhatGetTrackInfo = 'gTrI', 135 kWhatGetSelectedTrack = 'gSel', 136 kWhatSelectTrack = 'selT', 137 }; 138 139 wp<NuPlayerDriver> mDriver; 140 bool mUIDValid; 141 uid_t mUID; 142 pid_t mPID; 143 Mutex mSourceLock; // guard |mSource|. 144 sp<Source> mSource; 145 uint32_t mSourceFlags; 146 sp<Surface> mSurface; 147 sp<MediaPlayerBase::AudioSink> mAudioSink; 148 sp<DecoderBase> mVideoDecoder; 149 bool mOffloadAudio; 150 sp<DecoderBase> mAudioDecoder; 151 sp<CCDecoder> mCCDecoder; 152 sp<Renderer> mRenderer; 153 sp<ALooper> mRendererLooper; 154 int32_t mAudioDecoderGeneration; 155 int32_t mVideoDecoderGeneration; 156 int32_t mRendererGeneration; 157 158 int64_t mPreviousSeekTimeUs; 159 160 List<sp<Action> > mDeferredActions; 161 162 bool mAudioEOS; 163 bool mVideoEOS; 164 165 bool mScanSourcesPending; 166 int32_t mScanSourcesGeneration; 167 168 int32_t mPollDurationGeneration; 169 int32_t mTimedTextGeneration; 170 171 enum FlushStatus { 172 NONE, 173 FLUSHING_DECODER, 174 FLUSHING_DECODER_SHUTDOWN, 175 SHUTTING_DOWN_DECODER, 176 FLUSHED, 177 SHUT_DOWN, 178 }; 179 180 enum FlushCommand { 181 FLUSH_CMD_NONE, 182 FLUSH_CMD_FLUSH, 183 FLUSH_CMD_SHUTDOWN, 184 }; 185 186 enum PendingBufferingFlag { 187 PENDING_BUFFERING_FLAG_NONE = MEDIA_INFO_UNKNOWN, 188 PENDING_BUFFERING_FLAG_START = MEDIA_INFO_BUFFERING_START, 189 PENDING_BUFFERING_FLAG_END = MEDIA_INFO_BUFFERING_END, 190 }; 191 192 // Status of flush responses from the decoder and renderer. 193 bool mFlushComplete[2][2]; 194 195 FlushStatus mFlushingAudio; 196 FlushStatus mFlushingVideo; 197 198 // Status of flush responses from the decoder and renderer. 199 bool mResumePending; 200 201 int32_t mVideoScalingMode; 202 203 AudioPlaybackRate mPlaybackSettings; 204 AVSyncSettings mSyncSettings; 205 float mVideoFpsHint; 206 bool mStarted; 207 bool mResetting; 208 bool mSourceStarted; 209 210 // Actual pause state, either as requested by client or due to buffering. 211 bool mPaused; 212 213 // Pause state as requested by client. Note that if mPausedByClient is 214 // true, mPaused is always true; if mPausedByClient is false, mPaused could 215 // still become true, when we pause internally due to buffering. 216 bool mPausedByClient; 217 218 // Pending buffering flag which is not sent to client due to being paused. 219 PendingBufferingFlag mPendingBufferingFlag; 220 221 // Pause state as requested by source (internally) due to buffering 222 bool mPausedForBuffering; 223 224 inline const sp<DecoderBase> &getDecoder(bool audio) { 225 return audio ? mAudioDecoder : mVideoDecoder; 226 } 227 228 inline void clearFlushComplete() { 229 mFlushComplete[0][0] = false; 230 mFlushComplete[0][1] = false; 231 mFlushComplete[1][0] = false; 232 mFlushComplete[1][1] = false; 233 } 234 235 void tryOpenAudioSinkForOffload(const sp<AMessage> &format, bool hasVideo); 236 void closeAudioSink(); 237 void restartAudio( 238 int64_t currentPositionUs, bool forceNonOffload, bool needsToCreateAudioDecoder); 239 void determineAudioModeChange(); 240 241 status_t instantiateDecoder( 242 bool audio, sp<DecoderBase> *decoder, bool checkAudioModeChange = true); 243 244 status_t onInstantiateSecureDecoders(); 245 246 void updateVideoSize( 247 const sp<AMessage> &inputFormat, 248 const sp<AMessage> &outputFormat = NULL); 249 250 void notifyListener(int msg, int ext1, int ext2, const Parcel *in = NULL); 251 252 void handleFlushComplete(bool audio, bool isDecoder); 253 void finishFlushIfPossible(); 254 255 void onStart(int64_t startPositionUs = -1); 256 void onResume(); 257 void onPause(); 258 259 bool audioDecoderStillNeeded(); 260 261 void flushDecoder(bool audio, bool needShutdown); 262 263 void finishResume(); 264 void notifyDriverSeekComplete(); 265 266 void postScanSources(); 267 268 void schedulePollDuration(); 269 void cancelPollDuration(); 270 271 void processDeferredActions(); 272 273 void performSeek(int64_t seekTimeUs); 274 void performDecoderFlush(FlushCommand audio, FlushCommand video); 275 void performReset(); 276 void performScanSources(); 277 void performSetSurface(const sp<Surface> &wrapper); 278 void performResumeDecoders(bool needNotify); 279 280 void onSourceNotify(const sp<AMessage> &msg); 281 void onClosedCaptionNotify(const sp<AMessage> &msg); 282 283 void queueDecoderShutdown( 284 bool audio, bool video, const sp<AMessage> &reply); 285 286 void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex); 287 void sendTimedMetaData(const sp<ABuffer> &buffer); 288 void sendTimedTextData(const sp<ABuffer> &buffer); 289 290 void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const; 291 292 DISALLOW_EVIL_CONSTRUCTORS(NuPlayer); 293}; 294 295} // namespace android 296 297#endif // NU_PLAYER_H_ 298