Commit 7d406388 authored by Hirokazu Honda's avatar Hirokazu Honda Committed by Commit Bot

media/gpu/vaapi: Fix bugs in Av1VaapiVideoDecoderDelegate

I made a few mistakes at the last moment in the initial
implementation. 1.) CHECK the validness of ref_frame_map is
wrong in keyframe case. 2.) slice_data_offset in
VASliceParameterBufferAV1 is not filled.  This CL fixes them.

Bug: b:172214398
Test: video_decode_accelerator_tests on volteer
Change-Id: I24e9fada30dd56fe10a51fb3e5d8c448ee996666
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2542940
Auto-Submit: Hirokazu Honda <hiroh@chromium.org>
Commit-Queue: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: default avatarSreerenj Balachandran <sreerenj.balachandran@intel.com>
Reviewed-by: default avatarAndres Calderon Jaramillo <andrescj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#828508}
parent 8bcd9c91
...@@ -580,28 +580,28 @@ bool FillAV1PictureParameter(const AV1Picture& pic, ...@@ -580,28 +580,28 @@ bool FillAV1PictureParameter(const AV1Picture& pic,
ARRAY_SIZE(va_pic_param.ref_frame_map) == ARRAY_SIZE(va_pic_param.ref_frame_map) ==
libgav1::kNumReferenceFrameTypes, libgav1::kNumReferenceFrameTypes,
"Invalid size of reference frames"); "Invalid size of reference frames");
// TODO(hiroh): We should start with 1 and set ref_frame_map[0] to
// VA_INVALID_SURFACE based on the libva documentation.
for (int8_t i = 0; i < libgav1::kNumReferenceFrameTypes; ++i) {
const auto* ref_pic =
static_cast<const VaapiAV1Picture*>(ref_frames[i].get());
va_pic_param.ref_frame_map[i] =
ref_pic ? ref_pic->reconstruct_va_surface()->id() : VA_INVALID_SURFACE;
}
static_assert(libgav1::kNumInterReferenceFrameTypes == 7 && static_assert(libgav1::kNumInterReferenceFrameTypes == 7 &&
ARRAY_SIZE(frame_header.reference_frame_index) == ARRAY_SIZE(frame_header.reference_frame_index) ==
libgav1::kNumInterReferenceFrameTypes && libgav1::kNumInterReferenceFrameTypes &&
ARRAY_SIZE(va_pic_param.ref_frame_idx) == ARRAY_SIZE(va_pic_param.ref_frame_idx) ==
libgav1::kNumInterReferenceFrameTypes, libgav1::kNumInterReferenceFrameTypes,
"Invalid size of reference frame indices"); "Invalid size of reference frame indices");
for (size_t i = 0; i < libgav1::kNumInterReferenceFrameTypes; ++i) { for (size_t i = 0; i < libgav1::kNumReferenceFrameTypes; ++i) {
const int8_t index = frame_header.reference_frame_index[i]; const auto* ref_pic =
if (index < 0) static_cast<const VaapiAV1Picture*>(ref_frames[i].get());
continue; va_pic_param.ref_frame_map[i] =
CHECK_LT(index, libgav1::kNumReferenceFrameTypes); ref_pic ? ref_pic->reconstruct_va_surface()->id() : VA_INVALID_SURFACE;
CHECK_NE(va_pic_param.ref_frame_map[index], VA_INVALID_SURFACE); }
va_pic_param.ref_frame_idx[i] = base::checked_cast<uint8_t>(index);
// |ref_frame_map| doesn't need to be filled in keyframe case.
if (frame_header.frame_type != libgav1::FrameType::kFrameKey) {
for (size_t i = 0; i < libgav1::kNumInterReferenceFrameTypes; ++i) {
const int8_t index = frame_header.reference_frame_index[i];
if (index < 0)
continue;
CHECK_LT(index, libgav1::kNumReferenceFrameTypes);
va_pic_param.ref_frame_idx[i] = base::checked_cast<uint8_t>(index);
}
} }
va_pic_param.primary_ref_frame = va_pic_param.primary_ref_frame =
...@@ -692,6 +692,8 @@ bool FillAV1SliceParameters( ...@@ -692,6 +692,8 @@ bool FillAV1SliceParameters(
return false; return false;
} }
CHECK(tile_buffers[tile].data >= data.data()); CHECK(tile_buffers[tile].data >= data.data());
va_tile_param.slice_data_offset =
base::checked_cast<uint32_t>(tile_buffers[tile].data - data.data());
base::CheckedNumeric<uint32_t> safe_va_slice_data_end( base::CheckedNumeric<uint32_t> safe_va_slice_data_end(
va_tile_param.slice_data_offset); va_tile_param.slice_data_offset);
safe_va_slice_data_end += va_tile_param.slice_data_size; safe_va_slice_data_end += va_tile_param.slice_data_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment