Index: media/gpu/android_video_encode_accelerator.cc |
diff --git a/media/gpu/android_video_encode_accelerator.cc b/media/gpu/android_video_encode_accelerator.cc |
index 023d2351a1ee4047b0b008d784b114ce887b9d07..77780dc5186215f8ff1d31ef2ebd0feb06644585 100644 |
--- a/media/gpu/android_video_encode_accelerator.cc |
+++ b/media/gpu/android_video_encode_accelerator.cc |
@@ -108,8 +108,7 @@ AndroidVideoEncodeAccelerator::GetSupportedProfiles() { |
const VideoCodec codec; |
const VideoCodecProfile profile; |
} kSupportedCodecs[] = {{kCodecVP8, VP8PROFILE_ANY}, |
- {kCodecH264, H264PROFILE_BASELINE}, |
- {kCodecH264, H264PROFILE_MAIN}}; |
+ {kCodecH264, H264PROFILE_BASELINE}}; |
for (const auto& supported_codec : kSupportedCodecs) { |
if (supported_codec.codec == kCodecVP8 && |
@@ -117,6 +116,11 @@ AndroidVideoEncodeAccelerator::GetSupportedProfiles() { |
continue; |
} |
+ if (supported_codec.codec == kCodecH264 && |
+ !MediaCodecUtil::IsH264EncoderAvailable()) { |
+ continue; |
+ } |
+ |
if (VideoCodecBridge::IsKnownUnaccelerated(supported_codec.codec, |
MEDIA_CODEC_ENCODER)) { |
continue; |
@@ -161,15 +165,18 @@ bool AndroidVideoEncodeAccelerator::Initialize( |
// encoder before being returned any output frames, since the encoder may |
// need to hold onto some subset of inputs as reference pictures. |
uint32_t frame_input_count; |
+ uint32_t i_frame_interval; |
if (output_profile == VP8PROFILE_ANY) { |
codec = kCodecVP8; |
mime_type = "video/x-vnd.on2.vp8"; |
frame_input_count = 1; |
+ i_frame_interval = IFRAME_INTERVAL_VPX; |
} else if (output_profile == H264PROFILE_BASELINE || |
output_profile == H264PROFILE_MAIN) { |
codec = kCodecH264; |
mime_type = "video/avc"; |
frame_input_count = 30; |
+ i_frame_interval = IFRAME_INTERVAL_H264; |
} else { |
return false; |
} |
@@ -190,7 +197,7 @@ bool AndroidVideoEncodeAccelerator::Initialize( |
} |
media_codec_.reset(VideoCodecBridge::CreateEncoder( |
codec, input_visible_size, initial_bitrate, INITIAL_FRAMERATE, |
- IFRAME_INTERVAL, pixel_format)); |
+ i_frame_interval, pixel_format)); |
if (!media_codec_) { |
DLOG(ERROR) << "Failed to create/start the codec: " |
@@ -347,9 +354,10 @@ void AndroidVideoEncodeAccelerator::QueueInput() { |
frame->coded_size().height()); |
RETURN_ON_FAILURE(converted, "Failed to I420ToNV12!", kPlatformFailureError); |
- fake_input_timestamp_ += base::TimeDelta::FromMicroseconds(1); |
+ input_timestamp_ += base::TimeDelta::FromMicroseconds( |
+ base::Time::kMicrosecondsPerSecond / INITIAL_FRAMERATE); |
status = media_codec_->QueueInputBuffer(input_buf_index, nullptr, queued_size, |
- fake_input_timestamp_); |
+ input_timestamp_); |
UMA_HISTOGRAM_TIMES("Media.AVDA.InputQueueTime", |
base::Time::Now() - std::get<2>(input)); |
RETURN_ON_FAILURE(status == MEDIA_CODEC_OK, |
@@ -369,34 +377,33 @@ void AndroidVideoEncodeAccelerator::DequeueOutput() { |
size_t offset = 0; |
size_t size = 0; |
bool key_frame = false; |
- do { |
- MediaCodecStatus status = |
- media_codec_->DequeueOutputBuffer(NoWaitTimeOut(), &buf_index, &offset, |
- &size, nullptr, nullptr, &key_frame); |
- switch (status) { |
- case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER: |
- return; |
- |
- case MEDIA_CODEC_ERROR: |
- RETURN_ON_FAILURE(false, "Codec error", kPlatformFailureError); |
- // Unreachable because of previous statement, but included for clarity. |
- return; |
- |
- case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: |
- break; |
- |
- case MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED: |
- break; |
- |
- case MEDIA_CODEC_OK: |
- DCHECK_GE(buf_index, 0); |
- break; |
- |
- default: |
- NOTREACHED(); |
- break; |
- } |
- } while (buf_index < 0); |
+ |
+ MediaCodecStatus status = |
+ media_codec_->DequeueOutputBuffer(NoWaitTimeOut(), &buf_index, &offset, |
+ &size, nullptr, nullptr, &key_frame); |
+ switch (status) { |
+ case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER: |
+ return; |
+ |
+ case MEDIA_CODEC_ERROR: |
+ RETURN_ON_FAILURE(false, "Codec error", kPlatformFailureError); |
+ // Unreachable because of previous statement, but included for clarity. |
+ return; |
+ |
+ case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: |
+ return; |
+ |
+ case MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED: |
+ return; |
+ |
+ case MEDIA_CODEC_OK: |
+ DCHECK_GE(buf_index, 0); |
+ break; |
+ |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
BitstreamBuffer bitstream_buffer = available_bitstream_buffers_.back(); |
available_bitstream_buffers_.pop_back(); |
@@ -407,8 +414,8 @@ void AndroidVideoEncodeAccelerator::DequeueOutput() { |
"Encoded buffer too large: " << size << ">" << shm->size(), |
kPlatformFailureError); |
- MediaCodecStatus status = media_codec_->CopyFromOutputBuffer( |
- buf_index, offset, shm->memory(), size); |
+ status = media_codec_->CopyFromOutputBuffer(buf_index, offset, shm->memory(), |
+ size); |
RETURN_ON_FAILURE(status == MEDIA_CODEC_OK, "CopyFromOutputBuffer failed", |
kPlatformFailureError); |
media_codec_->ReleaseOutputBuffer(buf_index, false); |