1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// IPC messages for android media player.
6// Multiply-included message file, hence no include guard.
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/time/time.h"
13#include "content/common/content_export.h"
14#include "content/common/media/media_player_messages_enums_android.h"
15#include "ipc/ipc_message_macros.h"
16#include "media/base/android/media_player_android.h"
17#include "media/base/android/demuxer_stream_player_params.h"
18#include "media/base/media_keys.h"
19#include "ui/gfx/rect_f.h"
20#include "url/gurl.h"
21
22#undef IPC_MESSAGE_EXPORT
23#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
24#define IPC_MESSAGE_START MediaPlayerMsgStart
25
26IPC_ENUM_TRAITS(media::AudioCodec)
27IPC_ENUM_TRAITS(media::DemuxerStream::Status)
28IPC_ENUM_TRAITS(media::DemuxerStream::Type)
29IPC_ENUM_TRAITS(media::MediaKeys::KeyError)
30IPC_ENUM_TRAITS(media::VideoCodec)
31
32IPC_STRUCT_TRAITS_BEGIN(media::DemuxerConfigs)
33  IPC_STRUCT_TRAITS_MEMBER(audio_codec)
34  IPC_STRUCT_TRAITS_MEMBER(audio_channels)
35  IPC_STRUCT_TRAITS_MEMBER(audio_sampling_rate)
36  IPC_STRUCT_TRAITS_MEMBER(is_audio_encrypted)
37  IPC_STRUCT_TRAITS_MEMBER(audio_extra_data)
38
39  IPC_STRUCT_TRAITS_MEMBER(video_codec)
40  IPC_STRUCT_TRAITS_MEMBER(video_size)
41  IPC_STRUCT_TRAITS_MEMBER(is_video_encrypted)
42  IPC_STRUCT_TRAITS_MEMBER(video_extra_data)
43
44  IPC_STRUCT_TRAITS_MEMBER(duration_ms)
45#if defined(GOOGLE_TV)
46  IPC_STRUCT_TRAITS_MEMBER(key_system)
47#endif  // defined(GOOGLE_TV)
48IPC_STRUCT_TRAITS_END()
49
50IPC_STRUCT_TRAITS_BEGIN(media::DemuxerData)
51  IPC_STRUCT_TRAITS_MEMBER(type)
52  IPC_STRUCT_TRAITS_MEMBER(access_units)
53IPC_STRUCT_TRAITS_END()
54
55IPC_STRUCT_TRAITS_BEGIN(media::AccessUnit)
56  IPC_STRUCT_TRAITS_MEMBER(status)
57  IPC_STRUCT_TRAITS_MEMBER(end_of_stream)
58  IPC_STRUCT_TRAITS_MEMBER(data)
59  IPC_STRUCT_TRAITS_MEMBER(timestamp)
60  IPC_STRUCT_TRAITS_MEMBER(key_id)
61  IPC_STRUCT_TRAITS_MEMBER(iv)
62  IPC_STRUCT_TRAITS_MEMBER(subsamples)
63IPC_STRUCT_TRAITS_END()
64
65IPC_STRUCT_TRAITS_BEGIN(media::SubsampleEntry)
66  IPC_STRUCT_TRAITS_MEMBER(clear_bytes)
67  IPC_STRUCT_TRAITS_MEMBER(cypher_bytes)
68IPC_STRUCT_TRAITS_END()
69
70IPC_ENUM_TRAITS(MediaPlayerHostMsg_Initialize_Type)
71
72// Chrome for Android seek message sequence is:
73// 1. Renderer->Browser MediaPlayerHostMsg_Seek
74//    This is the beginning of actual seek flow in response to web app requests
75//    for seeks and browser MediaPlayerMsg_SeekRequests. With this message,
76//    the renderer asks browser to perform actual seek. At most one of these
77//    actual seeks will be in process between this message and renderer's later
78//    receipt of MediaPlayerMsg_SeekCompleted from the browser.
79// 2. Browser->Renderer MediaPlayerMsg_SeekCompleted
80//    Once the browser determines the seek is complete, it sends this message to
81//    notify the renderer of seek completion.
82//
83// Other seek-related IPC messages:
84// Browser->Renderer MediaPlayerMsg_SeekRequest
85//    Browser requests to begin a seek. All browser-initiated seeks must begin
86//    with this request. Renderer controls actual seek initiation via the normal
87//    seek flow, above, keeping web apps aware of seeks. These requests are
88//    also allowed while another actual seek is in progress.
89//
90// If the demuxer is located in the renderer, as in media source players, the
91// browser must ensure the renderer demuxer is appropriately seeked between
92// receipt of MediaPlayerHostMsg_Seek and transmission of
93// MediaPlayerMsg_SeekCompleted. The following two renderer-demuxer control
94// messages book-end the renderer-demuxer seek:
95// 1.1 Browser->Renderer MediaPlayerMsg_DemuxerSeekRequest
96// 1.2 Renderer->Browser MediaPlayerHostMsg_DemuxerSeekDone
97
98// Only in short-term hack to seek to reach I-Frame to feed a newly constructed
99// video decoder may the above IPC sequence be modified to exclude SeekRequest,
100// Seek and SeekCompleted, with condition that DemuxerSeekRequest's
101// |is_browser_seek| parameter be true. Regular seek messages must still be
102// handled even when a hack browser seek is in progress. In this case, the
103// browser seek request's |time_to_seek| may no longer be buffered and the
104// demuxer may instead seek to a future buffered time. The resulting
105// DemuxerSeekDone message's |actual_browser_seek_time| is the time actually
106// seeked-to, and is only meaningful for these hack browser seeks.
107// TODO(wolenetz): Instead of doing browser seek, replay cached data since last
108// keyframe. See http://crbug.com/304234.
109
110// Messages for notifying the render process of media playback status -------
111
112// Media buffering has updated.
113IPC_MESSAGE_ROUTED2(MediaPlayerMsg_MediaBufferingUpdate,
114                    int /* player_id */,
115                    int /* percent */)
116
117// A media playback error has occurred.
118IPC_MESSAGE_ROUTED2(MediaPlayerMsg_MediaError,
119                    int /* player_id */,
120                    int /* error */)
121
122// Playback is completed.
123IPC_MESSAGE_ROUTED1(MediaPlayerMsg_MediaPlaybackCompleted,
124                    int /* player_id */)
125
126// Media metadata has changed.
127IPC_MESSAGE_ROUTED5(MediaPlayerMsg_MediaMetadataChanged,
128                    int /* player_id */,
129                    base::TimeDelta /* duration */,
130                    int /* width */,
131                    int /* height */,
132                    bool /* success */)
133
134// Requests renderer player to ask its client (blink HTMLMediaElement) to seek.
135IPC_MESSAGE_ROUTED2(MediaPlayerMsg_SeekRequest,
136                    int /* player_id */,
137                    base::TimeDelta /* time_to_seek_to */)
138
139// Media seek is completed.
140IPC_MESSAGE_ROUTED2(MediaPlayerMsg_SeekCompleted,
141                    int /* player_id */,
142                    base::TimeDelta /* current_time */)
143
144// Video size has changed.
145IPC_MESSAGE_ROUTED3(MediaPlayerMsg_MediaVideoSizeChanged,
146                    int /* player_id */,
147                    int /* width */,
148                    int /* height */)
149
150// The current play time has updated.
151IPC_MESSAGE_ROUTED2(MediaPlayerMsg_MediaTimeUpdate,
152                    int /* player_id */,
153                    base::TimeDelta /* current_time */)
154
155// The player has been released.
156IPC_MESSAGE_ROUTED1(MediaPlayerMsg_MediaPlayerReleased,
157                    int /* player_id */)
158
159// The player has entered fullscreen mode.
160IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidEnterFullscreen,
161                    int /* player_id */)
162
163// The player exited fullscreen.
164IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidExitFullscreen,
165                    int /* player_id */)
166
167// The player started playing.
168IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidMediaPlayerPlay,
169                    int /* player_id */)
170
171// The player was paused.
172IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidMediaPlayerPause,
173                    int /* player_id */)
174
175// Requests renderer demuxer seek.
176IPC_MESSAGE_CONTROL3(MediaPlayerMsg_DemuxerSeekRequest,
177                     int /* demuxer_client_id */,
178                     base::TimeDelta /* time_to_seek */,
179                     bool /* is_browser_seek */)
180
181// The media source player reads data from demuxer
182IPC_MESSAGE_CONTROL2(MediaPlayerMsg_ReadFromDemuxer,
183                     int /* demuxer_client_id */,
184                     media::DemuxerStream::Type /* type */)
185
186// The player needs new config data
187IPC_MESSAGE_CONTROL1(MediaPlayerMsg_MediaConfigRequest,
188                     int /* demuxer_client_id */)
189
190IPC_MESSAGE_ROUTED1(MediaPlayerMsg_ConnectedToRemoteDevice,
191                    int /* player_id */)
192
193IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DisconnectedFromRemoteDevice,
194                    int /* player_id */)
195
196// Instructs the video element to enter fullscreen.
197IPC_MESSAGE_ROUTED1(MediaPlayerMsg_RequestFullscreen,
198                    int /*player_id */)
199
200// Messages for controlling the media playback in browser process ----------
201
202// Destroy the media player object.
203IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_DestroyMediaPlayer,
204                    int /* player_id */)
205
206// Destroy all the players.
207IPC_MESSAGE_ROUTED0(MediaPlayerHostMsg_DestroyAllMediaPlayers)
208
209// Initialize a media player object with the given type and player_id. The other
210// parameters are used depending on the type of player.
211//
212// url: the URL to load when initializing a URL player.
213//
214// first_party_for_cookies: the cookie store to use when loading a URL.
215//
216// demuxer_client_id: the demuxer associated with this player when initializing
217// a media source player.
218IPC_MESSAGE_ROUTED5(
219    MediaPlayerHostMsg_Initialize,
220    MediaPlayerHostMsg_Initialize_Type /* type */,
221    int /* player_id */,
222    GURL /* url */,
223    GURL /* first_party_for_cookies */,
224    int /* demuxer_client_id */)
225
226// Pause the player.
227IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Pause,
228                    int /* player_id */,
229                    bool /* is_media_related_action */)
230
231// Release player resources, but keep the object for future usage.
232IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_Release, int /* player_id */)
233
234// Perform a seek.
235IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Seek,
236                    int /* player_id */,
237                    base::TimeDelta /* time */)
238
239// Start the player for playback.
240IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_Start, int /* player_id */)
241
242// Start the player for playback.
243IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_SetVolume,
244                    int /* player_id */,
245                    double /* volume */)
246
247// Requests the player to enter fullscreen.
248IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_EnterFullscreen, int /* player_id */)
249
250// Requests the player to exit fullscreen.
251IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_ExitFullscreen, int /* player_id */)
252
253// Sent after the renderer demuxer has seeked.
254IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DemuxerSeekDone,
255                     int /* demuxer_client_id */,
256                     base::TimeDelta /* actual_browser_seek_time */)
257
258// Inform the media source player that the demuxer is ready.
259IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DemuxerReady,
260                     int /* demuxer_client_id */,
261                     media::DemuxerConfigs)
262
263// Sent when the data was read from the ChunkDemuxer.
264IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_ReadFromDemuxerAck,
265                     int /* demuxer_client_id */,
266                     media::DemuxerData)
267
268// Inform the media source player of changed media duration from demuxer.
269IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DurationChanged,
270                     int /* demuxer_client_id */,
271                     base::TimeDelta /* duration */)
272
273#if defined(VIDEO_HOLE)
274// Notify the player about the external surface, requesting it if necessary.
275IPC_MESSAGE_ROUTED3(MediaPlayerHostMsg_NotifyExternalSurface,
276                    int /* player_id */,
277                    bool /* is_request */,
278                    gfx::RectF /* rect */)
279#endif  // defined(VIDEO_HOLE)
280
281// Messages for encrypted media extensions API ------------------------------
282// TODO(xhwang): Move the following messages to a separate file.
283
284IPC_MESSAGE_ROUTED3(MediaKeysHostMsg_InitializeCDM,
285                    int /* media_keys_id */,
286                    std::vector<uint8> /* uuid */,
287                    GURL /* frame url */)
288
289IPC_MESSAGE_ROUTED4(MediaKeysHostMsg_CreateSession,
290                    int /* media_keys_id */,
291                    uint32_t /* session_id */,
292                    std::string /* type */,
293                    std::vector<uint8> /* init_data */)
294// TODO(jrummell): Use enum for type (http://crbug.com/327449)
295
296IPC_MESSAGE_ROUTED3(MediaKeysHostMsg_UpdateSession,
297                    int /* media_keys_id */,
298                    uint32_t /* session_id */,
299                    std::vector<uint8> /* response */)
300
301IPC_MESSAGE_ROUTED2(MediaKeysHostMsg_ReleaseSession,
302                    int /* media_keys_id */,
303                    uint32_t /* session_id */)
304
305IPC_MESSAGE_ROUTED3(MediaKeysMsg_SessionCreated,
306                    int /* media_keys_id */,
307                    uint32_t /* session_id */,
308                    std::string /* web_session_id */)
309
310IPC_MESSAGE_ROUTED4(MediaKeysMsg_SessionMessage,
311                    int /* media_keys_id */,
312                    uint32_t /* session_id */,
313                    std::vector<uint8> /* message */,
314                    std::string /* destination_url */)
315// TODO(jrummell): Use GURL for destination_url (http://crbug.com/326663)
316
317IPC_MESSAGE_ROUTED2(MediaKeysMsg_SessionReady,
318                    int /* media_keys_id */,
319                    uint32_t /* session_id */)
320
321IPC_MESSAGE_ROUTED2(MediaKeysMsg_SessionClosed,
322                    int /* media_keys_id */,
323                    uint32_t /* session_id */)
324
325IPC_MESSAGE_ROUTED4(MediaKeysMsg_SessionError,
326                    int /* media_keys_id */,
327                    uint32_t /* session_id */,
328                    media::MediaKeys::KeyError /* error_code */,
329                    int /* system_code */)
330