OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/common/gpu/media/gpu_video_encode_accelerator.h" | 5 #include "content/common/gpu/media/gpu_video_encode_accelerator.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 initial_bitrate, | 105 initial_bitrate, |
106 this); | 106 this); |
107 input_format_ = input_format; | 107 input_format_ = input_format; |
108 input_visible_size_ = input_visible_size; | 108 input_visible_size_ = input_visible_size; |
109 SendCreateEncoderReply(init_done_msg, true); | 109 SendCreateEncoderReply(init_done_msg, true); |
110 } | 110 } |
111 | 111 |
112 bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) { | 112 bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) { |
113 bool handled = true; | 113 bool handled = true; |
114 IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAccelerator, message) | 114 IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAccelerator, message) |
115 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode, OnEncode) | 115 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_EncodeSharedMemory, |
| 116 OnEncodeSharedMemory) |
| 117 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_EncodeNativeTexture, |
| 118 OnEncodeNativeTexture) |
116 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer, | 119 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer, |
117 OnUseOutputBitstreamBuffer) | 120 OnUseOutputBitstreamBuffer) |
118 IPC_MESSAGE_HANDLER( | 121 IPC_MESSAGE_HANDLER( |
119 AcceleratedVideoEncoderMsg_RequestEncodingParametersChange, | 122 AcceleratedVideoEncoderMsg_RequestEncodingParametersChange, |
120 OnRequestEncodingParametersChange) | 123 OnRequestEncodingParametersChange) |
121 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Destroy, OnDestroy) | 124 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Destroy, OnDestroy) |
122 IPC_MESSAGE_UNHANDLED(handled = false) | 125 IPC_MESSAGE_UNHANDLED(handled = false) |
123 IPC_END_MESSAGE_MAP() | 126 IPC_END_MESSAGE_MAP() |
124 return handled; | 127 return handled; |
125 } | 128 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 // static | 203 // static |
201 scoped_ptr<media::VideoEncodeAccelerator> | 204 scoped_ptr<media::VideoEncodeAccelerator> |
202 GpuVideoEncodeAccelerator::CreateAndroidVEA() { | 205 GpuVideoEncodeAccelerator::CreateAndroidVEA() { |
203 scoped_ptr<media::VideoEncodeAccelerator> encoder; | 206 scoped_ptr<media::VideoEncodeAccelerator> encoder; |
204 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC) | 207 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC) |
205 encoder.reset(new AndroidVideoEncodeAccelerator()); | 208 encoder.reset(new AndroidVideoEncodeAccelerator()); |
206 #endif | 209 #endif |
207 return encoder.Pass(); | 210 return encoder.Pass(); |
208 } | 211 } |
209 | 212 |
210 void GpuVideoEncodeAccelerator::OnEncode(int32 frame_id, | 213 void GpuVideoEncodeAccelerator::OnEncodeSharedMemory( |
211 base::SharedMemoryHandle buffer_handle, | 214 int32 frame_id, |
212 uint32 buffer_offset, | 215 base::SharedMemoryHandle buffer_handle, |
213 uint32 buffer_size, | 216 uint32 buffer_offset, |
214 bool force_keyframe) { | 217 uint32 buffer_size, |
| 218 bool force_keyframe) { |
215 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncode(): frame_id=" << frame_id | 219 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncode(): frame_id=" << frame_id |
216 << ", buffer_size=" << buffer_size | 220 << ", buffer_size=" << buffer_size |
217 << ", force_keyframe=" << force_keyframe; | 221 << ", force_keyframe=" << force_keyframe; |
218 if (!encoder_) | 222 if (!encoder_) |
219 return; | 223 return; |
220 if (frame_id < 0) { | 224 if (frame_id < 0) { |
221 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): invalid frame_id=" | 225 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): invalid frame_id=" |
222 << frame_id; | 226 << frame_id; |
223 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); | 227 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); |
224 return; | 228 return; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 if (!frame.get()) { | 273 if (!frame.get()) { |
270 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): " | 274 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): " |
271 "could not create VideoFrame for frame_id=" << frame_id; | 275 "could not create VideoFrame for frame_id=" << frame_id; |
272 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); | 276 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); |
273 return; | 277 return; |
274 } | 278 } |
275 | 279 |
276 encoder_->Encode(frame, force_keyframe); | 280 encoder_->Encode(frame, force_keyframe); |
277 } | 281 } |
278 | 282 |
| 283 void GpuVideoEncodeAccelerator::OnEncodeNativeTexture( |
| 284 int32 frame_id, |
| 285 gpu::MailboxHolder mailbox_holder, |
| 286 bool force_keyframe) { |
| 287 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncodeNativeTexture(): frame_id=" |
| 288 << frame_id << ", force_keyframe=" << force_keyframe; |
| 289 if (!encoder_) |
| 290 return; |
| 291 if (frame_id < 0) { |
| 292 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncodeNativeTexture(): " |
| 293 "invalid frame_id=" << frame_id; |
| 294 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); |
| 295 return; |
| 296 } |
| 297 DCHECK(!mailbox_holder.mailbox.IsZero()); |
| 298 DCHECK(mailbox_holder.mailbox.Verify()); |
| 299 DCHECK(mailbox_holder.texture_target); |
| 300 DCHECK(mailbox_holder.sync_point); |
| 301 |
| 302 scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapNativeTexture( |
| 303 mailbox_holder, |
| 304 media::VideoFrame::ReleaseMailboxCB(), |
| 305 input_coded_size_, gfx::Rect(input_visible_size_), input_visible_size_, |
| 306 base::TimeDelta(), true /* allow_overlay */, true /* has_alpha */); |
| 307 frame->AddDestructionObserver(media::BindToCurrentLoop( |
| 308 base::Bind(&GpuVideoEncodeAccelerator::EncodeNativeTextureFrameFinished, |
| 309 weak_this_factory_.GetWeakPtr(), frame_id))); |
| 310 if (!frame.get()) { |
| 311 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncodeNativeTexture(): " |
| 312 "could not create VideoFrame for frame_id=" << frame_id; |
| 313 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); |
| 314 return; |
| 315 } |
| 316 |
| 317 encoder_->Encode(frame, force_keyframe); |
| 318 } |
| 319 |
279 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer( | 320 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer( |
280 int32 buffer_id, | 321 int32 buffer_id, |
281 base::SharedMemoryHandle buffer_handle, | 322 base::SharedMemoryHandle buffer_handle, |
282 uint32 buffer_size) { | 323 uint32 buffer_size) { |
283 DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): " | 324 DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): " |
284 "buffer_id=" << buffer_id | 325 "buffer_id=" << buffer_id |
285 << ", buffer_size=" << buffer_size; | 326 << ", buffer_size=" << buffer_size; |
286 if (!encoder_) | 327 if (!encoder_) |
287 return; | 328 return; |
288 if (buffer_id < 0) { | 329 if (buffer_id < 0) { |
(...skipping 28 matching lines...) Expand all Loading... |
317 encoder_->RequestEncodingParametersChange(bitrate, framerate); | 358 encoder_->RequestEncodingParametersChange(bitrate, framerate); |
318 } | 359 } |
319 | 360 |
320 void GpuVideoEncodeAccelerator::EncodeFrameFinished( | 361 void GpuVideoEncodeAccelerator::EncodeFrameFinished( |
321 int32 frame_id, | 362 int32 frame_id, |
322 scoped_ptr<base::SharedMemory> shm) { | 363 scoped_ptr<base::SharedMemory> shm) { |
323 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_, | 364 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_, |
324 frame_id)); | 365 frame_id)); |
325 // Just let shm fall out of scope. | 366 // Just let shm fall out of scope. |
326 } | 367 } |
| 368 void GpuVideoEncodeAccelerator::EncodeNativeTextureFrameFinished( |
| 369 int32 frame_id) { |
| 370 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_, |
| 371 frame_id)); |
| 372 } |
327 | 373 |
328 void GpuVideoEncodeAccelerator::Send(IPC::Message* message) { | 374 void GpuVideoEncodeAccelerator::Send(IPC::Message* message) { |
329 stub_->channel()->Send(message); | 375 stub_->channel()->Send(message); |
330 } | 376 } |
331 | 377 |
332 void GpuVideoEncodeAccelerator::SendCreateEncoderReply(IPC::Message* message, | 378 void GpuVideoEncodeAccelerator::SendCreateEncoderReply(IPC::Message* message, |
333 bool succeeded) { | 379 bool succeeded) { |
334 GpuCommandBufferMsg_CreateVideoEncoder::WriteReplyParams(message, succeeded); | 380 GpuCommandBufferMsg_CreateVideoEncoder::WriteReplyParams(message, succeeded); |
335 Send(message); | 381 Send(message); |
336 } | 382 } |
337 | 383 |
338 } // namespace content | 384 } // namespace content |
OLD | NEW |