Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(326)

Side by Side Diff: content/common/gpu/media/gpu_video_encode_accelerator.cc

Issue 1128213005: Passing Native Texture backed Video Frame from Renderer to GPU process (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698