| 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 |