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

Unified Diff: media/gpu/android_video_decode_accelerator.cc

Issue 2365103002: Send the h264 SPS and PPS configuration parameters to AVDA (Closed)
Patch Set: Fix array init syntax Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698