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
36struct ANativeWindow;
37
38namespace android {
39
40struct AVSyncSettings;
41class IGraphicBufferProducer;
42class Surface;
43
44enum 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//
85enum 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//
112enum 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
152enum 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.
167enum 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.
184enum 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
196class MediaPlayerListener: virtual public RefBase
197{
198public:
199    virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) = 0;
200};
201
202struct IMediaHTTPService;
203
204class MediaPlayer : public BnMediaPlayerClient,
205                    public virtual IMediaDeathNotifier
206{
207public:
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
276private:
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