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 
25 namespace android {
26 
27 struct ABuffer;
28 struct AMessage;
29 struct AudioPlaybackRate;
30 struct AVSyncSettings;
31 class IDataSource;
32 class MetaData;
33 struct NuPlayerDriver;
34 
35 struct 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 
85 protected:
86     virtual ~NuPlayer();
87 
88     virtual void onMessageReceived(const sp<AMessage> &msg);
89 
90 public:
91     struct NuPlayerStreamListener;
92     struct Source;
93 
94 private:
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     sp<Source> mSource;
144     uint32_t mSourceFlags;
145     sp<Surface> mSurface;
146     sp<MediaPlayerBase::AudioSink> mAudioSink;
147     sp<DecoderBase> mVideoDecoder;
148     bool mOffloadAudio;
149     sp<DecoderBase> mAudioDecoder;
150     sp<CCDecoder> mCCDecoder;
151     sp<Renderer> mRenderer;
152     sp<ALooper> mRendererLooper;
153     int32_t mAudioDecoderGeneration;
154     int32_t mVideoDecoderGeneration;
155     int32_t mRendererGeneration;
156 
157     int64_t mPreviousSeekTimeUs;
158 
159     List<sp<Action> > mDeferredActions;
160 
161     bool mAudioEOS;
162     bool mVideoEOS;
163 
164     bool mScanSourcesPending;
165     int32_t mScanSourcesGeneration;
166 
167     int32_t mPollDurationGeneration;
168     int32_t mTimedTextGeneration;
169 
170     enum FlushStatus {
171         NONE,
172         FLUSHING_DECODER,
173         FLUSHING_DECODER_SHUTDOWN,
174         SHUTTING_DOWN_DECODER,
175         FLUSHED,
176         SHUT_DOWN,
177     };
178 
179     enum FlushCommand {
180         FLUSH_CMD_NONE,
181         FLUSH_CMD_FLUSH,
182         FLUSH_CMD_SHUTDOWN,
183     };
184 
185     // Status of flush responses from the decoder and renderer.
186     bool mFlushComplete[2][2];
187 
188     FlushStatus mFlushingAudio;
189     FlushStatus mFlushingVideo;
190 
191     // Status of flush responses from the decoder and renderer.
192     bool mResumePending;
193 
194     int32_t mVideoScalingMode;
195 
196     AudioPlaybackRate mPlaybackSettings;
197     AVSyncSettings mSyncSettings;
198     float mVideoFpsHint;
199     bool mStarted;
200     bool mSourceStarted;
201 
202     // Actual pause state, either as requested by client or due to buffering.
203     bool mPaused;
204 
205     // Pause state as requested by client. Note that if mPausedByClient is
206     // true, mPaused is always true; if mPausedByClient is false, mPaused could
207     // still become true, when we pause internally due to buffering.
208     bool mPausedByClient;
209 
210     // Pause state as requested by source (internally) due to buffering
211     bool mPausedForBuffering;
212 
getDecoderNuPlayer213     inline const sp<DecoderBase> &getDecoder(bool audio) {
214         return audio ? mAudioDecoder : mVideoDecoder;
215     }
216 
clearFlushCompleteNuPlayer217     inline void clearFlushComplete() {
218         mFlushComplete[0][0] = false;
219         mFlushComplete[0][1] = false;
220         mFlushComplete[1][0] = false;
221         mFlushComplete[1][1] = false;
222     }
223 
224     void tryOpenAudioSinkForOffload(const sp<AMessage> &format, bool hasVideo);
225     void closeAudioSink();
226     void determineAudioModeChange();
227 
228     status_t instantiateDecoder(bool audio, sp<DecoderBase> *decoder);
229 
230     status_t onInstantiateSecureDecoders();
231 
232     void updateVideoSize(
233             const sp<AMessage> &inputFormat,
234             const sp<AMessage> &outputFormat = NULL);
235 
236     void notifyListener(int msg, int ext1, int ext2, const Parcel *in = NULL);
237 
238     void handleFlushComplete(bool audio, bool isDecoder);
239     void finishFlushIfPossible();
240 
241     void onStart(int64_t startPositionUs = -1);
242     void onResume();
243     void onPause();
244 
245     bool audioDecoderStillNeeded();
246 
247     void flushDecoder(bool audio, bool needShutdown);
248 
249     void finishResume();
250     void notifyDriverSeekComplete();
251 
252     void postScanSources();
253 
254     void schedulePollDuration();
255     void cancelPollDuration();
256 
257     void processDeferredActions();
258 
259     void performSeek(int64_t seekTimeUs);
260     void performDecoderFlush(FlushCommand audio, FlushCommand video);
261     void performReset();
262     void performScanSources();
263     void performSetSurface(const sp<Surface> &wrapper);
264     void performResumeDecoders(bool needNotify);
265 
266     void onSourceNotify(const sp<AMessage> &msg);
267     void onClosedCaptionNotify(const sp<AMessage> &msg);
268 
269     void queueDecoderShutdown(
270             bool audio, bool video, const sp<AMessage> &reply);
271 
272     void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex);
273     void sendTimedMetaData(const sp<ABuffer> &buffer);
274     void sendTimedTextData(const sp<ABuffer> &buffer);
275 
276     void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const;
277 
278     DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
279 };
280 
281 }  // namespace android
282 
283 #endif  // NU_PLAYER_H_
284