[Mesa-dev] [PATCH 3/7] vl/h264: split fields into SPS/PPS

Ilia Mirkin imirkin at alum.mit.edu
Thu Oct 24 20:27:47 CEST 2013


On Thu, Oct 24, 2013 at 1:55 PM, Christian König
<deathsimple at vodafone.de> wrote:
> Am 24.10.2013 19:18, schrieb Ilia Mirkin:
>
>> On Thu, Oct 24, 2013 at 9:14 AM, Christian König
>> <deathsimple at vodafone.de> wrote:
>>>
>>> From: Christian König <christian.koenig at amd.com>
>>>
>>> Add alot of missing fields as well.
>>>
>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>> ---
>>>   .../drivers/nouveau/nouveau_vp3_video_bsp.c        | 30 ++++----
>>>   src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c | 24 +++---
>>>   src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c  | 38 +++++-----
>>>   src/gallium/drivers/nouveau/nv50/nv84_video_vp.c   |  8 +-
>>>   src/gallium/drivers/radeon/radeon_uvd.c            | 59 +++++++--------
>>>   src/gallium/include/pipe/p_video_state.h           | 88
>>> ++++++++++++++++------
>>>   src/gallium/state_trackers/vdpau/decode.c          | 47 ++++++------
>>>   7 files changed, 169 insertions(+), 125 deletions(-)
>>>
>>> diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video_bsp.c
>>> b/src/gallium/drivers/nouveau/nouveau_vp3_video_bsp.c
>>> index ba2a917..6d968c1 100644
>>> --- a/src/gallium/drivers/nouveau/nouveau_vp3_video_bsp.c
>>> +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video_bsp.c
>>> @@ -204,25 +204,25 @@ nouveau_vp3_fill_picparm_h264_bsp(struct
>>> nouveau_vp3_decoder *dec,
>>>      h->unk00 = 1;
>>>      h->pad1 = h->pad2 = 0;
>>>      h->unk = 0;
>>> -   h->log2_max_frame_num_minus4 = d->log2_max_frame_num_minus4;
>>> -   h->frame_mbs_only_flag = d->frame_mbs_only_flag;
>>> -   h->direct_8x8_inference_flag = d->direct_8x8_inference_flag;
>>> +   h->log2_max_frame_num_minus4 =
>>> d->pps->sps->log2_max_frame_num_minus4;
>>> +   h->frame_mbs_only_flag = d->pps->sps->frame_mbs_only_flag;
>>> +   h->direct_8x8_inference_flag =
>>> d->pps->sps->direct_8x8_inference_flag;
>>>      h->width_mb = mb(dec->base.width);
>>>      h->height_mb = mb(dec->base.height);
>>> -   h->entropy_coding_mode_flag = d->entropy_coding_mode_flag;
>>> -   h->pic_order_present_flag = d->pic_order_present_flag;
>>> -   h->pic_order_cnt_type = d->pic_order_cnt_type;
>>> -   h->log2_max_pic_order_cnt_lsb_minus4 =
>>> d->log2_max_pic_order_cnt_lsb_minus4;
>>> -   h->delta_pic_order_always_zero_flag =
>>> d->delta_pic_order_always_zero_flag;
>>> +   h->entropy_coding_mode_flag = d->pps->entropy_coding_mode_flag;
>>> +   h->pic_order_present_flag =
>>> d->pps->bottom_field_pic_order_in_frame_present_flag;
>>> +   h->pic_order_cnt_type = d->pps->sps->pic_order_cnt_type;
>>> +   h->log2_max_pic_order_cnt_lsb_minus4 =
>>> d->pps->sps->log2_max_pic_order_cnt_lsb_minus4;
>>> +   h->delta_pic_order_always_zero_flag =
>>> d->pps->sps->delta_pic_order_always_zero_flag;
>>>      h->num_ref_idx_l0_active_minus1 = d->num_ref_idx_l0_active_minus1;
>>>      h->num_ref_idx_l1_active_minus1 = d->num_ref_idx_l1_active_minus1;
>>> -   h->weighted_pred_flag = d->weighted_pred_flag;
>>> -   h->weighted_bipred_idc = d->weighted_bipred_idc;
>>> -   h->pic_init_qp_minus26 = d->pic_init_qp_minus26;
>>> -   h->deblocking_filter_control_present_flag =
>>> d->deblocking_filter_control_present_flag;
>>> -   h->redundant_pic_cnt_present_flag =
>>> d->redundant_pic_cnt_present_flag;
>>> -   h->transform_8x8_mode_flag = d->transform_8x8_mode_flag;
>>> -   h->mb_adaptive_frame_field_flag = d->mb_adaptive_frame_field_flag;
>>> +   h->weighted_pred_flag = d->pps->weighted_pred_flag;
>>> +   h->weighted_bipred_idc = d->pps->weighted_bipred_idc;
>>> +   h->pic_init_qp_minus26 = d->pps->pic_init_qp_minus26;
>>> +   h->deblocking_filter_control_present_flag =
>>> d->pps->deblocking_filter_control_present_flag;
>>> +   h->redundant_pic_cnt_present_flag =
>>> d->pps->redundant_pic_cnt_present_flag;
>>> +   h->transform_8x8_mode_flag = d->pps->transform_8x8_mode_flag;
>>> +   h->mb_adaptive_frame_field_flag =
>>> d->pps->sps->mb_adaptive_frame_field_flag;
>>>      h->field_pic_flag = d->field_pic_flag;
>>>      h->bottom_field_flag = d->bottom_field_flag;
>>>      memset(h->real_pad, 0, sizeof(h->real_pad));
>>> diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c
>>> b/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c
>>> index add998d..a0f5332 100644
>>> --- a/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c
>>> +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c
>>> @@ -340,22 +340,22 @@ nouveau_vp3_fill_picparm_h264_vp(struct
>>> nouveau_vp3_decoder *dec,
>>>      nouveau_vp3_inter_sizes(dec, 1, &ring, &h->bucket_size,
>>> &h->inter_ring_data_size);
>>>
>>>      h->u220 = 0;
>>> -   h->f0 = d->mb_adaptive_frame_field_flag;
>>> -   h->f1 = d->direct_8x8_inference_flag;
>>> -   h->weighted_pred_flag = d->weighted_pred_flag;
>>> -   h->f3 = d->constrained_intra_pred_flag;
>>> +   h->f0 = d->pps->sps->mb_adaptive_frame_field_flag;
>>> +   h->f1 = d->pps->sps->direct_8x8_inference_flag;
>>> +   h->weighted_pred_flag = d->pps->weighted_pred_flag;
>>> +   h->f3 = d->pps->constrained_intra_pred_flag;
>>>      h->is_reference = d->is_reference;
>>>      h->interlace = d->field_pic_flag;
>>>      h->bottom_field_flag = d->bottom_field_flag;
>>>      h->f7 = 0; // TODO: figure out when set..
>>> -   h->log2_max_frame_num_minus4 = d->log2_max_frame_num_minus4;
>>> +   h->log2_max_frame_num_minus4 =
>>> d->pps->sps->log2_max_frame_num_minus4;
>>>      h->u31_45 = 1;
>>>
>>> -   h->pic_order_cnt_type = d->pic_order_cnt_type;
>>> -   h->pic_init_qp_minus26 = d->pic_init_qp_minus26;
>>> -   h->chroma_qp_index_offset = d->chroma_qp_index_offset;
>>> -   h->second_chroma_qp_index_offset = d->second_chroma_qp_index_offset;
>>> -   h->weighted_bipred_idc = d->weighted_bipred_idc;
>>> +   h->pic_order_cnt_type = d->pps->sps->pic_order_cnt_type;
>>> +   h->pic_init_qp_minus26 = d->pps->pic_init_qp_minus26;
>>> +   h->chroma_qp_index_offset = d->pps->chroma_qp_index_offset;
>>> +   h->second_chroma_qp_index_offset =
>>> d->pps->second_chroma_qp_index_offset;
>>> +   h->weighted_bipred_idc = d->pps->weighted_bipred_idc;
>>>      h->tmp_idx = 0; // set in h264_vp_refs below
>>>      h->fifo_dec_index = 0; // always set to 0 to be fifo compatible with
>>> other codecs
>>>      h->frame_number = d->frame_num;
>>> @@ -363,8 +363,8 @@ nouveau_vp3_fill_picparm_h264_vp(struct
>>> nouveau_vp3_decoder *dec,
>>>      h->field_order_cnt[0] = d->field_order_cnt[0];
>>>      h->field_order_cnt[1] = d->field_order_cnt[1];
>>>      memset(h->refs, 0, sizeof(h->refs));
>>> -   memcpy(h->m4x4, d->scaling_lists_4x4, sizeof(h->m4x4));
>>> -   memcpy(h->m8x8, d->scaling_lists_8x8, sizeof(h->m8x8));
>>> +   memcpy(h->m4x4, d->pps->ScalingList4x4, sizeof(h->m4x4));
>>> +   memcpy(h->m8x8, d->pps->ScalingList8x8, sizeof(h->m8x8));
>>>      h->u220 = 0;
>>>      for (i = 0; i < d->num_ref_frames; ++i) {
>>>         if (!d->ref[i])
>>> diff --git a/src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c
>>> b/src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c
>>> index 86047b5..de923e4 100644
>>> --- a/src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c
>>> +++ b/src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c
>>> @@ -136,7 +136,7 @@ nv84_decoder_bsp(struct nv84_decoder *dec,
>>>      params.iseqparm.chroma_format_idc = 1;
>>>
>>>      params.iseqparm.pic_width_in_mbs_minus1 = mb(dec->base.width) - 1;
>>> -   if (desc->field_pic_flag || desc->mb_adaptive_frame_field_flag)
>>> +   if (desc->field_pic_flag ||
>>> desc->pps->sps->mb_adaptive_frame_field_flag)
>>>         params.iseqparm.pic_height_in_map_units_minus1 =
>>> mb_half(dec->base.height) - 1;
>>>      else
>>>         params.iseqparm.pic_height_in_map_units_minus1 =
>>> mb(dec->base.height) - 1;
>>> @@ -162,26 +162,26 @@ nv84_decoder_bsp(struct nv84_decoder *dec,
>>>      }
>>>
>>>      params.iseqparm.num_ref_frames = desc->num_ref_frames;
>>> -   params.iseqparm.mb_adaptive_frame_field_flag =
>>> desc->mb_adaptive_frame_field_flag;
>>> -   params.ipicparm.constrained_intra_pred_flag =
>>> desc->constrained_intra_pred_flag;
>>> -   params.ipicparm.weighted_pred_flag = desc->weighted_pred_flag;
>>> -   params.ipicparm.weighted_bipred_idc = desc->weighted_bipred_idc;
>>> -   params.iseqparm.frame_mbs_only_flag = desc->frame_mbs_only_flag;
>>> -   params.ipicparm.transform_8x8_mode_flag =
>>> desc->transform_8x8_mode_flag;
>>> -   params.ipicparm.chroma_qp_index_offset =
>>> desc->chroma_qp_index_offset;
>>> -   params.ipicparm.second_chroma_qp_index_offset =
>>> desc->second_chroma_qp_index_offset;
>>> -   params.ipicparm.pic_init_qp_minus26 = desc->pic_init_qp_minus26;
>>> +   params.iseqparm.mb_adaptive_frame_field_flag =
>>> desc->pps->sps->mb_adaptive_frame_field_flag;
>>> +   params.ipicparm.constrained_intra_pred_flag =
>>> desc->pps->constrained_intra_pred_flag;
>>> +   params.ipicparm.weighted_pred_flag = desc->pps->weighted_pred_flag;
>>> +   params.ipicparm.weighted_bipred_idc = desc->pps->weighted_bipred_idc;
>>> +   params.iseqparm.frame_mbs_only_flag =
>>> desc->pps->sps->frame_mbs_only_flag;
>>> +   params.ipicparm.transform_8x8_mode_flag =
>>> desc->pps->transform_8x8_mode_flag;
>>> +   params.ipicparm.chroma_qp_index_offset =
>>> desc->pps->chroma_qp_index_offset;
>>> +   params.ipicparm.second_chroma_qp_index_offset =
>>> desc->pps->second_chroma_qp_index_offset;
>>> +   params.ipicparm.pic_init_qp_minus26 = desc->pps->pic_init_qp_minus26;
>>>      params.ipicparm.num_ref_idx_l0_active_minus1 =
>>> desc->num_ref_idx_l0_active_minus1;
>>>      params.ipicparm.num_ref_idx_l1_active_minus1 =
>>> desc->num_ref_idx_l1_active_minus1;
>>> -   params.iseqparm.log2_max_frame_num_minus4 =
>>> desc->log2_max_frame_num_minus4;
>>> -   params.iseqparm.pic_order_cnt_type = desc->pic_order_cnt_type;
>>> -   params.iseqparm.log2_max_pic_order_cnt_lsb_minus4 =
>>> desc->log2_max_pic_order_cnt_lsb_minus4;
>>> -   params.iseqparm.delta_pic_order_always_zero_flag =
>>> desc->delta_pic_order_always_zero_flag;
>>> -   params.iseqparm.direct_8x8_inference_flag =
>>> desc->direct_8x8_inference_flag;
>>> -   params.ipicparm.entropy_coding_mode_flag =
>>> desc->entropy_coding_mode_flag;
>>> -   params.ipicparm.pic_order_present_flag =
>>> desc->pic_order_present_flag;
>>> -   params.ipicparm.deblocking_filter_control_present_flag =
>>> desc->deblocking_filter_control_present_flag;
>>> -   params.ipicparm.redundant_pic_cnt_present_flag =
>>> desc->redundant_pic_cnt_present_flag;
>>> +   params.iseqparm.log2_max_frame_num_minus4 =
>>> desc->pps->sps->log2_max_frame_num_minus4;
>>> +   params.iseqparm.pic_order_cnt_type =
>>> desc->pps->sps->pic_order_cnt_type;
>>> +   params.iseqparm.log2_max_pic_order_cnt_lsb_minus4 =
>>> desc->pps->sps->log2_max_pic_order_cnt_lsb_minus4;
>>> +   params.iseqparm.delta_pic_order_always_zero_flag =
>>> desc->pps->sps->delta_pic_order_always_zero_flag;
>>> +   params.iseqparm.direct_8x8_inference_flag =
>>> desc->pps->sps->direct_8x8_inference_flag;
>>> +   params.ipicparm.entropy_coding_mode_flag =
>>> desc->pps->entropy_coding_mode_flag;
>>> +   params.ipicparm.pic_order_present_flag =
>>> desc->pps->bottom_field_pic_order_in_frame_present_flag;
>>> +   params.ipicparm.deblocking_filter_control_present_flag =
>>> desc->pps->deblocking_filter_control_present_flag;
>>> +   params.ipicparm.redundant_pic_cnt_present_flag =
>>> desc->pps->redundant_pic_cnt_present_flag;
>>>
>>>      memcpy(dec->bitstream->map, &params, sizeof(params));
>>>      for (i = 0; i < num_buffers; i++) {
>>> diff --git a/src/gallium/drivers/nouveau/nv50/nv84_video_vp.c
>>> b/src/gallium/drivers/nouveau/nv50/nv84_video_vp.c
>>> index 619aa4e..f3480b2 100644
>>> --- a/src/gallium/drivers/nouveau/nv50/nv84_video_vp.c
>>> +++ b/src/gallium/drivers/nouveau/nv50/nv84_video_vp.c
>>> @@ -90,9 +90,9 @@ nv84_decoder_vp_h264(struct nv84_decoder *dec,
>>>      memset(&param1, 0, sizeof(param1));
>>>      memset(&param2, 0, sizeof(param2));
>>>
>>> -   memcpy(&param1.scaling_lists_4x4, desc->scaling_lists_4x4,
>>> +   memcpy(&param1.scaling_lists_4x4, desc->pps->ScalingList4x4,
>>>             sizeof(param1.scaling_lists_4x4));
>>> -   memcpy(&param1.scaling_lists_8x8, desc->scaling_lists_8x8,
>>> +   memcpy(&param1.scaling_lists_8x8, desc->pps->ScalingList8x8,
>>>             sizeof(param1.scaling_lists_8x8));
>>>
>>>      param1.width = width;
>>> @@ -100,7 +100,7 @@ nv84_decoder_vp_h264(struct nv84_decoder *dec,
>>>      param1.height = param1.h2 = height;
>>>      param1.h1 = param1.h3 = align(height, 32);
>>>      param1.format = 0x3231564e; /* 'NV12' */
>>> -   param1.mb_adaptive_frame_field_flag =
>>> desc->mb_adaptive_frame_field_flag;
>>> +   param1.mb_adaptive_frame_field_flag =
>>> desc->pps->sps->mb_adaptive_frame_field_flag;
>>>      param1.field_pic_flag = desc->field_pic_flag;
>>>
>>>      param2.width = width;
>>> @@ -116,7 +116,7 @@ nv84_decoder_vp_h264(struct nv84_decoder *dec,
>>>         param2.top = desc->bottom_field_flag ? 2 : 1;
>>>         param2.bottom = desc->bottom_field_flag;
>>>      }
>>> -   param2.mb_adaptive_frame_field_flag =
>>> desc->mb_adaptive_frame_field_flag;
>>> +   param2.mb_adaptive_frame_field_flag =
>>> desc->pps->sps->mb_adaptive_frame_field_flag;
>>>      param2.is_reference = desc->is_reference;
>>>
>>>      PUSH_SPACE(push, 5 + 16 + 3 + 2 + 6 + (is_ref ? 2 : 0) + 3 + 2 + 4 +
>>> 2);
>>> diff --git a/src/gallium/drivers/radeon/radeon_uvd.c
>>> b/src/gallium/drivers/radeon/radeon_uvd.c
>>> index 6d87841..95757e3 100644
>>> --- a/src/gallium/drivers/radeon/radeon_uvd.c
>>> +++ b/src/gallium/drivers/radeon/radeon_uvd.c
>>> @@ -380,10 +380,16 @@ static struct ruvd_h264 get_h264_msg(struct
>>> ruvd_decoder *dec, struct pipe_h264_
>>>                  result.level = 41;
>>>
>>>          result.sps_info_flags = 0;
>>> -       result.sps_info_flags |= pic->direct_8x8_inference_flag << 0;
>>> -       result.sps_info_flags |= pic->mb_adaptive_frame_field_flag << 1;
>>> -       result.sps_info_flags |= pic->frame_mbs_only_flag << 2;
>>> -       result.sps_info_flags |= pic->delta_pic_order_always_zero_flag <<
>>> 3;
>>> +       result.sps_info_flags |= pic->pps->sps->direct_8x8_inference_flag
>>> << 0;
>>> +       result.sps_info_flags |=
>>> pic->pps->sps->mb_adaptive_frame_field_flag << 1;
>>> +       result.sps_info_flags |= pic->pps->sps->frame_mbs_only_flag << 2;
>>> +       result.sps_info_flags |=
>>> pic->pps->sps->delta_pic_order_always_zero_flag << 3;
>>> +
>>> +       result.bit_depth_luma_minus8 =
>>> pic->pps->sps->bit_depth_luma_minus8;
>>> +       result.bit_depth_chroma_minus8 =
>>> pic->pps->sps->bit_depth_chroma_minus8;
>>> +       result.log2_max_frame_num_minus4 =
>>> pic->pps->sps->log2_max_frame_num_minus4;
>>> +       result.pic_order_cnt_type = pic->pps->sps->pic_order_cnt_type;
>>> +       result.log2_max_pic_order_cnt_lsb_minus4 =
>>> pic->pps->sps->log2_max_pic_order_cnt_lsb_minus4;
>>>
>>>          switch (dec->base.chroma_format) {
>>>          case PIPE_VIDEO_CHROMA_FORMAT_400:
>>> @@ -401,37 +407,30 @@ static struct ruvd_h264 get_h264_msg(struct
>>> ruvd_decoder *dec, struct pipe_h264_
>>>          }
>>>
>>>          result.pps_info_flags = 0;
>>> -       result.pps_info_flags |= pic->transform_8x8_mode_flag << 0;
>>> -       result.pps_info_flags |= pic->redundant_pic_cnt_present_flag <<
>>> 1;
>>> -       result.pps_info_flags |= pic->constrained_intra_pred_flag << 2;
>>> -       result.pps_info_flags |=
>>> pic->deblocking_filter_control_present_flag << 3;
>>> -       result.pps_info_flags |= pic->weighted_bipred_idc << 4;
>>> -       result.pps_info_flags |= pic->weighted_pred_flag << 6;
>>> -       result.pps_info_flags |= pic->pic_order_present_flag << 7;
>>> -       result.pps_info_flags |= pic->entropy_coding_mode_flag << 8;
>>> -
>>> -       result.bit_depth_luma_minus8 = 0;
>>> -       result.bit_depth_chroma_minus8 = 0;
>>> -
>>> -       result.log2_max_frame_num_minus4 =
>>> pic->log2_max_frame_num_minus4;
>>> -       result.pic_order_cnt_type = pic->pic_order_cnt_type;
>>> -       result.log2_max_pic_order_cnt_lsb_minus4 =
>>> pic->log2_max_pic_order_cnt_lsb_minus4;
>>> -       result.num_ref_frames = pic->num_ref_frames;
>>> -       result.pic_init_qp_minus26 = pic->pic_init_qp_minus26;
>>> -       result.chroma_qp_index_offset = pic->chroma_qp_index_offset;
>>> -       result.second_chroma_qp_index_offset =
>>> pic->second_chroma_qp_index_offset;
>>> +       result.pps_info_flags |= pic->pps->transform_8x8_mode_flag << 0;
>>> +       result.pps_info_flags |= pic->pps->redundant_pic_cnt_present_flag
>>> << 1;
>>> +       result.pps_info_flags |= pic->pps->constrained_intra_pred_flag <<
>>> 2;
>>> +       result.pps_info_flags |=
>>> pic->pps->deblocking_filter_control_present_flag << 3;
>>> +       result.pps_info_flags |= pic->pps->weighted_bipred_idc << 4;
>>> +       result.pps_info_flags |= pic->pps->weighted_pred_flag << 6;
>>> +       result.pps_info_flags |=
>>> pic->pps->bottom_field_pic_order_in_frame_present_flag << 7;
>>> +       result.pps_info_flags |= pic->pps->entropy_coding_mode_flag << 8;
>>> +
>>> +       result.num_slice_groups_minus1 =
>>> pic->pps->num_slice_groups_minus1;
>>> +       result.slice_group_map_type = pic->pps->slice_group_map_type;
>>> +       result.slice_group_change_rate_minus1 =
>>> pic->pps->slice_group_change_rate_minus1;
>>> +       result.pic_init_qp_minus26 = pic->pps->pic_init_qp_minus26;
>>> +       result.chroma_qp_index_offset = pic->pps->chroma_qp_index_offset;
>>> +       result.second_chroma_qp_index_offset =
>>> pic->pps->second_chroma_qp_index_offset;
>>> +
>>> +       memcpy(result.scaling_list_4x4, pic->pps->ScalingList4x4, 6*16);
>>> +       memcpy(result.scaling_list_8x8, pic->pps->ScalingList8x8, 2*64);
>>>
>>> -       result.num_slice_groups_minus1 = 0;
>>> -       result.slice_group_map_type = 0;
>>> +       result.num_ref_frames = pic->num_ref_frames;
>>>
>>>          result.num_ref_idx_l0_active_minus1 =
>>> pic->num_ref_idx_l0_active_minus1;
>>>          result.num_ref_idx_l1_active_minus1 =
>>> pic->num_ref_idx_l1_active_minus1;
>>>
>>> -       result.slice_group_change_rate_minus1 = 0;
>>> -
>>> -       memcpy(result.scaling_list_4x4, pic->scaling_lists_4x4, 6*64);
>>> -       memcpy(result.scaling_list_8x8, pic->scaling_lists_8x8, 2*64);
>>> -
>>>          result.frame_num = pic->frame_num;
>>>          memcpy(result.frame_num_list, pic->frame_num_list, 4*16);
>>>          result.curr_field_order_cnt_list[0] = pic->field_order_cnt[0];
>>> diff --git a/src/gallium/include/pipe/p_video_state.h
>>> b/src/gallium/include/pipe/p_video_state.h
>>> index 1fb6ff2..c84a418 100644
>>> --- a/src/gallium/include/pipe/p_video_state.h
>>> +++ b/src/gallium/include/pipe/p_video_state.h
>>> @@ -101,6 +101,15 @@ enum pipe_mpeg12_field_select
>>>      PIPE_MPEG12_FS_SECOND_BACKWARD = 0x08
>>>   };
>>>
>>> +enum pipe_h264_slice_type
>>> +{
>>> +   PIPE_H264_SLICE_TYPE_P = 0x0,
>>> +   PIPE_H264_SLICE_TYPE_B = 0x1,
>>> +   PIPE_H264_SLICE_TYPE_I = 0x2,
>>> +   PIPE_H264_SLICE_TYPE_SP = 0x3,
>>> +   PIPE_H264_SLICE_TYPE_SI = 0x4
>>> +};
>>> +
>>>   struct pipe_picture_desc
>>>   {
>>>      enum pipe_video_profile profile;
>>> @@ -242,39 +251,70 @@ struct pipe_vc1_picture_desc
>>>      struct pipe_video_buffer *ref[2];
>>>   };
>>>
>>> -struct pipe_h264_picture_desc
>>> +struct pipe_h264_sps
>>>   {
>>> -   struct pipe_picture_desc base;
>>> -
>>> -   uint32_t slice_count;
>>> -   int32_t  field_order_cnt[2];
>>> -   bool     is_reference;
>>> -   uint32_t frame_num;
>>> -   uint8_t  field_pic_flag;
>>> -   uint8_t  bottom_field_flag;
>>> -   uint8_t  num_ref_frames;
>>> -   uint8_t  mb_adaptive_frame_field_flag;
>>> -   uint8_t  constrained_intra_pred_flag;
>>> -   uint8_t  weighted_pred_flag;
>>> -   uint8_t  weighted_bipred_idc;
>>> -   uint8_t  frame_mbs_only_flag;
>>> -   uint8_t  transform_8x8_mode_flag;
>>> -   int8_t   chroma_qp_index_offset;
>>> -   int8_t   second_chroma_qp_index_offset;
>>> -   int8_t   pic_init_qp_minus26;
>>> -   uint8_t  num_ref_idx_l0_active_minus1;
>>> -   uint8_t  num_ref_idx_l1_active_minus1;
>>> +   uint8_t  chroma_format_idc;
>>> +   uint8_t  separate_colour_plane_flag;
>>> +   uint8_t  bit_depth_luma_minus8;
>>> +   uint8_t  bit_depth_chroma_minus8;
>>> +   uint8_t  seq_scaling_matrix_present_flag;
>>> +   uint8_t  ScalingList4x4[6][16];
>>> +   uint8_t  ScalingList8x8[6][64];
>>
>> You appear to have added the ScalingList into both sps and pps, but I
>> only see it used from pps. Was this an oversight? Also, why the
>> different variable naming convention from all the other vars?
>
>
> Yes that's correct. Both the SPS and the PPS can contain a separate scaling
> list. For slice level decode (that's what the hardware is doing) you only
> need the resulting PPS list, but to create this list you need the SPS list
> as well. I used the names directly from the spec, no idea why they doesn't
> use a consistent naming convention.

OK.

>
> Do the changes to nouveau look ok to you?

Yeah, they seem fine. It was just a straight up replace of desc->field
to desc->pps(->sps)?->field right? So assuming it compiles, should be
fine. I don't have a card plugged in right now that can do h264 to
test it out for real though.

  -ilia


More information about the mesa-dev mailing list