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

Side by Side Diff: media/gpu/ipc/service/gpu_video_encode_accelerator.cc

Issue 2251993004: media/.../{android_,gpu_}video_encode_accelerator{,_host} cleanup (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: watk@ comments Created 4 years, 4 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
« no previous file with comments | « media/gpu/ipc/service/gpu_video_encode_accelerator.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "media/gpu/ipc/service/gpu_video_encode_accelerator.h" 5 #include "media/gpu/ipc/service/gpu_video_encode_accelerator.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 25 matching lines...) Expand all
36 #elif defined(OS_MACOSX) 36 #elif defined(OS_MACOSX)
37 #include "media/gpu/vt_video_encode_accelerator_mac.h" 37 #include "media/gpu/vt_video_encode_accelerator_mac.h"
38 #elif defined(OS_WIN) 38 #elif defined(OS_WIN)
39 #include "base/feature_list.h" 39 #include "base/feature_list.h"
40 #include "media/base/media_switches.h" 40 #include "media/base/media_switches.h"
41 #include "media/gpu/media_foundation_video_encode_accelerator_win.h" 41 #include "media/gpu/media_foundation_video_encode_accelerator_win.h"
42 #endif 42 #endif
43 43
44 namespace media { 44 namespace media {
45 45
46 static bool MakeDecoderContextCurrent( 46 namespace {
47
48 bool MakeDecoderContextCurrent(
47 const base::WeakPtr<gpu::GpuCommandBufferStub> stub) { 49 const base::WeakPtr<gpu::GpuCommandBufferStub> stub) {
48 if (!stub) { 50 if (!stub) {
49 DLOG(ERROR) << "Stub is gone; won't MakeCurrent()."; 51 DLOG(ERROR) << "Stub is gone; won't MakeCurrent().";
50 return false; 52 return false;
51 } 53 }
52 54
53 if (!stub->decoder()->MakeCurrent()) { 55 if (!stub->decoder()->MakeCurrent()) {
54 DLOG(ERROR) << "Failed to MakeCurrent()"; 56 DLOG(ERROR) << "Failed to MakeCurrent()";
55 return false; 57 return false;
56 } 58 }
57 59
58 return true; 60 return true;
59 } 61 }
60 62
63 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC)
64 std::unique_ptr<VideoEncodeAccelerator> CreateV4L2VEA() {
65 scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kEncoder);
66 if (!device)
67 return nullptr;
68 return base::WrapUnique<VideoEncodeAccelerator>(
69 new V4L2VideoEncodeAccelerator(device));
70 }
71 #endif
72
73 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
74 std::unique_ptr<VideoEncodeAccelerator> CreateVaapiVEA() {
75 return base::WrapUnique<VideoEncodeAccelerator>(
76 new VaapiVideoEncodeAccelerator());
77 }
78 #endif
79
80 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
81 std::unique_ptr<VideoEncodeAccelerator> CreateAndroidVEA() {
82 return base::WrapUnique<VideoEncodeAccelerator>(
83 new AndroidVideoEncodeAccelerator());
84 }
85 #endif
86
87 #if defined(OS_MACOSX)
88 std::unique_ptr<VideoEncodeAccelerator> CreateVTVEA() {
89 return base::WrapUnique<VideoEncodeAccelerator>(
90 new VTVideoEncodeAccelerator());
91 }
92 #endif
93
94 #if defined(OS_WIN)
95 std::unique_ptr<VideoEncodeAccelerator> CreateMediaFoundationVEA() {
96 return base::WrapUnique<media::VideoEncodeAccelerator>(
97 new MediaFoundationVideoEncodeAccelerator());
98 }
99 #endif
100
101 } // anonymous namespace
102
61 GpuVideoEncodeAccelerator::GpuVideoEncodeAccelerator( 103 GpuVideoEncodeAccelerator::GpuVideoEncodeAccelerator(
62 int32_t host_route_id, 104 int32_t host_route_id,
63 gpu::GpuCommandBufferStub* stub) 105 gpu::GpuCommandBufferStub* stub)
64 : host_route_id_(host_route_id), 106 : host_route_id_(host_route_id),
65 stub_(stub), 107 stub_(stub),
66 input_format_(PIXEL_FORMAT_UNKNOWN), 108 input_format_(PIXEL_FORMAT_UNKNOWN),
67 output_buffer_size_(0), 109 output_buffer_size_(0),
68 weak_this_factory_(this) { 110 weak_this_factory_(this) {
69 stub_->AddDestructionObserver(this); 111 stub_->AddDestructionObserver(this);
70 make_context_current_ = 112 make_context_current_ =
71 base::Bind(&MakeDecoderContextCurrent, stub_->AsWeakPtr()); 113 base::Bind(&MakeDecoderContextCurrent, stub_->AsWeakPtr());
72 } 114 }
73 115
74 GpuVideoEncodeAccelerator::~GpuVideoEncodeAccelerator() { 116 GpuVideoEncodeAccelerator::~GpuVideoEncodeAccelerator() {
75 // This class can only be self-deleted from OnWillDestroyStub(), which means 117 // This class can only be self-deleted from OnWillDestroyStub(), which means
76 // the VEA has already been destroyed in there. 118 // the VEA has already been destroyed in there.
77 DCHECK(!encoder_); 119 DCHECK(!encoder_);
78 } 120 }
79 121
80 bool GpuVideoEncodeAccelerator::Initialize(VideoPixelFormat input_format, 122 bool GpuVideoEncodeAccelerator::Initialize(VideoPixelFormat input_format,
81 const gfx::Size& input_visible_size, 123 const gfx::Size& input_visible_size,
82 VideoCodecProfile output_profile, 124 VideoCodecProfile output_profile,
83 uint32_t initial_bitrate) { 125 uint32_t initial_bitrate) {
84 DVLOG(2) << "GpuVideoEncodeAccelerator::Initialize(): " 126 DVLOG(1) << __FUNCTION__
85 << "input_format=" << input_format 127 << " input_format=" << VideoPixelFormatToString(input_format)
86 << ", input_visible_size=" << input_visible_size.ToString() 128 << ", input_visible_size=" << input_visible_size.ToString()
87 << ", output_profile=" << output_profile 129 << ", output_profile=" << GetProfileName(output_profile)
88 << ", initial_bitrate=" << initial_bitrate; 130 << ", initial_bitrate=" << initial_bitrate;
89 DCHECK(!encoder_); 131 DCHECK(!encoder_);
90 132
91 if (!stub_->channel()->AddRoute(host_route_id_, stub_->stream_id(), this)) { 133 if (!stub_->channel()->AddRoute(host_route_id_, stub_->stream_id(), this)) {
92 DLOG(ERROR) << "GpuVideoEncodeAccelerator::Initialize(): " 134 DLOG(ERROR) << __FUNCTION__ << " failed to add route";
93 "failed to add route";
94 return false; 135 return false;
95 } 136 }
96 137
97 if (input_visible_size.width() > limits::kMaxDimension || 138 if (input_visible_size.width() > limits::kMaxDimension ||
98 input_visible_size.height() > limits::kMaxDimension || 139 input_visible_size.height() > limits::kMaxDimension ||
99 input_visible_size.GetArea() > limits::kMaxCanvas) { 140 input_visible_size.GetArea() > limits::kMaxCanvas) {
100 DLOG(ERROR) << "GpuVideoEncodeAccelerator::Initialize(): " 141 DLOG(ERROR) << __FUNCTION__ << "too large input_visible_size "
101 << "input_visible_size " << input_visible_size.ToString() 142 << input_visible_size.ToString();
102 << " too large";
103 return false; 143 return false;
104 } 144 }
105 145
106 const gpu::GpuPreferences& gpu_preferences = 146 const gpu::GpuPreferences& gpu_preferences =
107 stub_->channel()->gpu_channel_manager()->gpu_preferences(); 147 stub_->channel()->gpu_channel_manager()->gpu_preferences();
108 148
109 std::vector<GpuVideoEncodeAccelerator::CreateVEAFp> create_vea_fps =
110 CreateVEAFps(gpu_preferences);
111 // Try all possible encoders and use the first successful encoder. 149 // Try all possible encoders and use the first successful encoder.
112 for (size_t i = 0; i < create_vea_fps.size(); ++i) { 150 for (const auto& factory_function : GetVEAFactoryFunctions(gpu_preferences)) {
113 encoder_ = (*create_vea_fps[i])(); 151 encoder_ = factory_function.Run();
114 if (encoder_ && 152 if (encoder_ &&
115 encoder_->Initialize(input_format, input_visible_size, output_profile, 153 encoder_->Initialize(input_format, input_visible_size, output_profile,
116 initial_bitrate, this)) { 154 initial_bitrate, this)) {
117 input_format_ = input_format; 155 input_format_ = input_format;
118 input_visible_size_ = input_visible_size; 156 input_visible_size_ = input_visible_size;
119 return true; 157 return true;
120 } 158 }
121 } 159 }
122 encoder_.reset(); 160 encoder_.reset();
123 DLOG(ERROR) 161 DLOG(ERROR) << __FUNCTION__ << " VEA initialization failed";
124 << "GpuVideoEncodeAccelerator::Initialize(): VEA initialization failed";
125 return false; 162 return false;
126 } 163 }
127 164
128 bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) { 165 bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) {
129 bool handled = true; 166 bool handled = true;
130 IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAccelerator, message) 167 IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAccelerator, message)
131 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode, OnEncode) 168 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode, OnEncode)
132 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode2, OnEncode2) 169 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode2, OnEncode2)
133 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer, 170 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer,
134 OnUseOutputBitstreamBuffer) 171 OnUseOutputBitstreamBuffer)
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 stub_->RemoveDestructionObserver(this); 208 stub_->RemoveDestructionObserver(this);
172 encoder_.reset(); 209 encoder_.reset();
173 delete this; 210 delete this;
174 } 211 }
175 212
176 // static 213 // static
177 gpu::VideoEncodeAcceleratorSupportedProfiles 214 gpu::VideoEncodeAcceleratorSupportedProfiles
178 GpuVideoEncodeAccelerator::GetSupportedProfiles( 215 GpuVideoEncodeAccelerator::GetSupportedProfiles(
179 const gpu::GpuPreferences& gpu_preferences) { 216 const gpu::GpuPreferences& gpu_preferences) {
180 VideoEncodeAccelerator::SupportedProfiles profiles; 217 VideoEncodeAccelerator::SupportedProfiles profiles;
181 std::vector<GpuVideoEncodeAccelerator::CreateVEAFp> create_vea_fps =
182 CreateVEAFps(gpu_preferences);
183 218
184 for (size_t i = 0; i < create_vea_fps.size(); ++i) { 219 for (const auto& factory_function : GetVEAFactoryFunctions(gpu_preferences)) {
185 std::unique_ptr<VideoEncodeAccelerator> encoder = (*create_vea_fps[i])(); 220 std::unique_ptr<VideoEncodeAccelerator> encoder = factory_function.Run();
186 if (!encoder) 221 if (!encoder)
187 continue; 222 continue;
188 VideoEncodeAccelerator::SupportedProfiles vea_profiles = 223 VideoEncodeAccelerator::SupportedProfiles vea_profiles =
189 encoder->GetSupportedProfiles(); 224 encoder->GetSupportedProfiles();
190 GpuVideoAcceleratorUtil::InsertUniqueEncodeProfiles(vea_profiles, 225 GpuVideoAcceleratorUtil::InsertUniqueEncodeProfiles(vea_profiles,
191 &profiles); 226 &profiles);
192 } 227 }
193 return GpuVideoAcceleratorUtil::ConvertMediaToGpuEncodeProfiles(profiles); 228 return GpuVideoAcceleratorUtil::ConvertMediaToGpuEncodeProfiles(profiles);
194 } 229 }
195 230
196 // static 231 // static
197 std::vector<GpuVideoEncodeAccelerator::CreateVEAFp> 232 std::vector<GpuVideoEncodeAccelerator::VEAFactoryFunction>
198 GpuVideoEncodeAccelerator::CreateVEAFps( 233 GpuVideoEncodeAccelerator::GetVEAFactoryFunctions(
199 const gpu::GpuPreferences& gpu_preferences) { 234 const gpu::GpuPreferences& gpu_preferences) {
200 std::vector<GpuVideoEncodeAccelerator::CreateVEAFp> create_vea_fps; 235 std::vector<VEAFactoryFunction> vea_factory_functions;
201 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) 236 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC)
202 create_vea_fps.push_back(&GpuVideoEncodeAccelerator::CreateV4L2VEA); 237 vea_factory_functions.push_back(base::Bind(&CreateV4L2VEA));
203 #endif 238 #endif
204 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) 239 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
205 if (!gpu_preferences.disable_vaapi_accelerated_video_encode) 240 if (!gpu_preferences.disable_vaapi_accelerated_video_encode)
206 create_vea_fps.push_back(&GpuVideoEncodeAccelerator::CreateVaapiVEA); 241 vea_factory_functions.push_back(base::Bind(&CreateVaapiVEA));
207 #endif 242 #endif
208 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC) 243 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
209 if (!gpu_preferences.disable_web_rtc_hw_encoding) 244 if (!gpu_preferences.disable_web_rtc_hw_encoding)
210 create_vea_fps.push_back(&GpuVideoEncodeAccelerator::CreateAndroidVEA); 245 vea_factory_functions.push_back(base::Bind(&CreateAndroidVEA));
211 #endif 246 #endif
212 #if defined(OS_MACOSX) 247 #if defined(OS_MACOSX)
213 create_vea_fps.push_back(&GpuVideoEncodeAccelerator::CreateVTVEA); 248 vea_factory_functions.push_back(base::Bind(&CreateVTVEA));
214 #endif 249 #endif
215 #if defined(OS_WIN) 250 #if defined(OS_WIN)
216 if (base::FeatureList::IsEnabled(kMediaFoundationH264Encoding)) { 251 if (base::FeatureList::IsEnabled(kMediaFoundationH264Encoding))
217 create_vea_fps.push_back( 252 vea_factory_functions.push_back(base::Bind(&CreateMediaFoundationVEA));
218 &GpuVideoEncodeAccelerator::CreateMediaFoundationVEA);
219 }
220 #endif 253 #endif
221 return create_vea_fps; 254 return vea_factory_functions;
222 } 255 }
223 256
224 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC)
225 // static
226 std::unique_ptr<VideoEncodeAccelerator>
227 GpuVideoEncodeAccelerator::CreateV4L2VEA() {
228 std::unique_ptr<VideoEncodeAccelerator> encoder;
229 scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kEncoder);
230 if (device)
231 encoder.reset(new V4L2VideoEncodeAccelerator(device));
232 return encoder;
233 }
234 #endif
235
236 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
237 // static
238 std::unique_ptr<VideoEncodeAccelerator>
239 GpuVideoEncodeAccelerator::CreateVaapiVEA() {
240 return base::WrapUnique<VideoEncodeAccelerator>(
241 new VaapiVideoEncodeAccelerator());
242 }
243 #endif
244
245 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
246 // static
247 std::unique_ptr<VideoEncodeAccelerator>
248 GpuVideoEncodeAccelerator::CreateAndroidVEA() {
249 return base::WrapUnique<VideoEncodeAccelerator>(
250 new AndroidVideoEncodeAccelerator());
251 }
252 #endif
253
254 #if defined(OS_MACOSX)
255 // static
256 std::unique_ptr<VideoEncodeAccelerator>
257 GpuVideoEncodeAccelerator::CreateVTVEA() {
258 return base::WrapUnique<VideoEncodeAccelerator>(
259 new VTVideoEncodeAccelerator());
260 }
261 #endif
262
263 #if defined(OS_WIN)
264 // static
265 std::unique_ptr<media::VideoEncodeAccelerator>
266 GpuVideoEncodeAccelerator::CreateMediaFoundationVEA() {
267 return base::WrapUnique<media::VideoEncodeAccelerator>(
268 new MediaFoundationVideoEncodeAccelerator());
269 }
270 #endif
271
272 void GpuVideoEncodeAccelerator::OnEncode( 257 void GpuVideoEncodeAccelerator::OnEncode(
273 const AcceleratedVideoEncoderMsg_Encode_Params& params) { 258 const AcceleratedVideoEncoderMsg_Encode_Params& params) {
274 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncode: frame_id = " 259 DVLOG(3) << __FUNCTION__ << " frame_id = " << params.frame_id
275 << params.frame_id << ", buffer_size=" << params.buffer_size 260 << ", buffer_size=" << params.buffer_size
276 << ", force_keyframe=" << params.force_keyframe; 261 << ", force_keyframe=" << params.force_keyframe;
277 DCHECK_EQ(PIXEL_FORMAT_I420, input_format_); 262 DCHECK_EQ(PIXEL_FORMAT_I420, input_format_);
278 263
279 // Wrap into a SharedMemory in the beginning, so that |params.buffer_handle| 264 // Wrap into a SharedMemory in the beginning, so that |params.buffer_handle|
280 // is cleaned properly in case of an early return. 265 // is cleaned properly in case of an early return.
281 std::unique_ptr<base::SharedMemory> shm( 266 std::unique_ptr<base::SharedMemory> shm(
282 new base::SharedMemory(params.buffer_handle, true)); 267 new base::SharedMemory(params.buffer_handle, true));
283 268
284 if (!encoder_) 269 if (!encoder_)
285 return; 270 return;
286 271
287 if (params.frame_id < 0) { 272 if (params.frame_id < 0) {
288 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): invalid " 273 DLOG(ERROR) << __FUNCTION__ << " invalid frame_id=" << params.frame_id;
289 << "frame_id=" << params.frame_id;
290 NotifyError(VideoEncodeAccelerator::kPlatformFailureError); 274 NotifyError(VideoEncodeAccelerator::kPlatformFailureError);
291 return; 275 return;
292 } 276 }
293 277
294 const uint32_t aligned_offset = 278 const uint32_t aligned_offset =
295 params.buffer_offset % base::SysInfo::VMAllocationGranularity(); 279 params.buffer_offset % base::SysInfo::VMAllocationGranularity();
296 base::CheckedNumeric<off_t> map_offset = params.buffer_offset; 280 base::CheckedNumeric<off_t> map_offset = params.buffer_offset;
297 map_offset -= aligned_offset; 281 map_offset -= aligned_offset;
298 base::CheckedNumeric<size_t> map_size = params.buffer_size; 282 base::CheckedNumeric<size_t> map_size = params.buffer_size;
299 map_size += aligned_offset; 283 map_size += aligned_offset;
300 284
301 if (!map_offset.IsValid() || !map_size.IsValid()) { 285 if (!map_offset.IsValid() || !map_size.IsValid()) {
302 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode():" 286 DLOG(ERROR) << __FUNCTION__ << " invalid map_offset or map_size";
303 << " invalid (buffer_offset,buffer_size)";
304 NotifyError(VideoEncodeAccelerator::kPlatformFailureError); 287 NotifyError(VideoEncodeAccelerator::kPlatformFailureError);
305 return; 288 return;
306 } 289 }
307 290
308 if (!shm->MapAt(map_offset.ValueOrDie(), map_size.ValueOrDie())) { 291 if (!shm->MapAt(map_offset.ValueOrDie(), map_size.ValueOrDie())) {
309 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): " 292 DLOG(ERROR) << __FUNCTION__
310 << "could not map frame_id=" << params.frame_id; 293 << " could not map frame_id=" << params.frame_id;
311 NotifyError(VideoEncodeAccelerator::kPlatformFailureError); 294 NotifyError(VideoEncodeAccelerator::kPlatformFailureError);
312 return; 295 return;
313 } 296 }
314 297
315 uint8_t* shm_memory = 298 uint8_t* shm_memory =
316 reinterpret_cast<uint8_t*>(shm->memory()) + aligned_offset; 299 reinterpret_cast<uint8_t*>(shm->memory()) + aligned_offset;
317 scoped_refptr<VideoFrame> frame = VideoFrame::WrapExternalSharedMemory( 300 scoped_refptr<VideoFrame> frame = VideoFrame::WrapExternalSharedMemory(
318 input_format_, input_coded_size_, gfx::Rect(input_visible_size_), 301 input_format_, input_coded_size_, gfx::Rect(input_visible_size_),
319 input_visible_size_, shm_memory, params.buffer_size, params.buffer_handle, 302 input_visible_size_, shm_memory, params.buffer_size, params.buffer_handle,
320 params.buffer_offset, params.timestamp); 303 params.buffer_offset, params.timestamp);
321 if (!frame) { 304 if (!frame) {
322 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): " 305 DLOG(ERROR) << __FUNCTION__ << " could not create a frame";
323 << "could not create a frame";
324 NotifyError(VideoEncodeAccelerator::kPlatformFailureError); 306 NotifyError(VideoEncodeAccelerator::kPlatformFailureError);
325 return; 307 return;
326 } 308 }
327 frame->AddDestructionObserver(BindToCurrentLoop(base::Bind( 309 frame->AddDestructionObserver(BindToCurrentLoop(base::Bind(
328 &GpuVideoEncodeAccelerator::EncodeFrameFinished, 310 &GpuVideoEncodeAccelerator::EncodeFrameFinished,
329 weak_this_factory_.GetWeakPtr(), params.frame_id, base::Passed(&shm)))); 311 weak_this_factory_.GetWeakPtr(), params.frame_id, base::Passed(&shm))));
330 encoder_->Encode(frame, params.force_keyframe); 312 encoder_->Encode(frame, params.force_keyframe);
331 } 313 }
332 314
333 void GpuVideoEncodeAccelerator::OnEncode2( 315 void GpuVideoEncodeAccelerator::OnEncode2(
334 const AcceleratedVideoEncoderMsg_Encode_Params2& params) { 316 const AcceleratedVideoEncoderMsg_Encode_Params2& params) {
335 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncode2: " 317 DVLOG(3) << __FUNCTION__ << " frame_id = " << params.frame_id
336 << "frame_id = " << params.frame_id
337 << ", size=" << params.size.ToString() 318 << ", size=" << params.size.ToString()
338 << ", force_keyframe=" << params.force_keyframe 319 << ", force_keyframe=" << params.force_keyframe
339 << ", handle type=" << params.gpu_memory_buffer_handles[0].type; 320 << ", handle type=" << params.gpu_memory_buffer_handles[0].type;
340 // Encoding GpuMemoryBuffer backed frames is not supported. 321 // Encoding GpuMemoryBuffer backed frames is not supported.
341 NOTREACHED(); 322 NOTREACHED();
342 } 323 }
343 324
344 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer( 325 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(
345 int32_t buffer_id, 326 int32_t buffer_id,
346 base::SharedMemoryHandle buffer_handle, 327 base::SharedMemoryHandle buffer_handle,
347 uint32_t buffer_size) { 328 uint32_t buffer_size) {
348 DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): " 329 DVLOG(3) << __FUNCTION__ << " buffer_id=" << buffer_id
349 << "buffer_id=" << buffer_id << ", buffer_size=" << buffer_size; 330 << ", buffer_size=" << buffer_size;
350 if (!encoder_) 331 if (!encoder_)
351 return; 332 return;
352 if (buffer_id < 0) { 333 if (buffer_id < 0) {
353 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): " 334 DLOG(ERROR) << __FUNCTION__ << " invalid buffer_id=" << buffer_id;
354 << "invalid buffer_id=" << buffer_id;
355 NotifyError(VideoEncodeAccelerator::kPlatformFailureError); 335 NotifyError(VideoEncodeAccelerator::kPlatformFailureError);
356 return; 336 return;
357 } 337 }
358 if (buffer_size < output_buffer_size_) { 338 if (buffer_size < output_buffer_size_) {
359 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): " 339 DLOG(ERROR) << __FUNCTION__
360 << "buffer too small for buffer_id=" << buffer_id; 340 << " buffer too small for buffer_id=" << buffer_id;
361 NotifyError(VideoEncodeAccelerator::kPlatformFailureError); 341 NotifyError(VideoEncodeAccelerator::kPlatformFailureError);
362 return; 342 return;
363 } 343 }
364 encoder_->UseOutputBitstreamBuffer( 344 encoder_->UseOutputBitstreamBuffer(
365 BitstreamBuffer(buffer_id, buffer_handle, buffer_size)); 345 BitstreamBuffer(buffer_id, buffer_handle, buffer_size));
366 } 346 }
367 347
368 void GpuVideoEncodeAccelerator::OnDestroy() { 348 void GpuVideoEncodeAccelerator::OnDestroy() {
369 DVLOG(2) << "GpuVideoEncodeAccelerator::OnDestroy()"; 349 DVLOG(2) << __FUNCTION__;
370 OnWillDestroyStub(); 350 OnWillDestroyStub();
371 } 351 }
372 352
373 void GpuVideoEncodeAccelerator::OnRequestEncodingParametersChange( 353 void GpuVideoEncodeAccelerator::OnRequestEncodingParametersChange(
374 uint32_t bitrate, 354 uint32_t bitrate,
375 uint32_t framerate) { 355 uint32_t framerate) {
376 DVLOG(2) << "GpuVideoEncodeAccelerator::OnRequestEncodingParametersChange(): " 356 DVLOG(2) << __FUNCTION__ << " bitrate=" << bitrate
377 << "bitrate=" << bitrate << ", framerate=" << framerate; 357 << ", framerate=" << framerate;
378 if (!encoder_) 358 if (!encoder_)
379 return; 359 return;
380 encoder_->RequestEncodingParametersChange(bitrate, framerate); 360 encoder_->RequestEncodingParametersChange(bitrate, framerate);
381 } 361 }
382 362
383 void GpuVideoEncodeAccelerator::EncodeFrameFinished( 363 void GpuVideoEncodeAccelerator::EncodeFrameFinished(
384 int32_t frame_id, 364 int32_t frame_id,
385 std::unique_ptr<base::SharedMemory> shm) { 365 std::unique_ptr<base::SharedMemory> shm) {
386 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_, 366 Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(host_route_id_,
387 frame_id)); 367 frame_id));
388 // Just let |shm| fall out of scope. 368 // Just let |shm| fall out of scope.
389 } 369 }
390 370
391 void GpuVideoEncodeAccelerator::Send(IPC::Message* message) { 371 void GpuVideoEncodeAccelerator::Send(IPC::Message* message) {
392 stub_->channel()->Send(message); 372 stub_->channel()->Send(message);
393 } 373 }
394 374
395 } // namespace media 375 } // namespace media
OLDNEW
« no previous file with comments | « media/gpu/ipc/service/gpu_video_encode_accelerator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698