| 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 |