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/MediaPlayerInterface.h>
22 #include <media/stagefright/foundation/AHandler.h>
23 #include <media/stagefright/NativeWindowWrapper.h>
24 
25 namespace android {
26 
27 struct ABuffer;
28 struct AMessage;
29 struct MetaData;
30 struct NuPlayerDriver;
31 
32 struct NuPlayer : public AHandler {
33     NuPlayer();
34 
35     void setUID(uid_t uid);
36 
37     void setDriver(const wp<NuPlayerDriver> &driver);
38 
39     void setDataSourceAsync(const sp<IStreamSource> &source);
40 
41     void setDataSourceAsync(
42             const sp<IMediaHTTPService> &httpService,
43             const char *url,
44             const KeyedVector<String8, String8> *headers);
45 
46     void setDataSourceAsync(int fd, int64_t offset, int64_t length);
47 
48     void prepareAsync();
49 
50     void setVideoSurfaceTextureAsync(
51             const sp<IGraphicBufferProducer> &bufferProducer);
52 
53     void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink);
54     void start();
55 
56     void pause();
57 
58     // Will notify the driver through "notifyResetComplete" once finished.
59     void resetAsync();
60 
61     // Will notify the driver through "notifySeekComplete" once finished
62     // and needNotify is true.
63     void seekToAsync(int64_t seekTimeUs, bool needNotify = false);
64 
65     status_t setVideoScalingMode(int32_t mode);
66     status_t getTrackInfo(Parcel* reply) const;
67     status_t getSelectedTrack(int32_t type, Parcel* reply) const;
68     status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs);
69     status_t getCurrentPosition(int64_t *mediaUs);
70     void getStats(int64_t *mNumFramesTotal, int64_t *mNumFramesDropped);
71 
72     sp<MetaData> getFileMeta();
73 
74 protected:
75     virtual ~NuPlayer();
76 
77     virtual void onMessageReceived(const sp<AMessage> &msg);
78 
79 public:
80     struct NuPlayerStreamListener;
81     struct Source;
82 
83 private:
84     struct Decoder;
85     struct DecoderBase;
86     struct DecoderPassThrough;
87     struct CCDecoder;
88     struct GenericSource;
89     struct HTTPLiveSource;
90     struct Renderer;
91     struct RTSPSource;
92     struct StreamingSource;
93     struct Action;
94     struct SeekAction;
95     struct SetSurfaceAction;
96     struct ResumeDecoderAction;
97     struct FlushDecoderAction;
98     struct PostMessageAction;
99     struct SimpleAction;
100 
101     enum {
102         kWhatSetDataSource              = '=DaS',
103         kWhatPrepare                    = 'prep',
104         kWhatSetVideoNativeWindow       = '=NaW',
105         kWhatSetAudioSink               = '=AuS',
106         kWhatMoreDataQueued             = 'more',
107         kWhatStart                      = 'strt',
108         kWhatScanSources                = 'scan',
109         kWhatVideoNotify                = 'vidN',
110         kWhatAudioNotify                = 'audN',
111         kWhatClosedCaptionNotify        = 'capN',
112         kWhatRendererNotify             = 'renN',
113         kWhatReset                      = 'rset',
114         kWhatSeek                       = 'seek',
115         kWhatPause                      = 'paus',
116         kWhatResume                     = 'rsme',
117         kWhatPollDuration               = 'polD',
118         kWhatSourceNotify               = 'srcN',
119         kWhatGetTrackInfo               = 'gTrI',
120         kWhatGetSelectedTrack           = 'gSel',
121         kWhatSelectTrack                = 'selT',
122     };
123 
124     wp<NuPlayerDriver> mDriver;
125     bool mUIDValid;
126     uid_t mUID;
127     sp<Source> mSource;
128     uint32_t mSourceFlags;
129     sp<NativeWindowWrapper> mNativeWindow;
130     sp<MediaPlayerBase::AudioSink> mAudioSink;
131     sp<DecoderBase> mVideoDecoder;
132     bool mOffloadAudio;
133     sp<DecoderBase> mAudioDecoder;
134     sp<CCDecoder> mCCDecoder;
135     sp<Renderer> mRenderer;
136     sp<ALooper> mRendererLooper;
137     int32_t mAudioDecoderGeneration;
138     int32_t mVideoDecoderGeneration;
139     int32_t mRendererGeneration;
140 
141     List<sp<Action> > mDeferredActions;
142 
143     bool mAudioEOS;
144     bool mVideoEOS;
145 
146     bool mScanSourcesPending;
147     int32_t mScanSourcesGeneration;
148 
149     int32_t mPollDurationGeneration;
150     int32_t mTimedTextGeneration;
151 
152     enum FlushStatus {
153         NONE,
154         FLUSHING_DECODER,
155         FLUSHING_DECODER_SHUTDOWN,
156         SHUTTING_DOWN_DECODER,
157         FLUSHED,
158         SHUT_DOWN,
159     };
160 
161     enum FlushCommand {
162         FLUSH_CMD_NONE,
163         FLUSH_CMD_FLUSH,
164         FLUSH_CMD_SHUTDOWN,
165     };
166 
167     // Status of flush responses from the decoder and renderer.
168     bool mFlushComplete[2][2];
169 
170     FlushStatus mFlushingAudio;
171     FlushStatus mFlushingVideo;
172 
173     // Status of flush responses from the decoder and renderer.
174     bool mResumePending;
175 
176     int32_t mVideoScalingMode;
177 
178     bool mStarted;
179 
180     // Actual pause state, either as requested by client or due to buffering.
181     bool mPaused;
182 
183     // Pause state as requested by client. Note that if mPausedByClient is
184     // true, mPaused is always true; if mPausedByClient is false, mPaused could
185     // still become true, when we pause internally due to buffering.
186     bool mPausedByClient;
187 
getDecoderNuPlayer188     inline const sp<DecoderBase> &getDecoder(bool audio) {
189         return audio ? mAudioDecoder : mVideoDecoder;
190     }
191 
clearFlushCompleteNuPlayer192     inline void clearFlushComplete() {
193         mFlushComplete[0][0] = false;
194         mFlushComplete[0][1] = false;
195         mFlushComplete[1][0] = false;
196         mFlushComplete[1][1] = false;
197     }
198 
199     void tryOpenAudioSinkForOffload(const sp<AMessage> &format, bool hasVideo);
200     void closeAudioSink();
201 
202     status_t instantiateDecoder(bool audio, sp<DecoderBase> *decoder);
203 
204     void updateVideoSize(
205             const sp<AMessage> &inputFormat,
206             const sp<AMessage> &outputFormat = NULL);
207 
208     void notifyListener(int msg, int ext1, int ext2, const Parcel *in = NULL);
209 
210     void handleFlushComplete(bool audio, bool isDecoder);
211     void finishFlushIfPossible();
212 
213     void onStart();
214     void onResume();
215     void onPause();
216 
217     bool audioDecoderStillNeeded();
218 
219     void flushDecoder(bool audio, bool needShutdown);
220 
221     void finishResume();
222 
223     void postScanSources();
224 
225     void schedulePollDuration();
226     void cancelPollDuration();
227 
228     void processDeferredActions();
229 
230     void performSeek(int64_t seekTimeUs, bool needNotify);
231     void performDecoderFlush(FlushCommand audio, FlushCommand video);
232     void performReset();
233     void performScanSources();
234     void performSetSurface(const sp<NativeWindowWrapper> &wrapper);
235     void performResumeDecoders(bool needNotify);
236 
237     void onSourceNotify(const sp<AMessage> &msg);
238     void onClosedCaptionNotify(const sp<AMessage> &msg);
239 
240     void queueDecoderShutdown(
241             bool audio, bool video, const sp<AMessage> &reply);
242 
243     void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex);
244     void sendTimedTextData(const sp<ABuffer> &buffer);
245 
246     void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const;
247 
248     DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
249 };
250 
251 }  // namespace android
252 
253 #endif  // NU_PLAYER_H_
254