Chromium Code Reviews| Index: content/common/gpu/client/gpu_video_encode_accelerator_host.cc |
| diff --git a/content/common/gpu/client/gpu_video_encode_accelerator_host.cc b/content/common/gpu/client/gpu_video_encode_accelerator_host.cc |
| index 1cbfeaa025a5a3c300068a36dba5e7d87b91a0db..9326bdfb9f54f27a8ec9cdf1b40f6e13e086bf98 100644 |
| --- a/content/common/gpu/client/gpu_video_encode_accelerator_host.cc |
| +++ b/content/common/gpu/client/gpu_video_encode_accelerator_host.cc |
| @@ -117,33 +117,17 @@ void GpuVideoEncodeAcceleratorHost::Encode( |
| if (!channel_) |
| return; |
| - if (!base::SharedMemory::IsHandleValid(frame->shared_memory_handle())) { |
| - NOTIFY_ERROR(kPlatformFailureError) |
| - << "Encode(): cannot encode frame not backed by shared memory"; |
| - return; |
| - } |
| - base::SharedMemoryHandle handle = |
| - channel_->ShareToGpuProcess(frame->shared_memory_handle()); |
| - if (!base::SharedMemory::IsHandleValid(handle)) { |
| - NOTIFY_ERROR(kPlatformFailureError) |
| - << "Encode(): failed to duplicate buffer handle for GPU process"; |
| + bool rv = false; |
| + if (frame->storage_type() == media::VideoFrame::STORAGE_TEXTURE) |
| + rv = EncodeNativeTexture(frame, force_keyframe); |
| + else |
| + rv = EncodeSharedMemory(frame, force_keyframe); |
| + |
| + if (!rv) { |
| + NOTIFY_ERROR(kPlatformFailureError) << "Encode(): cannot encode frame"; |
| return; |
| } |
| - // We assume that planar frame data passed here is packed and contiguous. |
| - const size_t plane_count = media::VideoFrame::NumPlanes(frame->format()); |
| - size_t frame_size = 0; |
| - for (size_t i = 0; i < plane_count; ++i) { |
| - // Cast DCHECK parameters to void* to avoid printing uint8* as a string. |
| - DCHECK_EQ(reinterpret_cast<void*>(frame->data(i)), |
| - reinterpret_cast<void*>((frame->data(0) + frame_size))) |
| - << "plane=" << i; |
| - frame_size += frame->stride(i) * frame->rows(i); |
| - } |
| - |
| - Send(new AcceleratedVideoEncoderMsg_Encode( |
| - encoder_route_id_, next_frame_id_, handle, frame->shared_memory_offset(), |
| - frame_size, force_keyframe)); |
| frame_map_[next_frame_id_] = frame; |
| // Mask against 30 bits, to avoid (undefined) wraparound on signed integer. |
| @@ -195,6 +179,50 @@ void GpuVideoEncodeAcceleratorHost::OnWillDeleteImpl() { |
| OnChannelError(); |
| } |
| +bool GpuVideoEncodeAcceleratorHost::EncodeNativeTexture( |
| + const scoped_refptr<media::VideoFrame>& frame, |
| + bool force_keyframe) { |
| + Send(new AcceleratedVideoEncoderMsg_EncodeNativeTexture( |
| + encoder_route_id_, next_frame_id_, frame->mailbox_holder(0), |
| + force_keyframe)); |
| + return true; |
| +} |
| + |
| +bool GpuVideoEncodeAcceleratorHost::EncodeSharedMemory( |
| + const scoped_refptr<media::VideoFrame>& frame, |
| + bool force_keyframe) { |
| + if (!base::SharedMemory::IsHandleValid(frame->shared_memory_handle())) { |
| + NOTIFY_ERROR(kPlatformFailureError) << "EncodeSharedMemory(): cannot " |
| + "encode frame not backed by shared " |
|
Pawel Osciak
2015/06/03 10:28:56
Please update this error message.
emircan
2015/06/03 20:56:12
Done.
|
| + "memory"; |
| + return false; |
| + } |
| + base::SharedMemoryHandle handle = |
| + channel_->ShareToGpuProcess(frame->shared_memory_handle()); |
| + if (!base::SharedMemory::IsHandleValid(handle)) { |
| + NOTIFY_ERROR(kPlatformFailureError) << "EncodeSharedMemory(): failed to " |
| + "duplicate buffer handle for GPU " |
| + "process"; |
| + return false; |
| + } |
| + |
| + // We assume that planar frame data passed here is packed and contiguous. |
| + const size_t plane_count = media::VideoFrame::NumPlanes(frame->format()); |
| + size_t frame_size = 0; |
| + for (size_t i = 0; i < plane_count; ++i) { |
| + // Cast DCHECK parameters to void* to avoid printing uint8* as a string. |
| + DCHECK_EQ(reinterpret_cast<void*>(frame->data(i)), |
| + reinterpret_cast<void*>((frame->data(0) + frame_size))) |
| + << "plane=" << i; |
| + frame_size += frame->stride(i) * frame->rows(i); |
| + } |
| + |
| + Send(new AcceleratedVideoEncoderMsg_EncodeSharedMemory( |
| + encoder_route_id_, next_frame_id_, handle, |
| + frame->shared_memory_offset(), frame_size, force_keyframe)); |
| + return true; |
| +} |
| + |
| void GpuVideoEncodeAcceleratorHost::PostNotifyError(Error error) { |
| DCHECK(CalledOnValidThread()); |
| DVLOG(2) << "PostNotifyError(): error=" << error; |