Chromium Code Reviews| Index: media/gpu/android_video_decode_accelerator.cc |
| diff --git a/media/gpu/android_video_decode_accelerator.cc b/media/gpu/android_video_decode_accelerator.cc |
| index fda7952399e512d576923cda9db2330c77659cbd..5626ae74dbc8fe539cc1359e87c93900a4bf1b4a 100644 |
| --- a/media/gpu/android_video_decode_accelerator.cc |
| +++ b/media/gpu/android_video_decode_accelerator.cc |
| @@ -6,6 +6,7 @@ |
| #include <stddef.h> |
| +#include <array> |
| #include <memory> |
| #include "base/android/build_info.h" |
| @@ -34,6 +35,7 @@ |
| #include "media/base/media.h" |
| #include "media/base/timestamp_constants.h" |
| #include "media/base/video_decoder_config.h" |
| +#include "media/formats/mp4/box_definitions.h" |
| #include "media/gpu/avda_picture_buffer_manager.h" |
| #include "media/gpu/shared_memory_region.h" |
| #include "media/video/picture.h" |
| @@ -504,6 +506,8 @@ bool AndroidVideoDecodeAccelerator::Initialize(const Config& config, |
| return false; |
| } |
| + SetCsd(config.extra_data); |
| + |
| auto gles_decoder = get_gles2_decoder_cb_.Run(); |
| if (!gles_decoder) { |
| LOG(ERROR) << "Failed to get gles2 decoder instance."; |
| @@ -1147,8 +1151,8 @@ AndroidVideoDecodeAccelerator::ConfigureMediaCodecOnAnyThread( |
| std::unique_ptr<VideoCodecBridge> codec(VideoCodecBridge::CreateDecoder( |
| codec_config->codec_, codec_config->needs_protected_surface_, |
| codec_config->initial_expected_coded_size_, |
| - codec_config->surface_.j_surface().obj(), media_crypto, true, |
| - require_software_codec)); |
| + codec_config->surface_.j_surface().obj(), media_crypto, |
| + codec_config->csd0_, codec_config->csd1_, true, require_software_codec)); |
| return codec; |
| } |
| @@ -1600,6 +1604,34 @@ void AndroidVideoDecodeAccelerator::ReleaseMediaCodec() { |
| } |
| } |
| +void AndroidVideoDecodeAccelerator::SetCsd( |
| + const std::vector<uint8_t>& extra_data) { |
| + DCHECK_NE(codec_config_->codec_, kUnknownVideoCodec); |
| + |
| + // We currently only set csd for H264. |
| + if (codec_config_->codec_ != kCodecH264 || extra_data.empty()) |
|
sandersd (OOO until July 31)
2016/09/27 20:03:16
I don't like this dependency, it seems to me that
watk
2016/09/27 21:44:36
Done.
|
| + return; |
| + |
| + mp4::AVCDecoderConfigurationRecord record; |
| + if (!record.Parse(extra_data.data(), extra_data.size())) { |
| + DVLOG(1) << "Failed to parse the AVCC."; |
| + return; |
|
sandersd (OOO until July 31)
2016/09/27 20:03:16
Perhaps we should return a bool? Explicitly ignori
watk
2016/09/27 21:44:36
Done.
|
| + } |
| + |
| + const std::array<uint8_t, 4> prefix = {0, 0, 0, 1}; |
| + for (const std::vector<uint8_t>& sps : record.sps_list) { |
| + auto& csd0 = codec_config_->csd0_; |
| + csd0.insert(csd0.end(), prefix.begin(), prefix.end()); |
| + csd0.insert(csd0.end(), sps.begin(), sps.end()); |
| + } |
| + |
| + for (const std::vector<uint8_t>& pps : record.pps_list) { |
| + auto& csd1 = codec_config_->csd1_; |
| + csd1.insert(csd1.end(), prefix.begin(), prefix.end()); |
| + csd1.insert(csd1.end(), pps.begin(), pps.end()); |
| + } |
| +} |
| + |
| // static |
| VideoDecodeAccelerator::Capabilities |
| AndroidVideoDecodeAccelerator::GetCapabilities( |