vl: add h264 infrastructure
authorChristian König <deathsimple@vodafone.de>
Mon, 9 Jan 2012 13:48:40 +0000 (14:48 +0100)
committerChristian König <deathsimple@vodafone.de>
Sun, 15 Jan 2012 11:40:44 +0000 (12:40 +0100)
No implementation so far, just the defines for
VDPAUs picture info structure.

Signed-off-by: Christian König <deathsimple@vodafone.de>
src/gallium/include/pipe/p_video_state.h
src/gallium/state_trackers/vdpau/decode.c

index ad726d8cdfafac1d35b66cca0ee89ee3dab27784..b73c94b7a5d2df57cf8f5fdcdb927f35e9b8f36f 100644 (file)
@@ -247,6 +247,49 @@ struct pipe_vc1_picture_desc
    struct pipe_video_buffer *ref[2];
 };
 
+struct pipe_h264_picture_desc
+{
+   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  log2_max_frame_num_minus4;
+   uint8_t  pic_order_cnt_type;
+   uint8_t  log2_max_pic_order_cnt_lsb_minus4;
+   uint8_t  delta_pic_order_always_zero_flag;
+   uint8_t  direct_8x8_inference_flag;
+   uint8_t  entropy_coding_mode_flag;
+   uint8_t  pic_order_present_flag;
+   uint8_t  deblocking_filter_control_present_flag;
+   uint8_t  redundant_pic_cnt_present_flag;
+   uint8_t  scaling_lists_4x4[6][16];
+   uint8_t  scaling_lists_8x8[2][64];
+
+   bool     is_long_term[16];
+   bool     top_is_reference[16];
+   bool     bottom_is_reference[16];
+   uint32_t field_order_cnt_list[16][2];
+   uint32_t frame_num_list[16];
+
+   struct pipe_video_buffer *ref[16];
+};
+
 #ifdef __cplusplus
 }
 #endif
index 2870dc419ac56f706e97d4c14ac9eba829afadaa..d618fff1784577a9389c8a8a83e0889f622a54d5 100644 (file)
@@ -316,6 +316,66 @@ vlVdpDecoderRenderVC1(struct pipe_vc1_picture_desc *picture,
    return VDP_STATUS_OK;
 }
 
+static VdpStatus
+vlVdpDecoderRenderH264(struct pipe_h264_picture_desc *picture,
+                       VdpPictureInfoH264 *picture_info)
+{
+   unsigned i;
+
+   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding H264\n");
+
+   picture->slice_count = picture_info->slice_count;
+   picture->field_order_cnt[0] = picture_info->field_order_cnt[0];
+   picture->field_order_cnt[1] = picture_info->field_order_cnt[1];
+   picture->is_reference = picture_info->is_reference;
+   picture->frame_num = picture_info->frame_num;
+   picture->field_pic_flag = picture_info->field_pic_flag;
+   picture->bottom_field_flag = picture_info->bottom_field_flag;
+   picture->num_ref_frames = picture_info->num_ref_frames;
+   picture->mb_adaptive_frame_field_flag = picture_info->mb_adaptive_frame_field_flag;
+   picture->constrained_intra_pred_flag = picture_info->constrained_intra_pred_flag;
+   picture->weighted_pred_flag = picture_info->weighted_pred_flag;
+   picture->weighted_bipred_idc = picture_info->weighted_bipred_idc;
+   picture->frame_mbs_only_flag = picture_info->frame_mbs_only_flag;
+   picture->transform_8x8_mode_flag = picture_info->transform_8x8_mode_flag;
+   picture->chroma_qp_index_offset = picture_info->chroma_qp_index_offset;
+   picture->second_chroma_qp_index_offset = picture_info->second_chroma_qp_index_offset;
+   picture->pic_init_qp_minus26 = picture_info->pic_init_qp_minus26;
+   picture->num_ref_idx_l0_active_minus1 = picture_info->num_ref_idx_l0_active_minus1;
+   picture->num_ref_idx_l1_active_minus1 = picture_info->num_ref_idx_l1_active_minus1;
+   picture->log2_max_frame_num_minus4 = picture_info->log2_max_frame_num_minus4;
+   picture->pic_order_cnt_type = picture_info->pic_order_cnt_type;
+   picture->log2_max_pic_order_cnt_lsb_minus4 = picture_info->log2_max_pic_order_cnt_lsb_minus4;
+   picture->delta_pic_order_always_zero_flag = picture_info->delta_pic_order_always_zero_flag;
+   picture->direct_8x8_inference_flag = picture_info->direct_8x8_inference_flag;
+   picture->entropy_coding_mode_flag = picture_info->entropy_coding_mode_flag;
+   picture->pic_order_present_flag = picture_info->pic_order_present_flag;
+   picture->deblocking_filter_control_present_flag = picture_info->deblocking_filter_control_present_flag;
+   picture->redundant_pic_cnt_present_flag = picture_info->redundant_pic_cnt_present_flag;
+
+   memcpy(picture->scaling_lists_4x4, picture_info->scaling_lists_4x4, 6*16);
+   memcpy(picture->scaling_lists_8x8, picture_info->scaling_lists_8x8, 2*64);
+
+   for (i = 0; i < 16; ++i) {
+      VdpStatus ret = vlVdpGetReferenceFrame
+      (
+         picture_info->referenceFrames[i].surface,
+         &picture->ref[i]
+      );
+      if (ret != VDP_STATUS_OK)
+         return ret;
+
+      picture->is_long_term[i] = picture_info->referenceFrames[i].is_long_term;
+      picture->top_is_reference[i] = picture_info->referenceFrames[i].top_is_reference;
+      picture->bottom_is_reference[i] = picture_info->referenceFrames[i].bottom_is_reference;
+      picture->field_order_cnt_list[i][0] = picture_info->referenceFrames[i].field_order_cnt[0];
+      picture->field_order_cnt_list[i][1] = picture_info->referenceFrames[i].field_order_cnt[1];
+      picture->frame_num_list[i] = picture_info->referenceFrames[i].frame_idx;
+   }
+
+   return VDP_STATUS_OK;
+}
+
 /**
  * Decode a compressed field/frame and render the result into a VdpVideoSurface.
  */
@@ -338,6 +398,7 @@ vlVdpDecoderRender(VdpDecoder decoder,
       struct pipe_mpeg12_picture_desc mpeg12;
       struct pipe_mpeg4_picture_desc mpeg4;
       struct pipe_vc1_picture_desc vc1;
+      struct pipe_h264_picture_desc h264;
    } desc;
 
    VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding\n");
@@ -373,6 +434,9 @@ vlVdpDecoderRender(VdpDecoder decoder,
    case PIPE_VIDEO_CODEC_VC1:
       ret = vlVdpDecoderRenderVC1(&desc.vc1, (VdpPictureInfoVC1 *)picture_info);
       break;
+   case PIPE_VIDEO_CODEC_MPEG4_AVC:
+      ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info);
+      break;
    default:
       return VDP_STATUS_INVALID_DECODER_PROFILE;
    }