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

Side by Side Diff: media/gpu/android_video_encode_accelerator.cc

Issue 2697643003: media: Clean up MediaCodecBridge and remove subclasses (Closed)
Patch Set: rebase Created 3 years, 9 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/android_video_encode_accelerator.h ('k') | media/gpu/avda_codec_allocator.h » ('j') | 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/android_video_encode_accelerator.h" 5 #include "media/gpu/android_video_encode_accelerator.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <set> 8 #include <set>
9 #include <tuple> 9 #include <tuple>
10 10
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 if (supported_codec.codec == kCodecVP8 && 114 if (supported_codec.codec == kCodecVP8 &&
115 !MediaCodecUtil::IsVp8EncoderAvailable()) { 115 !MediaCodecUtil::IsVp8EncoderAvailable()) {
116 continue; 116 continue;
117 } 117 }
118 118
119 if (supported_codec.codec == kCodecH264 && 119 if (supported_codec.codec == kCodecH264 &&
120 !MediaCodecUtil::IsH264EncoderAvailable()) { 120 !MediaCodecUtil::IsH264EncoderAvailable()) {
121 continue; 121 continue;
122 } 122 }
123 123
124 if (VideoCodecBridge::IsKnownUnaccelerated(supported_codec.codec, 124 if (MediaCodecUtil::IsKnownUnaccelerated(supported_codec.codec,
125 MEDIA_CODEC_ENCODER)) { 125 MediaCodecDirection::ENCODER)) {
126 continue; 126 continue;
127 } 127 }
128 128
129 SupportedProfile profile; 129 SupportedProfile profile;
130 profile.profile = supported_codec.profile; 130 profile.profile = supported_codec.profile;
131 // It would be nice if MediaCodec exposes the maximum capabilities of 131 // It would be nice if MediaCodec exposes the maximum capabilities of
132 // the encoder. Hard-code some reasonable defaults as workaround. 132 // the encoder. Hard-code some reasonable defaults as workaround.
133 profile.max_resolution.SetSize(kMaxEncodeFrameWidth, kMaxEncodeFrameHeight); 133 profile.max_resolution.SetSize(kMaxEncodeFrameWidth, kMaxEncodeFrameHeight);
134 profile.max_framerate_numerator = kMaxFramerateNumerator; 134 profile.max_framerate_numerator = kMaxFramerateNumerator;
135 profile.max_framerate_denominator = kMaxFramerateDenominator; 135 profile.max_framerate_denominator = kMaxFramerateDenominator;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 frame_input_count = 30; 180 frame_input_count = 30;
181 i_frame_interval = IFRAME_INTERVAL_H264; 181 i_frame_interval = IFRAME_INTERVAL_H264;
182 } else { 182 } else {
183 return false; 183 return false;
184 } 184 }
185 185
186 frame_size_ = input_visible_size; 186 frame_size_ = input_visible_size;
187 last_set_bitrate_ = initial_bitrate; 187 last_set_bitrate_ = initial_bitrate;
188 188
189 // Only consider using MediaCodec if it's likely backed by hardware. 189 // Only consider using MediaCodec if it's likely backed by hardware.
190 if (VideoCodecBridge::IsKnownUnaccelerated(codec, MEDIA_CODEC_ENCODER)) { 190 if (MediaCodecUtil::IsKnownUnaccelerated(codec,
191 MediaCodecDirection::ENCODER)) {
191 DLOG(ERROR) << "No HW support"; 192 DLOG(ERROR) << "No HW support";
192 return false; 193 return false;
193 } 194 }
194 195
195 PixelFormat pixel_format = COLOR_FORMAT_YUV420_SEMIPLANAR; 196 PixelFormat pixel_format = COLOR_FORMAT_YUV420_SEMIPLANAR;
196 if (!GetSupportedColorFormatForMime(mime_type, &pixel_format)) { 197 if (!GetSupportedColorFormatForMime(mime_type, &pixel_format)) {
197 DLOG(ERROR) << "No color format support."; 198 DLOG(ERROR) << "No color format support.";
198 return false; 199 return false;
199 } 200 }
200 media_codec_.reset(VideoCodecBridge::CreateEncoder( 201 media_codec_ = MediaCodecBridgeImpl::CreateVideoEncoder(
201 codec, input_visible_size, initial_bitrate, INITIAL_FRAMERATE, 202 codec, input_visible_size, initial_bitrate, INITIAL_FRAMERATE,
202 i_frame_interval, pixel_format)); 203 i_frame_interval, pixel_format);
203 204
204 if (!media_codec_) { 205 if (!media_codec_) {
205 DLOG(ERROR) << "Failed to create/start the codec: " 206 DLOG(ERROR) << "Failed to create/start the codec: "
206 << input_visible_size.ToString(); 207 << input_visible_size.ToString();
207 return false; 208 return false;
208 } 209 }
209 210
210 // Conservative upper bound for output buffer size: decoded size + 2KB. 211 // Conservative upper bound for output buffer size: decoded size + 2KB.
211 const size_t output_buffer_capacity = 212 const size_t output_buffer_capacity =
212 VideoFrame::AllocationSize(format, input_visible_size) + 2048; 213 VideoFrame::AllocationSize(format, input_visible_size) + 2048;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 } 304 }
304 305
305 void AndroidVideoEncodeAccelerator::QueueInput() { 306 void AndroidVideoEncodeAccelerator::QueueInput() {
306 if (error_occurred_ || pending_frames_.empty()) 307 if (error_occurred_ || pending_frames_.empty())
307 return; 308 return;
308 309
309 int input_buf_index = 0; 310 int input_buf_index = 0;
310 MediaCodecStatus status = 311 MediaCodecStatus status =
311 media_codec_->DequeueInputBuffer(NoWaitTimeOut(), &input_buf_index); 312 media_codec_->DequeueInputBuffer(NoWaitTimeOut(), &input_buf_index);
312 if (status != MEDIA_CODEC_OK) { 313 if (status != MEDIA_CODEC_OK) {
313 DCHECK(status == MEDIA_CODEC_DEQUEUE_INPUT_AGAIN_LATER || 314 DCHECK(status == MEDIA_CODEC_TRY_AGAIN_LATER ||
314 status == MEDIA_CODEC_ERROR); 315 status == MEDIA_CODEC_ERROR);
315 RETURN_ON_FAILURE(status != MEDIA_CODEC_ERROR, "MediaCodec error", 316 RETURN_ON_FAILURE(status != MEDIA_CODEC_ERROR, "MediaCodec error",
316 kPlatformFailureError); 317 kPlatformFailureError);
317 return; 318 return;
318 } 319 }
319 320
320 const PendingFrames::value_type& input = pending_frames_.front(); 321 const PendingFrames::value_type& input = pending_frames_.front();
321 bool is_key_frame = std::get<1>(input); 322 bool is_key_frame = std::get<1>(input);
322 if (is_key_frame) { 323 if (is_key_frame) {
323 // Ideally MediaCodec would honor BUFFER_FLAG_SYNC_FRAME so we could 324 // Ideally MediaCodec would honor BUFFER_FLAG_SYNC_FRAME so we could
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 378
378 int32_t buf_index = 0; 379 int32_t buf_index = 0;
379 size_t offset = 0; 380 size_t offset = 0;
380 size_t size = 0; 381 size_t size = 0;
381 bool key_frame = false; 382 bool key_frame = false;
382 383
383 MediaCodecStatus status = 384 MediaCodecStatus status =
384 media_codec_->DequeueOutputBuffer(NoWaitTimeOut(), &buf_index, &offset, 385 media_codec_->DequeueOutputBuffer(NoWaitTimeOut(), &buf_index, &offset,
385 &size, nullptr, nullptr, &key_frame); 386 &size, nullptr, nullptr, &key_frame);
386 switch (status) { 387 switch (status) {
387 case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER: 388 case MEDIA_CODEC_TRY_AGAIN_LATER:
388 return; 389 return;
389 390
390 case MEDIA_CODEC_ERROR: 391 case MEDIA_CODEC_ERROR:
391 RETURN_ON_FAILURE(false, "Codec error", kPlatformFailureError); 392 RETURN_ON_FAILURE(false, "Codec error", kPlatformFailureError);
392 // Unreachable because of previous statement, but included for clarity. 393 // Unreachable because of previous statement, but included for clarity.
393 return; 394 return;
394 395
395 case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: 396 case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED:
396 return; 397 return;
397 398
(...skipping 26 matching lines...) Expand all
424 --num_buffers_at_codec_; 425 --num_buffers_at_codec_;
425 426
426 base::ThreadTaskRunnerHandle::Get()->PostTask( 427 base::ThreadTaskRunnerHandle::Get()->PostTask(
427 FROM_HERE, 428 FROM_HERE,
428 base::Bind(&VideoEncodeAccelerator::Client::BitstreamBufferReady, 429 base::Bind(&VideoEncodeAccelerator::Client::BitstreamBufferReady,
429 client_ptr_factory_->GetWeakPtr(), bitstream_buffer.id(), size, 430 client_ptr_factory_->GetWeakPtr(), bitstream_buffer.id(), size,
430 key_frame, base::Time::Now() - base::Time())); 431 key_frame, base::Time::Now() - base::Time()));
431 } 432 }
432 433
433 } // namespace media 434 } // namespace media
OLDNEW
« no previous file with comments | « media/gpu/android_video_encode_accelerator.h ('k') | media/gpu/avda_codec_allocator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698