• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     void resume();
58 
59     // Will notify the driver through "notifyResetComplete" once finished.
60     void resetAsync();
61 
62     // Will notify the driver through "notifySeekComplete" once finished
63     // and needNotify is true.
64     void seekToAsync(int64_t seekTimeUs, bool needNotify = false);
65 
66     status_t setVideoScalingMode(int32_t mode);
67     status_t getTrackInfo(Parcel* reply) const;
68     status_t getSelectedTrack(int32_t type, Parcel* reply) const;
69     status_t selectTrack(size_t trackIndex, bool select);
70     status_t getCurrentPosition(int64_t *mediaUs);
71     void getStats(int64_t *mNumFramesTotal, int64_t *mNumFramesDropped);
72 
73     sp<MetaData> getFileMeta();
74 
75     static const size_t kAggregateBufferSizeBytes;
76 
77 protected:
78     virtual ~NuPlayer();
79 
80     virtual void onMessageReceived(const sp<AMessage> &msg);
81 
82 public:
83     struct NuPlayerStreamListener;
84     struct Source;
85 
86 private:
87     struct Decoder;
88     struct DecoderPassThrough;
89     struct CCDecoder;
90     struct GenericSource;
91     struct HTTPLiveSource;
92     struct Renderer;
93     struct RTSPSource;
94     struct StreamingSource;
95     struct Action;
96     struct SeekAction;
97     struct SetSurfaceAction;
98     struct ShutdownDecoderAction;
99     struct PostMessageAction;
100     struct SimpleAction;
101 
102     enum {
103         kWhatSetDataSource              = '=DaS',
104         kWhatPrepare                    = 'prep',
105         kWhatSetVideoNativeWindow       = '=NaW',
106         kWhatSetAudioSink               = '=AuS',
107         kWhatMoreDataQueued             = 'more',
108         kWhatStart                      = 'strt',
109         kWhatScanSources                = 'scan',
110         kWhatVideoNotify                = 'vidN',
111         kWhatAudioNotify                = 'audN',
112         kWhatClosedCaptionNotify        = 'capN',
113         kWhatRendererNotify             = 'renN',
114         kWhatReset                      = 'rset',
115         kWhatSeek                       = 'seek',
116         kWhatPause                      = 'paus',
117         kWhatResume                     = 'rsme',
118         kWhatPollDuration               = 'polD',
119         kWhatSourceNotify               = 'srcN',
120         kWhatGetTrackInfo               = 'gTrI',
121         kWhatGetSelectedTrack           = 'gSel',
122         kWhatSelectTrack                = 'selT',
123     };
124 
125     wp<NuPlayerDriver> mDriver;
126     bool mUIDValid;
127     uid_t mUID;
128     sp<Source> mSource;
129     uint32_t mSourceFlags;
130     sp<NativeWindowWrapper> mNativeWindow;
131     sp<MediaPlayerBase::AudioSink> mAudioSink;
132     sp<Decoder> mVideoDecoder;
133     bool mVideoIsAVC;
134     bool mOffloadAudio;
135     sp<Decoder> mAudioDecoder;
136     sp<CCDecoder> mCCDecoder;
137     sp<Renderer> mRenderer;
138     sp<ALooper> mRendererLooper;
139     int32_t mAudioDecoderGeneration;
140     int32_t mVideoDecoderGeneration;
141     int32_t mRendererGeneration;
142 
143     List<sp<Action> > mDeferredActions;
144 
145     bool mAudioEOS;
146     bool mVideoEOS;
147 
148     bool mScanSourcesPending;
149     int32_t mScanSourcesGeneration;
150 
151     int32_t mPollDurationGeneration;
152     int32_t mTimedTextGeneration;
153 
154     enum FlushStatus {
155         NONE,
156         FLUSHING_DECODER,
157         FLUSHING_DECODER_SHUTDOWN,
158         SHUTTING_DOWN_DECODER,
159         FLUSHED,
160         SHUT_DOWN,
161     };
162 
163     // Once the current flush is complete this indicates whether the
164     // notion of time has changed.
165     bool mTimeDiscontinuityPending;
166 
167     // Status of flush responses from the decoder and renderer.
168     bool mFlushComplete[2][2];
169 
170     // Used by feedDecoderInputData to aggregate small buffers into
171     // one large buffer.
172     sp<ABuffer> mPendingAudioAccessUnit;
173     status_t    mPendingAudioErr;
174     sp<ABuffer> mAggregateBuffer;
175 
176     FlushStatus mFlushingAudio;
177     FlushStatus mFlushingVideo;
178 
179     int64_t mSkipRenderingAudioUntilMediaTimeUs;
180     int64_t mSkipRenderingVideoUntilMediaTimeUs;
181 
182     int64_t mNumFramesTotal, mNumFramesDropped;
183 
184     int32_t mVideoScalingMode;
185 
186     bool mStarted;
187 
getDecoderNuPlayer188     inline const sp<Decoder> &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 openAudioSink(const sp<AMessage> &format, bool offloadOnly);
200     void closeAudioSink();
201 
202     status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
203 
204     void updateVideoSize(
205             const sp<AMessage> &inputFormat,
206             const sp<AMessage> &outputFormat = NULL);
207 
208     status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
209     void renderBuffer(bool audio, const sp<AMessage> &msg);
210 
211     void notifyListener(int msg, int ext1, int ext2, const Parcel *in = NULL);
212 
213     void handleFlushComplete(bool audio, bool isDecoder);
214     void finishFlushIfPossible();
215 
216     bool audioDecoderStillNeeded();
217 
218     void flushDecoder(
219             bool audio, bool needShutdown, const sp<AMessage> &newFormat = NULL);
220     void updateDecoderFormatWithoutFlush(bool audio, const sp<AMessage> &format);
221 
222     void postScanSources();
223 
224     void schedulePollDuration();
225     void cancelPollDuration();
226 
227     void processDeferredActions();
228 
229     void performSeek(int64_t seekTimeUs, bool needNotify);
230     void performDecoderFlush();
231     void performDecoderShutdown(bool audio, bool video);
232     void performReset();
233     void performScanSources();
234     void performSetSurface(const sp<NativeWindowWrapper> &wrapper);
235 
236     void onSourceNotify(const sp<AMessage> &msg);
237     void onClosedCaptionNotify(const sp<AMessage> &msg);
238 
239     void queueDecoderShutdown(
240             bool audio, bool video, const sp<AMessage> &reply);
241 
242     void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex);
243     void sendTimedTextData(const sp<ABuffer> &buffer);
244 
245     void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const;
246 
247     DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
248 };
249 
250 }  // namespace android
251 
252 #endif  // NU_PLAYER_H_
253