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 "base/basictypes.h"
9#include "base/time/time.h"
10#include "content/common/content_export.h"
11#include "content/common/media/media_player_messages_enums_android.h"
12#include "ipc/ipc_message_macros.h"
13#include "media/base/android/media_player_android.h"
14#include "media/base/android/demuxer_stream_player_params.h"
15#include "ui/gfx/rect_f.h"
16#include "url/gurl.h"
17
18#undef IPC_MESSAGE_EXPORT
19#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
20#define IPC_MESSAGE_START MediaPlayerMsgStart
21
22IPC_ENUM_TRAITS(media::AudioCodec)
23IPC_ENUM_TRAITS(media::DemuxerStream::Status)
24IPC_ENUM_TRAITS(media::DemuxerStream::Type)
25IPC_ENUM_TRAITS(media::VideoCodec)
26
27IPC_STRUCT_TRAITS_BEGIN(media::DemuxerConfigs)
28  IPC_STRUCT_TRAITS_MEMBER(audio_codec)
29  IPC_STRUCT_TRAITS_MEMBER(audio_channels)
30  IPC_STRUCT_TRAITS_MEMBER(audio_sampling_rate)
31  IPC_STRUCT_TRAITS_MEMBER(is_audio_encrypted)
32  IPC_STRUCT_TRAITS_MEMBER(audio_extra_data)
33
34  IPC_STRUCT_TRAITS_MEMBER(video_codec)
35  IPC_STRUCT_TRAITS_MEMBER(video_size)
36  IPC_STRUCT_TRAITS_MEMBER(is_video_encrypted)
37  IPC_STRUCT_TRAITS_MEMBER(video_extra_data)
38
39  IPC_STRUCT_TRAITS_MEMBER(duration)
40IPC_STRUCT_TRAITS_END()
41
42IPC_STRUCT_TRAITS_BEGIN(media::DemuxerData)
43  IPC_STRUCT_TRAITS_MEMBER(type)
44  IPC_STRUCT_TRAITS_MEMBER(access_units)
45  IPC_STRUCT_TRAITS_MEMBER(demuxer_configs)
46IPC_STRUCT_TRAITS_END()
47
48IPC_STRUCT_TRAITS_BEGIN(media::AccessUnit)
49  IPC_STRUCT_TRAITS_MEMBER(status)
50  IPC_STRUCT_TRAITS_MEMBER(end_of_stream)
51  IPC_STRUCT_TRAITS_MEMBER(data)
52  IPC_STRUCT_TRAITS_MEMBER(timestamp)
53  IPC_STRUCT_TRAITS_MEMBER(key_id)
54  IPC_STRUCT_TRAITS_MEMBER(iv)
55  IPC_STRUCT_TRAITS_MEMBER(subsamples)
56IPC_STRUCT_TRAITS_END()
57
58IPC_STRUCT_TRAITS_BEGIN(media::SubsampleEntry)
59  IPC_STRUCT_TRAITS_MEMBER(clear_bytes)
60  IPC_STRUCT_TRAITS_MEMBER(cypher_bytes)
61IPC_STRUCT_TRAITS_END()
62
63IPC_ENUM_TRAITS(MediaPlayerHostMsg_Initialize_Type)
64
65// Parameters to describe a media player
66IPC_STRUCT_BEGIN(MediaPlayerHostMsg_Initialize_Params)
67  IPC_STRUCT_MEMBER(MediaPlayerHostMsg_Initialize_Type, type)
68  IPC_STRUCT_MEMBER(base::SharedMemoryHandle, metafile_data_handle)
69  IPC_STRUCT_MEMBER(int, player_id)
70  IPC_STRUCT_MEMBER(int, demuxer_client_id)
71  IPC_STRUCT_MEMBER(GURL, url)
72  IPC_STRUCT_MEMBER(GURL, first_party_for_cookies)
73  IPC_STRUCT_MEMBER(GURL, frame_url)
74  IPC_STRUCT_MEMBER(bool, allow_credentials)
75IPC_STRUCT_END()
76
77// Chrome for Android seek message sequence is:
78// 1. Renderer->Browser MediaPlayerHostMsg_Seek
79//    This is the beginning of actual seek flow in response to web app requests
80//    for seeks and browser MediaPlayerMsg_SeekRequests. With this message,
81//    the renderer asks browser to perform actual seek. At most one of these
82//    actual seeks will be in process between this message and renderer's later
83//    receipt of MediaPlayerMsg_SeekCompleted from the browser.
84// 2. Browser->Renderer MediaPlayerMsg_SeekCompleted
85//    Once the browser determines the seek is complete, it sends this message to
86//    notify the renderer of seek completion.
87//
88// Other seek-related IPC messages:
89// Browser->Renderer MediaPlayerMsg_SeekRequest
90//    Browser requests to begin a seek. All browser-initiated seeks must begin
91//    with this request. Renderer controls actual seek initiation via the normal
92//    seek flow, above, keeping web apps aware of seeks. These requests are
93//    also allowed while another actual seek is in progress.
94//
95// If the demuxer is located in the renderer, as in media source players, the
96// browser must ensure the renderer demuxer is appropriately seeked between
97// receipt of MediaPlayerHostMsg_Seek and transmission of
98// MediaPlayerMsg_SeekCompleted. The following two renderer-demuxer control
99// messages book-end the renderer-demuxer seek:
100// 1.1 Browser->Renderer MediaPlayerMsg_DemuxerSeekRequest
101// 1.2 Renderer->Browser MediaPlayerHostMsg_DemuxerSeekDone
102
103// Only in short-term hack to seek to reach I-Frame to feed a newly constructed
104// video decoder may the above IPC sequence be modified to exclude SeekRequest,
105// Seek and SeekCompleted, with condition that DemuxerSeekRequest's
106// |is_browser_seek| parameter be true. Regular seek messages must still be
107// handled even when a hack browser seek is in progress. In this case, the
108// browser seek request's |time_to_seek| may no longer be buffered and the
109// demuxer may instead seek to a future buffered time. The resulting
110// DemuxerSeekDone message's |actual_browser_seek_time| is the time actually
111// seeked-to, and is only meaningful for these hack browser seeks.
112// TODO(wolenetz): Instead of doing browser seek, replay cached data since last
113// keyframe. See http://crbug.com/304234.
114
115// Messages for notifying the render process of media playback status -------
116
117// Media buffering has updated.
118IPC_MESSAGE_ROUTED2(MediaPlayerMsg_MediaBufferingUpdate,
119                    int /* player_id */,
120                    int /* percent */)
121
122// A media playback error has occurred.
123IPC_MESSAGE_ROUTED2(MediaPlayerMsg_MediaError,
124                    int /* player_id */,
125                    int /* error */)
126
127// Playback is completed.
128IPC_MESSAGE_ROUTED1(MediaPlayerMsg_MediaPlaybackCompleted,
129                    int /* player_id */)
130
131// Media metadata has changed.
132IPC_MESSAGE_ROUTED5(MediaPlayerMsg_MediaMetadataChanged,
133                    int /* player_id */,
134                    base::TimeDelta /* duration */,
135                    int /* width */,
136                    int /* height */,
137                    bool /* success */)
138
139// Requests renderer player to ask its client (blink HTMLMediaElement) to seek.
140IPC_MESSAGE_ROUTED2(MediaPlayerMsg_SeekRequest,
141                    int /* player_id */,
142                    base::TimeDelta /* time_to_seek_to */)
143
144// Media seek is completed.
145IPC_MESSAGE_ROUTED2(MediaPlayerMsg_SeekCompleted,
146                    int /* player_id */,
147                    base::TimeDelta /* current_time */)
148
149// Video size has changed.
150IPC_MESSAGE_ROUTED3(MediaPlayerMsg_MediaVideoSizeChanged,
151                    int /* player_id */,
152                    int /* width */,
153                    int /* height */)
154
155// The current play time has updated.
156IPC_MESSAGE_ROUTED2(MediaPlayerMsg_MediaTimeUpdate,
157                    int /* player_id */,
158                    base::TimeDelta /* current_time */)
159
160// The player has been released.
161IPC_MESSAGE_ROUTED1(MediaPlayerMsg_MediaPlayerReleased,
162                    int /* player_id */)
163
164// The player has entered fullscreen mode.
165IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidEnterFullscreen,
166                    int /* player_id */)
167
168// The player exited fullscreen.
169IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidExitFullscreen,
170                    int /* player_id */)
171
172// The player started playing.
173IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidMediaPlayerPlay,
174                    int /* player_id */)
175
176// The player was paused.
177IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidMediaPlayerPause,
178                    int /* player_id */)
179
180// Requests renderer demuxer seek.
181IPC_MESSAGE_CONTROL3(MediaPlayerMsg_DemuxerSeekRequest,
182                     int /* demuxer_client_id */,
183                     base::TimeDelta /* time_to_seek */,
184                     bool /* is_browser_seek */)
185
186// The media source player reads data from demuxer
187IPC_MESSAGE_CONTROL2(MediaPlayerMsg_ReadFromDemuxer,
188                     int /* demuxer_client_id */,
189                     media::DemuxerStream::Type /* type */)
190
191// Clank has connected to the remote device.
192IPC_MESSAGE_ROUTED2(MediaPlayerMsg_ConnectedToRemoteDevice,
193                    int /* player_id */,
194                    std::string /* remote_playback_message */)
195
196// Clank has disconnected from the remote device.
197IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DisconnectedFromRemoteDevice,
198                    int /* player_id */)
199
200// Instructs the video element to enter fullscreen.
201IPC_MESSAGE_ROUTED1(MediaPlayerMsg_RequestFullscreen,
202                    int /*player_id */)
203
204// Pauses all video playback.
205IPC_MESSAGE_ROUTED0(MediaPlayerMsg_PauseVideo)
206
207// Messages for controlling the media playback in browser process ----------
208
209// Destroy the media player object.
210IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_DestroyMediaPlayer,
211                    int /* player_id */)
212
213// Initialize a media player object.
214IPC_MESSAGE_ROUTED1(
215    MediaPlayerHostMsg_Initialize,
216    MediaPlayerHostMsg_Initialize_Params);
217
218// Pause the player.
219IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Pause,
220                    int /* player_id */,
221                    bool /* is_media_related_action */)
222
223// Release player resources, but keep the object for future usage.
224IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_Release, int /* player_id */)
225
226// Perform a seek.
227IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Seek,
228                    int /* player_id */,
229                    base::TimeDelta /* time */)
230
231// Start the player for playback.
232IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_Start, int /* player_id */)
233
234// Set the volume.
235IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_SetVolume,
236                    int /* player_id */,
237                    double /* volume */)
238
239// Set the poster image.
240IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_SetPoster,
241                    int /* player_id */,
242                    GURL /* poster url */)
243
244// Requests the player to enter fullscreen.
245IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_EnterFullscreen, int /* player_id */)
246
247// Requests the player to exit fullscreen.
248IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_ExitFullscreen, int /* player_id */)
249
250// Requests the player with |player_id| to use the CDM with |cdm_id|.
251IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_SetCdm,
252                    int /* player_id */,
253                    int /* cdm_id */);
254
255// Sent after the renderer demuxer has seeked.
256IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DemuxerSeekDone,
257                     int /* demuxer_client_id */,
258                     base::TimeDelta /* actual_browser_seek_time */)
259
260// Inform the media source player that the demuxer is ready.
261IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DemuxerReady,
262                     int /* demuxer_client_id */,
263                     media::DemuxerConfigs)
264
265// Sent when the data was read from the ChunkDemuxer.
266IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_ReadFromDemuxerAck,
267                     int /* demuxer_client_id */,
268                     media::DemuxerData)
269
270// Inform the media source player of changed media duration from demuxer.
271IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DurationChanged,
272                     int /* demuxer_client_id */,
273                     base::TimeDelta /* duration */)
274
275#if defined(VIDEO_HOLE)
276// Notify the player about the external surface, requesting it if necessary.
277// |is_request| true if the player is requesting the external surface.
278// |rect| the boundary rectangle of the video element.
279IPC_MESSAGE_ROUTED3(MediaPlayerHostMsg_NotifyExternalSurface,
280                    int /* player_id */,
281                    bool /* is_request */,
282                    gfx::RectF /* rect */)
283#endif  // defined(VIDEO_HOLE)
284