[Mesa-dev] [PATCH] st/omx/dec/h265: add scaling list data
Christian König
deathsimple at vodafone.de
Fri Sep 30 07:34:36 UTC 2016
Am 29.09.2016 um 23:28 schrieb Leo Liu:
> Specified by subclause 7.3.4
>
> v2: get the loop optimized
>
> Signed-off-by: Leo Liu <leo.liu at amd.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
> ---
> src/gallium/state_trackers/omx/vid_dec_h265.c | 102 ++++++++++++++++++++++++--
> 1 file changed, 97 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/state_trackers/omx/vid_dec_h265.c b/src/gallium/state_trackers/omx/vid_dec_h265.c
> index 0772b4d..df68711 100644
> --- a/src/gallium/state_trackers/omx/vid_dec_h265.c
> +++ b/src/gallium/state_trackers/omx/vid_dec_h265.c
> @@ -57,6 +57,28 @@ enum {
> NAL_UNIT_TYPE_PPS = 34,
> };
>
> +static const uint8_t Default_8x8_Intra[64] = {
> + 16, 16, 16, 16, 17, 18, 21, 24,
> + 16, 16, 16, 16, 17, 19, 22, 25,
> + 16, 16, 17, 18, 20, 22, 25, 29,
> + 16, 16, 18, 21, 24, 27, 31, 36,
> + 17, 17, 20, 24, 30, 35, 41, 47,
> + 18, 19, 22, 27, 35, 44, 54, 65,
> + 21, 22, 25, 31, 41, 54, 70, 88,
> + 24, 25, 29, 36, 47, 65, 88, 115
> +};
> +
> +static const uint8_t Default_8x8_Inter[64] = {
> + 16, 16, 16, 16, 17, 18, 20, 24,
> + 16, 16, 16, 17, 18, 20, 24, 25,
> + 16, 16, 17, 18, 20, 24, 25, 28,
> + 16, 17, 18, 20, 24, 25, 28, 33,
> + 17, 18, 20, 24, 25, 28, 33, 41,
> + 18, 20, 24, 25, 28, 33, 41, 54,
> + 20, 24, 25, 28, 33, 41, 54, 71,
> + 24, 25, 28, 33, 41, 54, 71, 91
> +};
> +
> struct dpb_list {
> struct list_head list;
> struct pipe_video_buffer *buffer;
> @@ -188,10 +210,80 @@ static unsigned profile_tier_level(struct vl_rbsp *rbsp,
> return level_idc;
> }
>
> -static void scaling_list_data(void)
> +static void scaling_list_data(vid_dec_PrivateType *priv,
> + struct vl_rbsp *rbsp, struct pipe_h265_sps *sps)
> {
> - /* TODO */
> - assert(0);
> + unsigned size_id, matrix_id;
> + unsigned scaling_list_len[4] = { 16, 64, 64, 64 };
> + uint8_t scaling_list4x4[6][64] = { };
> + int i;
> +
> + uint8_t (*scaling_list_data[4])[6][64] = {
> + (uint8_t (*)[6][64])scaling_list4x4,
> + (uint8_t (*)[6][64])sps->ScalingList8x8,
> + (uint8_t (*)[6][64])sps->ScalingList16x16,
> + (uint8_t (*)[6][64])sps->ScalingList32x32
> + };
> + uint8_t (*scaling_list_dc_coeff[2])[6] = {
> + (uint8_t (*)[6])sps->ScalingListDCCoeff16x16,
> + (uint8_t (*)[6])sps->ScalingListDCCoeff32x32
> + };
> +
> + for (size_id = 0; size_id < 4; ++size_id) {
> +
> + for (matrix_id = 0; matrix_id < ((size_id == 3) ? 2 : 6); ++matrix_id) {
> + bool scaling_list_pred_mode_flag = vl_rbsp_u(rbsp, 1);
> +
> + if (!scaling_list_pred_mode_flag) {
> + /* scaling_list_pred_matrix_id_delta */;
> + unsigned matrix_id_with_delta = matrix_id - vl_rbsp_ue(rbsp);
> +
> + if (matrix_id != matrix_id_with_delta) {
> + memcpy((*scaling_list_data[size_id])[matrix_id],
> + (*scaling_list_data[size_id])[matrix_id_with_delta],
> + scaling_list_len[size_id]);
> + if (size_id > 1)
> + (*scaling_list_dc_coeff[size_id - 2])[matrix_id] =
> + (*scaling_list_dc_coeff[size_id - 2])[matrix_id_with_delta];
> + } else {
> + const uint8_t *d;
> +
> + if (size_id == 0)
> + memset((*scaling_list_data[0])[matrix_id], 16, 16);
> + else {
> + if (size_id < 3)
> + d = (matrix_id < 3) ? Default_8x8_Intra : Default_8x8_Inter;
> + else
> + d = (matrix_id < 1) ? Default_8x8_Intra : Default_8x8_Inter;
> + memcpy((*scaling_list_data[size_id])[matrix_id], d,
> + scaling_list_len[size_id]);
> + }
> + if (size_id > 1)
> + (*scaling_list_dc_coeff[size_id - 2])[matrix_id] = 16;
> + }
> + } else {
> + int next_coef = 8;
> + int coef_num = MIN2(64, (1 << (4 + (size_id << 1))));
> +
> + if (size_id > 1) {
> + /* scaling_list_dc_coef_minus8 */
> + next_coef = vl_rbsp_se(rbsp) + 8;
> + (*scaling_list_dc_coeff[size_id - 2])[matrix_id] = next_coef;
> + }
> +
> + for (i = 0; i < coef_num; ++i) {
> + /* scaling_list_delta_coef */
> + next_coef = (next_coef + vl_rbsp_se(rbsp) + 256) % 256;
> + (*scaling_list_data[size_id])[matrix_id][i] = next_coef;
> + }
> + }
> + }
> + }
> +
> + for (i = 0; i < 6; ++i)
> + memcpy(sps->ScalingList4x4[i], scaling_list4x4[i], 16);
> +
> + return;
> }
>
> static void st_ref_pic_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
> @@ -383,7 +475,7 @@ static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
> if (sps->scaling_list_enabled_flag)
> /* sps_scaling_list_data_present_flag */
> if (vl_rbsp_u(rbsp, 1))
> - scaling_list_data();
> + scaling_list_data(priv, rbsp, sps);
>
> sps->amp_enabled_flag = vl_rbsp_u(rbsp, 1);
> sps->sample_adaptive_offset_enabled_flag = vl_rbsp_u(rbsp, 1);
> @@ -506,7 +598,7 @@ static void picture_parameter_set(vid_dec_PrivateType *priv,
>
> /* pps_scaling_list_data_present_flag */
> if (vl_rbsp_u(rbsp, 1))
> - scaling_list_data();
> + scaling_list_data(priv, rbsp, sps);
>
> pps->lists_modification_present_flag = vl_rbsp_u(rbsp, 1);
> pps->log2_parallel_merge_level_minus2 = vl_rbsp_ue(rbsp);
More information about the mesa-dev
mailing list