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

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: Passing a Texture+SharedMemory video frame. 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 } 114 }
115 encoder_.reset(); 115 encoder_.reset();
116 DLOG(ERROR) 116 DLOG(ERROR)
117 << "GpuVideoEncodeAccelerator::Initialize(): VEA initialization failed"; 117 << "GpuVideoEncodeAccelerator::Initialize(): VEA initialization failed";
118 SendCreateEncoderReply(init_done_msg, false); 118 SendCreateEncoderReply(init_done_msg, false);
119 } 119 }
120 120
121 bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) { 121 bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) {
122 bool handled = true; 122 bool handled = true;
123 IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAccelerator, message) 123 IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAccelerator, message)
124 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode, OnEncode) 124 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode, OnEncode)
125 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer, 125 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer,
126 OnUseOutputBitstreamBuffer) 126 OnUseOutputBitstreamBuffer)
127 IPC_MESSAGE_HANDLER( 127 IPC_MESSAGE_HANDLER(
128 AcceleratedVideoEncoderMsg_RequestEncodingParametersChange, 128 AcceleratedVideoEncoderMsg_RequestEncodingParametersChange,
129 OnRequestEncodingParametersChange) 129 OnRequestEncodingParametersChange)
130 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Destroy, OnDestroy) 130 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Destroy, OnDestroy)
131 IPC_MESSAGE_UNHANDLED(handled = false) 131 IPC_MESSAGE_UNHANDLED(handled = false)
132 IPC_END_MESSAGE_MAP() 132 IPC_END_MESSAGE_MAP()
133 return handled; 133 return handled;
134 } 134 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 // static 220 // static
221 scoped_ptr<media::VideoEncodeAccelerator> 221 scoped_ptr<media::VideoEncodeAccelerator>
222 GpuVideoEncodeAccelerator::CreateAndroidVEA() { 222 GpuVideoEncodeAccelerator::CreateAndroidVEA() {
223 scoped_ptr<media::VideoEncodeAccelerator> encoder; 223 scoped_ptr<media::VideoEncodeAccelerator> encoder;
224 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC) 224 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
225 encoder.reset(new AndroidVideoEncodeAccelerator()); 225 encoder.reset(new AndroidVideoEncodeAccelerator());
226 #endif 226 #endif
227 return encoder.Pass(); 227 return encoder.Pass();
228 } 228 }
229 229
230 void GpuVideoEncodeAccelerator::OnEncode(int32 frame_id, 230 void GpuVideoEncodeAccelerator::OnEncode(
231 base::SharedMemoryHandle buffer_handle, 231 const AcceleratedVideoEncoderMsg_Encode_Params& params) {
232 uint32 buffer_offset, 232 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncode: frame_id = "
233 uint32 buffer_size, 233 << params.frame_id << ", buffer_size=" << params.buffer_size
234 bool force_keyframe) { 234 << ", force_keyframe=" << params.force_keyframe;
235 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncode(): frame_id=" << frame_id 235 DCHECK_EQ(params.storage_type, media::VideoFrame::STORAGE_SHMEM);
236 << ", buffer_size=" << buffer_size 236 DCHECK_EQ(params.pixel_format, input_format_);
237 << ", force_keyframe=" << force_keyframe; 237
238 if (!encoder_) 238 if (!encoder_)
239 return; 239 return;
240 if (frame_id < 0) { 240 if (params.frame_id < 0) {
241 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): invalid frame_id=" 241 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): invalid "
242 << frame_id; 242 "frame_id=" << params.frame_id;
243 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); 243 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
244 return; 244 return;
245 } 245 }
246 246
247 uint32 aligned_offset = 247 uint32 aligned_offset =
248 buffer_offset % base::SysInfo::VMAllocationGranularity(); 248 params.buffer_offset % base::SysInfo::VMAllocationGranularity();
249 base::CheckedNumeric<off_t> map_offset = buffer_offset; 249 base::CheckedNumeric<off_t> map_offset = params.buffer_offset;
250 map_offset -= aligned_offset; 250 map_offset -= aligned_offset;
251 base::CheckedNumeric<size_t> map_size = buffer_size; 251 base::CheckedNumeric<size_t> map_size = params.buffer_size;
252 map_size += aligned_offset; 252 map_size += aligned_offset;
253 253
254 if (!map_offset.IsValid() || !map_size.IsValid()) { 254 if (!map_offset.IsValid() || !map_size.IsValid()) {
255 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode():" 255 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode():"
256 << " invalid (buffer_offset,buffer_size)"; 256 << " invalid (buffer_offset,buffer_size)";
257 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); 257 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
258 return; 258 return;
259 } 259 }
260 260
261 scoped_ptr<base::SharedMemory> shm( 261 scoped_ptr<base::SharedMemory> shm(
262 new base::SharedMemory(buffer_handle, true)); 262 new base::SharedMemory(params.buffer_handle, true));
263 if (!shm->MapAt(map_offset.ValueOrDie(), map_size.ValueOrDie())) { 263 if (!shm->MapAt(map_offset.ValueOrDie(), map_size.ValueOrDie())) {
264 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): " 264 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): "
265 "could not map frame_id=" << frame_id; 265 "could not map frame_id=" << params.frame_id;
266 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); 266 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
267 return; 267 return;
268 } 268 }
269 269
270 uint8* shm_memory = reinterpret_cast<uint8*>(shm->memory()) + aligned_offset; 270 uint8* shm_memory = reinterpret_cast<uint8*>(shm->memory()) + aligned_offset;
271 scoped_refptr<media::VideoFrame> frame = 271 scoped_refptr<media::VideoFrame> frame =
272 media::VideoFrame::WrapExternalSharedMemory( 272 media::VideoFrame::WrapExternalSharedMemory(
273 input_format_, 273 input_format_,
274 input_coded_size_, 274 input_coded_size_,
275 gfx::Rect(input_visible_size_), 275 gfx::Rect(input_visible_size_),
276 input_visible_size_, 276 input_visible_size_,
277 shm_memory, 277 shm_memory,
278 buffer_size, 278 params.buffer_size,
279 buffer_handle, 279 params.buffer_handle,
280 buffer_offset, 280 params.buffer_offset,
281 base::TimeDelta()); 281 base::TimeDelta());
282 frame->AddDestructionObserver( 282 frame->AddDestructionObserver(media::BindToCurrentLoop(base::Bind(
283 media::BindToCurrentLoop( 283 &GpuVideoEncodeAccelerator::EncodeFrameFinished,
284 base::Bind(&GpuVideoEncodeAccelerator::EncodeFrameFinished, 284 weak_this_factory_.GetWeakPtr(), params.frame_id, base::Passed(&shm))));
285 weak_this_factory_.GetWeakPtr(),
286 frame_id,
287 base::Passed(&shm))));
288 285
289 if (!frame.get()) { 286 if (!frame.get()) {
290 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): " 287 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): could not create "
291 "could not create VideoFrame for frame_id=" << frame_id; 288 "VideoFrame for frame_id=" << params.frame_id;
292 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); 289 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
293 return; 290 return;
294 } 291 }
295 292
296 encoder_->Encode(frame, force_keyframe); 293 encoder_->Encode(frame, params.force_keyframe);
297 } 294 }
298 295
299 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer( 296 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(
300 int32 buffer_id, 297 int32 buffer_id,
301 base::SharedMemoryHandle buffer_handle, 298 base::SharedMemoryHandle buffer_handle,
302 uint32 buffer_size) { 299 uint32 buffer_size) {
303 DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): " 300 DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): "
304 "buffer_id=" << buffer_id 301 "buffer_id=" << buffer_id
305 << ", buffer_size=" << buffer_size; 302 << ", buffer_size=" << buffer_size;
306 if (!encoder_) 303 if (!encoder_)
(...skipping 28 matching lines...) Expand all
335 if (!encoder_) 332 if (!encoder_)
336 return; 333 return;
337 encoder_->RequestEncodingParametersChange(bitrate, framerate); 334 encoder_->RequestEncodingParametersChange(bitrate, framerate);
338 } 335 }
339 336
340 void GpuVideoEncodeAccelerator::EncodeFrameFinished( 337 void GpuVideoEncodeAccelerator::EncodeFrameFinished(
341 int32 frame_id, 338 int32 frame_id,
342 scoped_ptr<base::SharedMemory> shm) { 339 scoped_ptr<base::SharedMemory> shm) {
343 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_, 340 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_,
344 frame_id)); 341 frame_id));
345 // Just let shm fall out of scope. 342 // Just let |shm| fall out of scope.
346 } 343 }
347 344
348 void GpuVideoEncodeAccelerator::Send(IPC::Message* message) { 345 void GpuVideoEncodeAccelerator::Send(IPC::Message* message) {
349 stub_->channel()->Send(message); 346 stub_->channel()->Send(message);
350 } 347 }
351 348
352 void GpuVideoEncodeAccelerator::SendCreateEncoderReply(IPC::Message* message, 349 void GpuVideoEncodeAccelerator::SendCreateEncoderReply(IPC::Message* message,
353 bool succeeded) { 350 bool succeeded) {
354 GpuCommandBufferMsg_CreateVideoEncoder::WriteReplyParams(message, succeeded); 351 GpuCommandBufferMsg_CreateVideoEncoder::WriteReplyParams(message, succeeded);
355 Send(message); 352 Send(message);
356 } 353 }
357 354
358 } // namespace content 355 } // namespace content
OLDNEW
« no previous file with comments | « content/common/gpu/media/gpu_video_encode_accelerator.h ('k') | content/renderer/media/rtc_video_encoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698