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 22 IPC_ENUM_TRAITS(media::AudioCodec) 23 IPC_ENUM_TRAITS(media::DemuxerStream::Status) 24 IPC_ENUM_TRAITS(media::DemuxerStream::Type) 25 IPC_ENUM_TRAITS(media::VideoCodec) 26 27 IPC_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) 40 IPC_STRUCT_TRAITS_END() 41 42 IPC_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) 46 IPC_STRUCT_TRAITS_END() 47 48 IPC_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) 56 IPC_STRUCT_TRAITS_END() 57 58 IPC_STRUCT_TRAITS_BEGIN(media::SubsampleEntry) 59 IPC_STRUCT_TRAITS_MEMBER(clear_bytes) 60 IPC_STRUCT_TRAITS_MEMBER(cypher_bytes) 61 IPC_STRUCT_TRAITS_END() 62 63 IPC_ENUM_TRAITS(MediaPlayerHostMsg_Initialize_Type) 64 65 // Parameters to describe a media player 66 IPC_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) 75 IPC_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. 118 IPC_MESSAGE_ROUTED2(MediaPlayerMsg_MediaBufferingUpdate, 119 int /* player_id */, 120 int /* percent */) 121 122 // A media playback error has occurred. 123 IPC_MESSAGE_ROUTED2(MediaPlayerMsg_MediaError, 124 int /* player_id */, 125 int /* error */) 126 127 // Playback is completed. 128 IPC_MESSAGE_ROUTED1(MediaPlayerMsg_MediaPlaybackCompleted, 129 int /* player_id */) 130 131 // Media metadata has changed. 132 IPC_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. 140 IPC_MESSAGE_ROUTED2(MediaPlayerMsg_SeekRequest, 141 int /* player_id */, 142 base::TimeDelta /* time_to_seek_to */) 143 144 // Media seek is completed. 145 IPC_MESSAGE_ROUTED2(MediaPlayerMsg_SeekCompleted, 146 int /* player_id */, 147 base::TimeDelta /* current_time */) 148 149 // Video size has changed. 150 IPC_MESSAGE_ROUTED3(MediaPlayerMsg_MediaVideoSizeChanged, 151 int /* player_id */, 152 int /* width */, 153 int /* height */) 154 155 // The current play time has updated. 156 IPC_MESSAGE_ROUTED3(MediaPlayerMsg_MediaTimeUpdate, 157 int /* player_id */, 158 base::TimeDelta /* current_timestamp */, 159 base::TimeTicks /* current_time_ticks */) 160 161 // The player has been released. 162 IPC_MESSAGE_ROUTED1(MediaPlayerMsg_MediaPlayerReleased, 163 int /* player_id */) 164 165 // The player has entered fullscreen mode. 166 IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidEnterFullscreen, 167 int /* player_id */) 168 169 // The player exited fullscreen. 170 IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidExitFullscreen, 171 int /* player_id */) 172 173 // The player started playing. 174 IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidMediaPlayerPlay, 175 int /* player_id */) 176 177 // The player was paused. 178 IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DidMediaPlayerPause, 179 int /* player_id */) 180 181 // Requests renderer demuxer seek. 182 IPC_MESSAGE_CONTROL3(MediaPlayerMsg_DemuxerSeekRequest, 183 int /* demuxer_client_id */, 184 base::TimeDelta /* time_to_seek */, 185 bool /* is_browser_seek */) 186 187 // The media source player reads data from demuxer 188 IPC_MESSAGE_CONTROL2(MediaPlayerMsg_ReadFromDemuxer, 189 int /* demuxer_client_id */, 190 media::DemuxerStream::Type /* type */) 191 192 // Clank has connected to the remote device. 193 IPC_MESSAGE_ROUTED2(MediaPlayerMsg_ConnectedToRemoteDevice, 194 int /* player_id */, 195 std::string /* remote_playback_message */) 196 197 // Clank has disconnected from the remote device. 198 IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DisconnectedFromRemoteDevice, 199 int /* player_id */) 200 201 // The availability of remote devices has changed 202 IPC_MESSAGE_ROUTED2(MediaPlayerMsg_RemoteRouteAvailabilityChanged, 203 int /* player_id */, 204 bool /* routes_available */) 205 206 // Instructs the video element to enter fullscreen. 207 IPC_MESSAGE_ROUTED1(MediaPlayerMsg_RequestFullscreen, 208 int /*player_id */) 209 210 // Messages for controlling the media playback in browser process ---------- 211 212 // Destroy the media player object. 213 IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_DestroyMediaPlayer, 214 int /* player_id */) 215 216 // Initialize a media player object. 217 IPC_MESSAGE_ROUTED1( 218 MediaPlayerHostMsg_Initialize, 219 MediaPlayerHostMsg_Initialize_Params); 220 221 // Pause the player. 222 IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Pause, 223 int /* player_id */, 224 bool /* is_media_related_action */) 225 226 // Release player resources, but keep the object for future usage. 227 IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_Release, int /* player_id */) 228 229 // Perform a seek. 230 IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Seek, 231 int /* player_id */, 232 base::TimeDelta /* time */) 233 234 // Start the player for playback. 235 IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_Start, int /* player_id */) 236 237 // Set the volume. 238 IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_SetVolume, 239 int /* player_id */, 240 double /* volume */) 241 242 // Set the poster image. 243 IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_SetPoster, 244 int /* player_id */, 245 GURL /* poster url */) 246 247 // Requests the player to enter fullscreen. 248 IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_EnterFullscreen, int /* player_id */) 249 250 // Requests the player to exit fullscreen. 251 IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_ExitFullscreen, int /* player_id */) 252 253 // Play the media on a remote device, if possible. 254 IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_RequestRemotePlayback, 255 int /* demuxer_client_id */) 256 257 // Control media playing on a remote device. 258 IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_RequestRemotePlaybackControl, 259 int /* demuxer_client_id */) 260 261 // Requests the player with |player_id| to use the CDM with |cdm_id|. 262 IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_SetCdm, 263 int /* player_id */, 264 int /* cdm_id */); 265 266 // Sent after the renderer demuxer has seeked. 267 IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DemuxerSeekDone, 268 int /* demuxer_client_id */, 269 base::TimeDelta /* actual_browser_seek_time */) 270 271 // Inform the media source player that the demuxer is ready. 272 IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DemuxerReady, 273 int /* demuxer_client_id */, 274 media::DemuxerConfigs) 275 276 // Sent when the data was read from the ChunkDemuxer. 277 IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_ReadFromDemuxerAck, 278 int /* demuxer_client_id */, 279 media::DemuxerData) 280 281 // Inform the media source player of changed media duration from demuxer. 282 IPC_MESSAGE_CONTROL2(MediaPlayerHostMsg_DurationChanged, 283 int /* demuxer_client_id */, 284 base::TimeDelta /* duration */) 285 286 #if defined(VIDEO_HOLE) 287 // Notify the player about the external surface, requesting it if necessary. 288 // |is_request| true if the player is requesting the external surface. 289 // |rect| the boundary rectangle of the video element. 290 IPC_MESSAGE_ROUTED3(MediaPlayerHostMsg_NotifyExternalSurface, 291 int /* player_id */, 292 bool /* is_request */, 293 gfx::RectF /* rect */) 294 #endif // defined(VIDEO_HOLE) 295