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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |