Commit e67f5091 authored by Hirokazu Honda's avatar Hirokazu Honda Committed by Commit Bot

media/gpu/vaapi/AV1VaapiVideoDecoderDelegate: Implement FillFilmGrainInfo()

Bug: 1000988
Test: video_decode_accelerator_tests
Change-Id: Iac1ff7be472bf851cf2e0222634e45be716708c6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2440727
Commit-Queue: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: default avatarAndres Calderon Jaramillo <andrescj@chromium.org>
Reviewed-by: default avatarSreerenj Balachandran <sreerenj.balachandran@intel.com>
Cr-Commit-Position: refs/heads/master@{#827598}
parent c04c1750
...@@ -56,6 +56,128 @@ void FillSegmentInfo(VASegmentationStructAV1& va_seg_info, ...@@ -56,6 +56,128 @@ void FillSegmentInfo(VASegmentationStructAV1& va_seg_info,
} }
} }
void FillFilmGrainInfo(VAFilmGrainStructAV1& va_film_grain_info,
const libgav1::FilmGrainParams& film_grain_params) {
if (!film_grain_params.apply_grain)
return;
#define COPY_FILM_GRAIN_FIELD(a) \
va_film_grain_info.film_grain_info_fields.bits.a = film_grain_params.a
COPY_FILM_GRAIN_FIELD(apply_grain);
COPY_FILM_GRAIN_FIELD(chroma_scaling_from_luma);
COPY_FILM_GRAIN_FIELD(grain_scale_shift);
COPY_FILM_GRAIN_FIELD(overlap_flag);
COPY_FILM_GRAIN_FIELD(clip_to_restricted_range);
#undef COPY_FILM_GRAIN_FIELD
va_film_grain_info.film_grain_info_fields.bits.ar_coeff_lag =
film_grain_params.auto_regression_coeff_lag;
DCHECK_GE(film_grain_params.chroma_scaling, 8u);
DCHECK_GE(film_grain_params.auto_regression_shift, 6u);
va_film_grain_info.film_grain_info_fields.bits.grain_scaling_minus_8 =
film_grain_params.chroma_scaling - 8;
va_film_grain_info.film_grain_info_fields.bits.ar_coeff_shift_minus_6 =
film_grain_params.auto_regression_shift - 6;
constexpr size_t kFilmGrainPointYSize = 14;
constexpr size_t kFilmGrainPointUVSize = 10;
static_assert(
ARRAY_SIZE(va_film_grain_info.point_y_value) == kFilmGrainPointYSize &&
ARRAY_SIZE(va_film_grain_info.point_y_scaling) ==
kFilmGrainPointYSize &&
ARRAY_SIZE(va_film_grain_info.point_cb_value) ==
kFilmGrainPointUVSize &&
ARRAY_SIZE(va_film_grain_info.point_cb_scaling) ==
kFilmGrainPointUVSize &&
ARRAY_SIZE(va_film_grain_info.point_cr_value) ==
kFilmGrainPointUVSize &&
ARRAY_SIZE(va_film_grain_info.point_cr_scaling) ==
kFilmGrainPointUVSize &&
ARRAY_SIZE(film_grain_params.point_y_value) == kFilmGrainPointYSize &&
ARRAY_SIZE(film_grain_params.point_y_scaling) ==
kFilmGrainPointYSize &&
ARRAY_SIZE(film_grain_params.point_u_value) ==
kFilmGrainPointUVSize &&
ARRAY_SIZE(film_grain_params.point_u_scaling) ==
kFilmGrainPointUVSize &&
ARRAY_SIZE(film_grain_params.point_v_value) ==
kFilmGrainPointUVSize &&
ARRAY_SIZE(film_grain_params.point_v_scaling) ==
kFilmGrainPointUVSize,
"Invalid array size of film grain values");
DCHECK_LE(film_grain_params.num_y_points, kFilmGrainPointYSize);
DCHECK_LE(film_grain_params.num_u_points, kFilmGrainPointUVSize);
DCHECK_LE(film_grain_params.num_v_points, kFilmGrainPointUVSize);
#define COPY_FILM_GRAIN_FIELD2(a, b) va_film_grain_info.a = film_grain_params.b
#define COPY_FILM_GRAIN_FIELD3(a) COPY_FILM_GRAIN_FIELD2(a, a)
COPY_FILM_GRAIN_FIELD3(grain_seed);
COPY_FILM_GRAIN_FIELD3(num_y_points);
for (uint8_t i = 0; i < film_grain_params.num_y_points; ++i) {
COPY_FILM_GRAIN_FIELD3(point_y_value[i]);
COPY_FILM_GRAIN_FIELD3(point_y_scaling[i]);
}
#undef COPY_FILM_GRAIN_FIELD3
COPY_FILM_GRAIN_FIELD2(num_cb_points, num_u_points);
for (uint8_t i = 0; i < film_grain_params.num_u_points; ++i) {
COPY_FILM_GRAIN_FIELD2(point_cb_value[i], point_u_value[i]);
COPY_FILM_GRAIN_FIELD2(point_cb_scaling[i], point_u_scaling[i]);
}
COPY_FILM_GRAIN_FIELD2(num_cr_points, num_v_points);
for (uint8_t i = 0; i < film_grain_params.num_v_points; ++i) {
COPY_FILM_GRAIN_FIELD2(point_cr_value[i], point_v_value[i]);
COPY_FILM_GRAIN_FIELD2(point_cr_scaling[i], point_v_scaling[i]);
}
constexpr size_t kAutoRegressionCoeffYSize = 24;
constexpr size_t kAutoRegressionCoeffUVSize = 25;
static_assert(
ARRAY_SIZE(va_film_grain_info.ar_coeffs_y) == kAutoRegressionCoeffYSize &&
ARRAY_SIZE(va_film_grain_info.ar_coeffs_cb) ==
kAutoRegressionCoeffUVSize &&
ARRAY_SIZE(va_film_grain_info.ar_coeffs_cr) ==
kAutoRegressionCoeffUVSize &&
ARRAY_SIZE(film_grain_params.auto_regression_coeff_y) ==
kAutoRegressionCoeffYSize &&
ARRAY_SIZE(film_grain_params.auto_regression_coeff_u) ==
kAutoRegressionCoeffUVSize &&
ARRAY_SIZE(film_grain_params.auto_regression_coeff_v) ==
kAutoRegressionCoeffUVSize,
"Invalid array size of auto-regressive coefficients");
const size_t num_pos_y = (film_grain_params.auto_regression_coeff_lag * 2) *
(film_grain_params.auto_regression_coeff_lag + 1);
const size_t num_pos_uv = num_pos_y + (film_grain_params.num_y_points > 0);
if (film_grain_params.num_y_points > 0) {
DCHECK_LE(num_pos_y, kAutoRegressionCoeffYSize);
for (size_t i = 0; i < num_pos_y; ++i)
COPY_FILM_GRAIN_FIELD2(ar_coeffs_y[i], auto_regression_coeff_y[i]);
}
if (film_grain_params.chroma_scaling_from_luma ||
film_grain_params.num_u_points > 0 ||
film_grain_params.num_v_points > 0) {
DCHECK_LE(num_pos_uv, kAutoRegressionCoeffUVSize);
for (size_t i = 0; i < num_pos_uv; ++i) {
if (film_grain_params.chroma_scaling_from_luma ||
film_grain_params.num_u_points > 0) {
COPY_FILM_GRAIN_FIELD2(ar_coeffs_cb[i], auto_regression_coeff_u[i]);
}
if (film_grain_params.chroma_scaling_from_luma ||
film_grain_params.num_v_points > 0) {
COPY_FILM_GRAIN_FIELD2(ar_coeffs_cr[i], auto_regression_coeff_v[i]);
}
}
}
if (film_grain_params.num_u_points > 0) {
COPY_FILM_GRAIN_FIELD2(cb_mult, u_multiplier + 128);
COPY_FILM_GRAIN_FIELD2(cb_luma_mult, u_luma_multiplier + 128);
COPY_FILM_GRAIN_FIELD2(cb_offset, u_offset + 256);
}
if (film_grain_params.num_v_points > 0) {
COPY_FILM_GRAIN_FIELD2(cr_mult, v_multiplier + 128);
COPY_FILM_GRAIN_FIELD2(cr_luma_mult, v_luma_multiplier + 128);
COPY_FILM_GRAIN_FIELD2(cr_offset, v_offset + 256);
}
#undef COPY_FILM_GRAIN_FIELD2
}
bool FillAV1PictureParameter(const AV1Picture& pic, bool FillAV1PictureParameter(const AV1Picture& pic,
const libgav1::ObuSequenceHeader& seq_header, const libgav1::ObuSequenceHeader& seq_header,
const AV1ReferenceFrameVector& ref_frames, const AV1ReferenceFrameVector& ref_frames,
......
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