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