HRESULT FFH264BuildPicParams (DXVA_PicParams_H264* pDXVAPicParams, DXVA_Qmatrix_H264* pDXVAScalingMatrix, int* nFieldType, int* nSliceType, struct AVCodecContext* pAVCtx, int nPCIVendor) { H264Context* h = (H264Context*) pAVCtx->priv_data; SPS* cur_sps; PPS* cur_pps; MpegEncContext* const s = &h->s; int field_pic_flag; HRESULT hr = E_FAIL; field_pic_flag = (h->s.picture_structure != PICT_FRAME); cur_sps = &h->sps; cur_pps = &h->pps; if (cur_sps && cur_pps) { *nFieldType = h->s.picture_structure; if (h->sps.pic_struct_present_flag) { switch (h->sei_pic_struct) { case SEI_PIC_STRUCT_TOP_FIELD: case SEI_PIC_STRUCT_TOP_BOTTOM: case SEI_PIC_STRUCT_TOP_BOTTOM_TOP: *nFieldType = PICT_TOP_FIELD; break; case SEI_PIC_STRUCT_BOTTOM_FIELD: case SEI_PIC_STRUCT_BOTTOM_TOP: case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: *nFieldType = PICT_BOTTOM_FIELD; break; case SEI_PIC_STRUCT_FRAME_DOUBLING: case SEI_PIC_STRUCT_FRAME_TRIPLING: case SEI_PIC_STRUCT_FRAME: *nFieldType = PICT_FRAME; break; } } *nSliceType = h->slice_type; if (cur_sps->mb_width==0 || cur_sps->mb_height==0) return VFW_E_INVALID_FILE_FORMAT; pDXVAPicParams->wFrameWidthInMbsMinus1 = cur_sps->mb_width - 1; // pic_width_in_mbs_minus1; pDXVAPicParams->wFrameHeightInMbsMinus1 = cur_sps->mb_height * (2 - cur_sps->frame_mbs_only_flag) - 1; // pic_height_in_map_units_minus1; pDXVAPicParams->num_ref_frames = cur_sps->ref_frame_count; // num_ref_frames; pDXVAPicParams->field_pic_flag = field_pic_flag; pDXVAPicParams->MbaffFrameFlag = (h->sps.mb_aff && (field_pic_flag==0)); pDXVAPicParams->residual_colour_transform_flag = cur_sps->residual_color_transform_flag; pDXVAPicParams->sp_for_switch_flag = h->sp_for_switch_flag; pDXVAPicParams->chroma_format_idc = cur_sps->chroma_format_idc; pDXVAPicParams->RefPicFlag = (h->nal_ref_idc != 0); pDXVAPicParams->constrained_intra_pred_flag = cur_pps->constrained_intra_pred; pDXVAPicParams->weighted_pred_flag = cur_pps->weighted_pred; pDXVAPicParams->weighted_bipred_idc = cur_pps->weighted_bipred_idc; pDXVAPicParams->frame_mbs_only_flag = cur_sps->frame_mbs_only_flag; pDXVAPicParams->transform_8x8_mode_flag = cur_pps->transform_8x8_mode; pDXVAPicParams->IntraPicFlag = (h->slice_type == FF_I_TYPE ); pDXVAPicParams->bit_depth_luma_minus8 = cur_sps->bit_depth_luma - 8; // bit_depth_luma_minus8 pDXVAPicParams->bit_depth_chroma_minus8 = cur_sps->bit_depth_chroma - 8; // bit_depth_chroma_minus8 // pDXVAPicParams->StatusReportFeedbackNumber = SET IN DecodeFrame; // pDXVAPicParams->CurrFieldOrderCnt = SET IN UpdateRefFramesList; // pDXVAPicParams->FieldOrderCntList = SET IN UpdateRefFramesList; // pDXVAPicParams->FrameNumList = SET IN UpdateRefFramesList; // pDXVAPicParams->UsedForReferenceFlags = SET IN UpdateRefFramesList; // pDXVAPicParams->NonExistingFrameFlags pDXVAPicParams->frame_num = h->frame_num; // pDXVAPicParams->SliceGroupMap pDXVAPicParams->log2_max_frame_num_minus4 = cur_sps->log2_max_frame_num - 4; // log2_max_frame_num_minus4; pDXVAPicParams->pic_order_cnt_type = cur_sps->poc_type; // pic_order_cnt_type; pDXVAPicParams->log2_max_pic_order_cnt_lsb_minus4 = cur_sps->log2_max_poc_lsb - 4; // log2_max_pic_order_cnt_lsb_minus4; pDXVAPicParams->delta_pic_order_always_zero_flag = cur_sps->delta_pic_order_always_zero_flag; pDXVAPicParams->direct_8x8_inference_flag = cur_sps->direct_8x8_inference_flag; pDXVAPicParams->entropy_coding_mode_flag = cur_pps->cabac; // entropy_coding_mode_flag; pDXVAPicParams->pic_order_present_flag = cur_pps->pic_order_present; // pic_order_present_flag; pDXVAPicParams->num_slice_groups_minus1 = cur_pps->slice_group_count - 1; // num_slice_groups_minus1; pDXVAPicParams->slice_group_map_type = cur_pps->mb_slice_group_map_type; // slice_group_map_type; pDXVAPicParams->deblocking_filter_control_present_flag = cur_pps->deblocking_filter_parameters_present; // deblocking_filter_control_present_flag; pDXVAPicParams->redundant_pic_cnt_present_flag = cur_pps->redundant_pic_cnt_present; // redundant_pic_cnt_present_flag; pDXVAPicParams->slice_group_change_rate_minus1 = cur_pps->slice_group_change_rate_minus1; pDXVAPicParams->chroma_qp_index_offset = cur_pps->chroma_qp_index_offset[0]; pDXVAPicParams->second_chroma_qp_index_offset = cur_pps->chroma_qp_index_offset[1]; pDXVAPicParams->num_ref_idx_l0_active_minus1 = cur_pps->ref_count[0]-1; // num_ref_idx_l0_active_minus1; pDXVAPicParams->num_ref_idx_l1_active_minus1 = cur_pps->ref_count[1]-1; // num_ref_idx_l1_active_minus1; pDXVAPicParams->pic_init_qp_minus26 = cur_pps->init_qp - 26; pDXVAPicParams->pic_init_qs_minus26 = cur_pps->init_qs - 26; if (field_pic_flag) { pDXVAPicParams->CurrPic.AssociatedFlag = (h->s.picture_structure == PICT_BOTTOM_FIELD); if (pDXVAPicParams->CurrPic.AssociatedFlag) { // Bottom field pDXVAPicParams->CurrFieldOrderCnt[0] = 0; pDXVAPicParams->CurrFieldOrderCnt[1] = h->poc_lsb + h->poc_msb; } else { // Top field pDXVAPicParams->CurrFieldOrderCnt[0] = h->poc_lsb + h->poc_msb; pDXVAPicParams->CurrFieldOrderCnt[1] = 0; } } else { pDXVAPicParams->CurrPic.AssociatedFlag = 0; pDXVAPicParams->CurrFieldOrderCnt[0] = h->poc_lsb + h->poc_msb; pDXVAPicParams->CurrFieldOrderCnt[1] = h->poc_lsb + h->poc_msb; } CopyScalingMatrix (pDXVAScalingMatrix, (DXVA_Qmatrix_H264*)cur_pps->scaling_matrix4, nPCIVendor); hr = S_OK; } return hr; }
HRESULT FFH264BuildPicParams(struct AVCodecContext* pAVCtx, DXVA_PicParams_H264* pDXVAPicParams, DXVA_Qmatrix_H264* pDXVAScalingMatrix, bool IsATIUVD) { H264Context* h = (H264Context*)pAVCtx->priv_data; SPS* cur_sps = &h->sps; PPS* cur_pps = &h->pps; const H264Picture *current_picture = h->cur_pic_ptr; HRESULT hr = E_FAIL; if (cur_sps && cur_pps) { if (!cur_sps->mb_width || !cur_sps->mb_height) { return hr; } int field_pic_flag = (h->picture_structure != PICT_FRAME); pDXVAPicParams->wFrameWidthInMbsMinus1 = cur_sps->mb_width - 1; pDXVAPicParams->wFrameHeightInMbsMinus1 = cur_sps->mb_height * (2 - cur_sps->frame_mbs_only_flag) - 1; pDXVAPicParams->num_ref_frames = cur_sps->ref_frame_count; pDXVAPicParams->field_pic_flag = field_pic_flag; pDXVAPicParams->MbaffFrameFlag = (h->sps.mb_aff && (field_pic_flag == 0)); pDXVAPicParams->residual_colour_transform_flag = cur_sps->residual_color_transform_flag; pDXVAPicParams->chroma_format_idc = cur_sps->chroma_format_idc; pDXVAPicParams->RefPicFlag = h->ref_pic_flag; pDXVAPicParams->constrained_intra_pred_flag = cur_pps->constrained_intra_pred; pDXVAPicParams->weighted_pred_flag = cur_pps->weighted_pred; pDXVAPicParams->weighted_bipred_idc = cur_pps->weighted_bipred_idc; pDXVAPicParams->frame_mbs_only_flag = cur_sps->frame_mbs_only_flag; pDXVAPicParams->transform_8x8_mode_flag = cur_pps->transform_8x8_mode; pDXVAPicParams->MinLumaBipredSize8x8Flag = h->sps.level_idc >= 31; pDXVAPicParams->IntraPicFlag = (h->slice_type == AV_PICTURE_TYPE_I || h->slice_type == AV_PICTURE_TYPE_SI); pDXVAPicParams->bit_depth_luma_minus8 = cur_sps->bit_depth_luma - 8; pDXVAPicParams->bit_depth_chroma_minus8 = cur_sps->bit_depth_chroma - 8; // pDXVAPicParams->StatusReportFeedbackNumber = SET IN DecodeFrame; // pDXVAPicParams->CurrFieldOrderCnt = SET IN UpdateRefFramesList; // pDXVAPicParams->FieldOrderCntList = SET IN UpdateRefFramesList; // pDXVAPicParams->FrameNumList = SET IN UpdateRefFramesList; // pDXVAPicParams->UsedForReferenceFlags = SET IN UpdateRefFramesList; // pDXVAPicParams->NonExistingFrameFlags pDXVAPicParams->frame_num = h->frame_num; pDXVAPicParams->log2_max_frame_num_minus4 = cur_sps->log2_max_frame_num - 4; pDXVAPicParams->pic_order_cnt_type = cur_sps->poc_type; pDXVAPicParams->log2_max_pic_order_cnt_lsb_minus4 = 0; pDXVAPicParams->delta_pic_order_always_zero_flag = 0; if (cur_sps->poc_type == 0) { pDXVAPicParams->log2_max_pic_order_cnt_lsb_minus4 = cur_sps->log2_max_poc_lsb - 4; } else if (cur_sps->poc_type == 1) { pDXVAPicParams->delta_pic_order_always_zero_flag = cur_sps->delta_pic_order_always_zero_flag; } pDXVAPicParams->direct_8x8_inference_flag = cur_sps->direct_8x8_inference_flag; pDXVAPicParams->entropy_coding_mode_flag = cur_pps->cabac; pDXVAPicParams->pic_order_present_flag = cur_pps->pic_order_present; pDXVAPicParams->num_slice_groups_minus1 = cur_pps->slice_group_count - 1; pDXVAPicParams->slice_group_map_type = cur_pps->mb_slice_group_map_type; pDXVAPicParams->deblocking_filter_control_present_flag = cur_pps->deblocking_filter_parameters_present; pDXVAPicParams->redundant_pic_cnt_present_flag = cur_pps->redundant_pic_cnt_present; pDXVAPicParams->chroma_qp_index_offset = cur_pps->chroma_qp_index_offset[0]; pDXVAPicParams->second_chroma_qp_index_offset = cur_pps->chroma_qp_index_offset[1]; pDXVAPicParams->num_ref_idx_l0_active_minus1 = cur_pps->ref_count[0] - 1; pDXVAPicParams->num_ref_idx_l1_active_minus1 = cur_pps->ref_count[1] - 1; pDXVAPicParams->pic_init_qp_minus26 = cur_pps->init_qp - 26; pDXVAPicParams->pic_init_qs_minus26 = cur_pps->init_qs - 26; pDXVAPicParams->CurrPic.AssociatedFlag = field_pic_flag && (h->picture_structure == PICT_BOTTOM_FIELD); pDXVAPicParams->CurrFieldOrderCnt[0] = 0; if ((h->picture_structure & PICT_TOP_FIELD) && current_picture->field_poc[0] != INT_MAX) { pDXVAPicParams->CurrFieldOrderCnt[0] = current_picture->field_poc[0]; } pDXVAPicParams->CurrFieldOrderCnt[1] = 0; if ((h->picture_structure & PICT_BOTTOM_FIELD) && current_picture->field_poc[1] != INT_MAX) { pDXVAPicParams->CurrFieldOrderCnt[1] = current_picture->field_poc[1]; } CopyScalingMatrix(pDXVAScalingMatrix, cur_pps, IsATIUVD); hr = S_OK; } return hr; }