1 /*
2  * Copyright (C) 2007 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 ANDROID_MEDIAPLAYER_H
18 #define ANDROID_MEDIAPLAYER_H
19 
20 #include <media/mediaplayer_common.h>
21 
22 #include <arpa/inet.h>
23 
24 #include <binder/IMemory.h>
25 
26 #include <media/AudioResamplerPublic.h>
27 #include <media/BufferingSettings.h>
28 #include <media/IMediaPlayerClient.h>
29 #include <media/IMediaPlayer.h>
30 #include <media/IMediaDeathNotifier.h>
31 #include <media/IStreamSource.h>
32 
33 #include <utils/KeyedVector.h>
34 #include <utils/String8.h>
35 
36 struct ANativeWindow;
37 
38 namespace android {
39 
40 struct AVSyncSettings;
41 class IGraphicBufferProducer;
42 class Surface;
43 
44 enum media_event_type {
45     MEDIA_NOP               = 0, // interface test message
46     MEDIA_PREPARED          = 1,
47     MEDIA_PLAYBACK_COMPLETE = 2,
48     MEDIA_BUFFERING_UPDATE  = 3,
49     MEDIA_SEEK_COMPLETE     = 4,
50     MEDIA_SET_VIDEO_SIZE    = 5,
51     MEDIA_STARTED           = 6,
52     MEDIA_PAUSED            = 7,
53     MEDIA_STOPPED           = 8,
54     MEDIA_SKIPPED           = 9,
55     MEDIA_NOTIFY_TIME       = 98,
56     MEDIA_TIMED_TEXT        = 99,
57     MEDIA_ERROR             = 100,
58     MEDIA_INFO              = 200,
59     MEDIA_SUBTITLE_DATA     = 201,
60     MEDIA_META_DATA         = 202,
61     MEDIA_DRM_INFO          = 210,
62     MEDIA_TIME_DISCONTINUITY = 211,
63     MEDIA_AUDIO_ROUTING_CHANGED = 10000,
64 };
65 
66 // Generic error codes for the media player framework.  Errors are fatal, the
67 // playback must abort.
68 //
69 // Errors are communicated back to the client using the
70 // MediaPlayerListener::notify method defined below.
71 // In this situation, 'notify' is invoked with the following:
72 //   'msg' is set to MEDIA_ERROR.
73 //   'ext1' should be a value from the enum media_error_type.
74 //   'ext2' contains an implementation dependant error code to provide
75 //          more details. Should default to 0 when not used.
76 //
77 // The codes are distributed as follow:
78 //   0xx: Reserved
79 //   1xx: Android Player errors. Something went wrong inside the MediaPlayer.
80 //   2xx: Media errors (e.g Codec not supported). There is a problem with the
81 //        media itself.
82 //   3xx: Runtime errors. Some extraordinary condition arose making the playback
83 //        impossible.
84 //
85 enum media_error_type {
86     // 0xx
87     MEDIA_ERROR_UNKNOWN = 1,
88     // 1xx
89     MEDIA_ERROR_SERVER_DIED = 100,
90     // 2xx
91     MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200,
92     // 3xx
93 };
94 
95 
96 // Info and warning codes for the media player framework.  These are non fatal,
97 // the playback is going on but there might be some user visible issues.
98 //
99 // Info and warning messages are communicated back to the client using the
100 // MediaPlayerListener::notify method defined below.  In this situation,
101 // 'notify' is invoked with the following:
102 //   'msg' is set to MEDIA_INFO.
103 //   'ext1' should be a value from the enum media_info_type.
104 //   'ext2' contains an implementation dependant info code to provide
105 //          more details. Should default to 0 when not used.
106 //
107 // The codes are distributed as follow:
108 //   0xx: Reserved
109 //   7xx: Android Player info/warning (e.g player lagging behind.)
110 //   8xx: Media info/warning (e.g media badly interleaved.)
111 //
112 enum media_info_type {
113     // 0xx
114     MEDIA_INFO_UNKNOWN = 1,
115     // The player was started because it was used as the next player for another
116     // player, which just completed playback
117     MEDIA_INFO_STARTED_AS_NEXT = 2,
118     // The player just pushed the very first video frame for rendering
119     MEDIA_INFO_RENDERING_START = 3,
120     // 7xx
121     // The video is too complex for the decoder: it can't decode frames fast
122     // enough. Possibly only the audio plays fine at this stage.
123     MEDIA_INFO_VIDEO_TRACK_LAGGING = 700,
124     // MediaPlayer is temporarily pausing playback internally in order to
125     // buffer more data.
126     MEDIA_INFO_BUFFERING_START = 701,
127     // MediaPlayer is resuming playback after filling buffers.
128     MEDIA_INFO_BUFFERING_END = 702,
129     // Bandwidth in recent past
130     MEDIA_INFO_NETWORK_BANDWIDTH = 703,
131 
132     // 8xx
133     // Bad interleaving means that a media has been improperly interleaved or not
134     // interleaved at all, e.g has all the video samples first then all the audio
135     // ones. Video is playing but a lot of disk seek may be happening.
136     MEDIA_INFO_BAD_INTERLEAVING = 800,
137     // The media is not seekable (e.g live stream).
138     MEDIA_INFO_NOT_SEEKABLE = 801,
139     // New media metadata is available.
140     MEDIA_INFO_METADATA_UPDATE = 802,
141     // Audio can not be played.
142     MEDIA_INFO_PLAY_AUDIO_ERROR = 804,
143     // Video can not be played.
144     MEDIA_INFO_PLAY_VIDEO_ERROR = 805,
145 
146     //9xx
147     MEDIA_INFO_TIMED_TEXT_ERROR = 900,
148 };
149 
150 
151 
152 enum media_player_states {
153     MEDIA_PLAYER_STATE_ERROR        = 0,
154     MEDIA_PLAYER_IDLE               = 1 << 0,
155     MEDIA_PLAYER_INITIALIZED        = 1 << 1,
156     MEDIA_PLAYER_PREPARING          = 1 << 2,
157     MEDIA_PLAYER_PREPARED           = 1 << 3,
158     MEDIA_PLAYER_STARTED            = 1 << 4,
159     MEDIA_PLAYER_PAUSED             = 1 << 5,
160     MEDIA_PLAYER_STOPPED            = 1 << 6,
161     MEDIA_PLAYER_PLAYBACK_COMPLETE  = 1 << 7
162 };
163 
164 // Keep KEY_PARAMETER_* in sync with MediaPlayer.java.
165 // The same enum space is used for both set and get, in case there are future keys that
166 // can be both set and get.  But as of now, all parameters are either set only or get only.
167 enum media_parameter_keys {
168     // Streaming/buffering parameters
169     KEY_PARAMETER_CACHE_STAT_COLLECT_FREQ_MS = 1100,            // set only
170 
171     // Return a Parcel containing a single int, which is the channel count of the
172     // audio track, or zero for error (e.g. no audio track) or unknown.
173     KEY_PARAMETER_AUDIO_CHANNEL_COUNT = 1200,                   // get only
174 
175     // Playback rate expressed in permille (1000 is normal speed), saved as int32_t, with negative
176     // values used for rewinding or reverse playback.
177     KEY_PARAMETER_PLAYBACK_RATE_PERMILLE = 1300,                // set only
178 
179     // Set a Parcel containing the value of a parcelled Java AudioAttribute instance
180     KEY_PARAMETER_AUDIO_ATTRIBUTES = 1400                       // set only
181 };
182 
183 // Keep INVOKE_ID_* in sync with MediaPlayer.java.
184 enum media_player_invoke_ids {
185     INVOKE_ID_GET_TRACK_INFO = 1,
186     INVOKE_ID_ADD_EXTERNAL_SOURCE = 2,
187     INVOKE_ID_ADD_EXTERNAL_SOURCE_FD = 3,
188     INVOKE_ID_SELECT_TRACK = 4,
189     INVOKE_ID_UNSELECT_TRACK = 5,
190     INVOKE_ID_SET_VIDEO_SCALING_MODE = 6,
191     INVOKE_ID_GET_SELECTED_TRACK = 7
192 };
193 
194 // ----------------------------------------------------------------------------
195 // ref-counted object for callbacks
196 class MediaPlayerListener: virtual public RefBase
197 {
198 public:
199     virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) = 0;
200 };
201 
202 struct IMediaHTTPService;
203 
204 class MediaPlayer : public BnMediaPlayerClient,
205                     public virtual IMediaDeathNotifier
206 {
207 public:
208     MediaPlayer();
209     ~MediaPlayer();
210             void            died();
211             void            disconnect();
212 
213             status_t        setDataSource(
214                     const sp<IMediaHTTPService> &httpService,
215                     const char *url,
216                     const KeyedVector<String8, String8> *headers);
217 
218             status_t        setDataSource(int fd, int64_t offset, int64_t length);
219             status_t        setDataSource(const sp<IDataSource> &source);
220             status_t        setVideoSurfaceTexture(
221                                     const sp<IGraphicBufferProducer>& bufferProducer);
222             status_t        setListener(const sp<MediaPlayerListener>& listener);
223             status_t        getBufferingSettings(BufferingSettings* buffering /* nonnull */);
224             status_t        setBufferingSettings(const BufferingSettings& buffering);
225             status_t        prepare();
226             status_t        prepareAsync();
227             status_t        start();
228             status_t        stop();
229             status_t        pause();
230             bool            isPlaying();
231             status_t        setPlaybackSettings(const AudioPlaybackRate& rate);
232             status_t        getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */);
233             status_t        setSyncSettings(const AVSyncSettings& sync, float videoFpsHint);
234             status_t        getSyncSettings(
235                                     AVSyncSettings* sync /* nonnull */,
236                                     float* videoFps /* nonnull */);
237             status_t        getVideoWidth(int *w);
238             status_t        getVideoHeight(int *h);
239             status_t        seekTo(
240                     int msec,
241                     MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC);
242             status_t        notifyAt(int64_t mediaTimeUs);
243             status_t        getCurrentPosition(int *msec);
244             status_t        getDuration(int *msec);
245             status_t        reset();
246             status_t        setAudioStreamType(audio_stream_type_t type);
247             status_t        getAudioStreamType(audio_stream_type_t *type);
248             status_t        setLooping(int loop);
249             bool            isLooping();
250             status_t        setVolume(float leftVolume, float rightVolume);
251             void            notify(int msg, int ext1, int ext2, const Parcel *obj = NULL);
252             status_t        invoke(const Parcel& request, Parcel *reply);
253             status_t        setMetadataFilter(const Parcel& filter);
254             status_t        getMetadata(bool update_only, bool apply_filter, Parcel *metadata);
255             status_t        setAudioSessionId(audio_session_t sessionId);
256             audio_session_t getAudioSessionId();
257             status_t        setAuxEffectSendLevel(float level);
258             status_t        attachAuxEffect(int effectId);
259             status_t        setParameter(int key, const Parcel& request);
260             status_t        getParameter(int key, Parcel* reply);
261             status_t        setRetransmitEndpoint(const char* addrString, uint16_t port);
262             status_t        setNextMediaPlayer(const sp<MediaPlayer>& player);
263 
264             media::VolumeShaper::Status applyVolumeShaper(
265                                     const sp<media::VolumeShaper::Configuration>& configuration,
266                                     const sp<media::VolumeShaper::Operation>& operation);
267             sp<media::VolumeShaper::State> getVolumeShaperState(int id);
268             // Modular DRM
269             status_t        prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
270             status_t        releaseDrm();
271             // AudioRouting
272             status_t        setOutputDevice(audio_port_handle_t deviceId);
273             audio_port_handle_t getRoutedDeviceId();
274             status_t        enableAudioDeviceCallback(bool enabled);
275 
276 private:
277             void            clear_l();
278             status_t        seekTo_l(int msec, MediaPlayerSeekMode mode);
279             status_t        prepareAsync_l();
280             status_t        getDuration_l(int *msec);
281             status_t        attachNewPlayer(const sp<IMediaPlayer>& player);
282             status_t        reset_l();
283             status_t        doSetRetransmitEndpoint(const sp<IMediaPlayer>& player);
284             status_t        checkStateForKeySet_l(int key);
285 
286     sp<IMediaPlayer>            mPlayer;
287     thread_id_t                 mLockThreadId;
288     Mutex                       mLock;
289     Mutex                       mNotifyLock;
290     Condition                   mSignal;
291     sp<MediaPlayerListener>     mListener;
292     void*                       mCookie;
293     media_player_states         mCurrentState;
294     int                         mCurrentPosition;
295     MediaPlayerSeekMode         mCurrentSeekMode;
296     int                         mSeekPosition;
297     MediaPlayerSeekMode         mSeekMode;
298     bool                        mPrepareSync;
299     status_t                    mPrepareStatus;
300     audio_stream_type_t         mStreamType;
301     Parcel*                     mAudioAttributesParcel;
302     bool                        mLoop;
303     float                       mLeftVolume;
304     float                       mRightVolume;
305     int                         mVideoWidth;
306     int                         mVideoHeight;
307     audio_session_t             mAudioSessionId;
308     float                       mSendLevel;
309     struct sockaddr_in          mRetransmitEndpoint;
310     bool                        mRetransmitEndpointValid;
311 };
312 
313 }; // namespace android
314 
315 #endif // ANDROID_MEDIAPLAYER_H
316