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

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: posciak@ and magjed@ comments. 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,
mcasas 2015/06/04 15:20:55 Indent here and in l.117 to match l.119 etc. I kno
emircan 2015/06/04 22:04:40 Done.
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
mcasas 2015/06/04 15:20:55 Update the method name. Or better, use __func__
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;
225 } 229 }
(...skipping 26 matching lines...) Expand all
252 media::VideoFrame::WrapExternalSharedMemory( 256 media::VideoFrame::WrapExternalSharedMemory(
253 input_format_, 257 input_format_,
254 input_coded_size_, 258 input_coded_size_,
255 gfx::Rect(input_visible_size_), 259 gfx::Rect(input_visible_size_),
256 input_visible_size_, 260 input_visible_size_,
257 shm_memory, 261 shm_memory,
258 buffer_size, 262 buffer_size,
259 buffer_handle, 263 buffer_handle,
260 buffer_offset, 264 buffer_offset,
261 base::TimeDelta()); 265 base::TimeDelta());
262 frame->AddDestructionObserver( 266 frame->AddDestructionObserver(media::BindToCurrentLoop(base::Bind(
263 media::BindToCurrentLoop( 267 &GpuVideoEncodeAccelerator::EncodeSharedMemoryFrameFinished,
264 base::Bind(&GpuVideoEncodeAccelerator::EncodeFrameFinished, 268 weak_this_factory_.GetWeakPtr(), frame_id, base::Passed(&shm))));
265 weak_this_factory_.GetWeakPtr(),
266 frame_id,
267 base::Passed(&shm))));
268 269
269 if (!frame.get()) { 270 if (!frame.get()) {
270 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): " 271 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): "
271 "could not create VideoFrame for frame_id=" << frame_id; 272 "could not create VideoFrame for frame_id=" << frame_id;
272 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); 273 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
273 return; 274 return;
274 } 275 }
275 276
276 encoder_->Encode(frame, force_keyframe); 277 encoder_->Encode(frame, force_keyframe);
277 } 278 }
278 279
280 void GpuVideoEncodeAccelerator::OnEncodeNativeTexture(
281 int32 frame_id,
282 gpu::MailboxHolder mailbox_holder,
283 bool force_keyframe) {
284 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncodeNativeTexture(): frame_id="
285 << frame_id << ", force_keyframe=" << force_keyframe;
286 if (!encoder_)
287 return;
288 if (frame_id < 0) {
289 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncodeNativeTexture(): "
290 "invalid frame_id=" << frame_id;
291 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
292 return;
293 }
294 DCHECK(!mailbox_holder.mailbox.IsZero());
mcasas 2015/06/04 15:20:56 nit: pass these DCHECKs to the beginning of the me
emircan 2015/06/04 22:04:40 Done.
295 DCHECK(mailbox_holder.mailbox.Verify());
296 DCHECK(mailbox_holder.texture_target);
297 DCHECK(mailbox_holder.sync_point);
298
299 scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapNativeTexture(
300 mailbox_holder,
301 media::VideoFrame::ReleaseMailboxCB(),
302 input_coded_size_, gfx::Rect(input_visible_size_), input_visible_size_,
303 base::TimeDelta(), true /* allow_overlay */, true /* has_alpha */);
304 frame->AddDestructionObserver(media::BindToCurrentLoop(
305 base::Bind(&GpuVideoEncodeAccelerator::EncodeNativeTextureFrameFinished,
306 weak_this_factory_.GetWeakPtr(), frame_id)));
307 if (!frame.get()) {
308 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncodeNativeTexture(): "
309 "could not create VideoFrame for frame_id=" << frame_id;
310 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
311 return;
312 }
313
314 encoder_->Encode(frame, force_keyframe);
315 }
316
279 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer( 317 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(
280 int32 buffer_id, 318 int32 buffer_id,
281 base::SharedMemoryHandle buffer_handle, 319 base::SharedMemoryHandle buffer_handle,
282 uint32 buffer_size) { 320 uint32 buffer_size) {
283 DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): " 321 DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): "
284 "buffer_id=" << buffer_id 322 "buffer_id=" << buffer_id
285 << ", buffer_size=" << buffer_size; 323 << ", buffer_size=" << buffer_size;
286 if (!encoder_) 324 if (!encoder_)
287 return; 325 return;
288 if (buffer_id < 0) { 326 if (buffer_id < 0) {
(...skipping 21 matching lines...) Expand all
310 uint32 bitrate, 348 uint32 bitrate,
311 uint32 framerate) { 349 uint32 framerate) {
312 DVLOG(2) << "GpuVideoEncodeAccelerator::OnRequestEncodingParametersChange(): " 350 DVLOG(2) << "GpuVideoEncodeAccelerator::OnRequestEncodingParametersChange(): "
313 "bitrate=" << bitrate 351 "bitrate=" << bitrate
314 << ", framerate=" << framerate; 352 << ", framerate=" << framerate;
315 if (!encoder_) 353 if (!encoder_)
316 return; 354 return;
317 encoder_->RequestEncodingParametersChange(bitrate, framerate); 355 encoder_->RequestEncodingParametersChange(bitrate, framerate);
318 } 356 }
319 357
320 void GpuVideoEncodeAccelerator::EncodeFrameFinished( 358 void GpuVideoEncodeAccelerator::EncodeSharedMemoryFrameFinished(
321 int32 frame_id, 359 int32 frame_id,
322 scoped_ptr<base::SharedMemory> shm) { 360 scoped_ptr<base::SharedMemory> shm) {
323 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_, 361 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_,
324 frame_id)); 362 frame_id));
325 // Just let shm fall out of scope. 363 // Just let shm fall out of scope.
mcasas 2015/06/04 15:20:55 s/shm/|shm|/
emircan 2015/06/04 22:04:41 Done.
326 } 364 }
365 void GpuVideoEncodeAccelerator::EncodeNativeTextureFrameFinished(
366 int32 frame_id) {
367 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_,
368 frame_id));
369 }
327 370
328 void GpuVideoEncodeAccelerator::Send(IPC::Message* message) { 371 void GpuVideoEncodeAccelerator::Send(IPC::Message* message) {
329 stub_->channel()->Send(message); 372 stub_->channel()->Send(message);
330 } 373 }
331 374
332 void GpuVideoEncodeAccelerator::SendCreateEncoderReply(IPC::Message* message, 375 void GpuVideoEncodeAccelerator::SendCreateEncoderReply(IPC::Message* message,
333 bool succeeded) { 376 bool succeeded) {
334 GpuCommandBufferMsg_CreateVideoEncoder::WriteReplyParams(message, succeeded); 377 GpuCommandBufferMsg_CreateVideoEncoder::WriteReplyParams(message, succeeded);
335 Send(message); 378 Send(message);
336 } 379 }
337 380
338 } // namespace content 381 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698