xref: /rockchip-linux_mpp/mpp/codec/dec/h264/h264d_fill.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka *
3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka *
5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka * You may obtain a copy of the License at
8*437bfbebSnyanmisaka *
9*437bfbebSnyanmisaka *      http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka *
11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka * limitations under the License.
16*437bfbebSnyanmisaka */
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #define MODULE_TAG "h264d_fill"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "mpp_mem.h"
24*437bfbebSnyanmisaka #include "mpp_common.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "h264d_fill.h"
27*437bfbebSnyanmisaka 
realloc_slice_list(H264dDxvaCtx_t * dxva_ctx)28*437bfbebSnyanmisaka static MPP_RET realloc_slice_list(H264dDxvaCtx_t *dxva_ctx)
29*437bfbebSnyanmisaka {
30*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka     dxva_ctx->max_slice_size += ADD_SLICE_SIZE;
33*437bfbebSnyanmisaka     dxva_ctx->slice_long = mpp_realloc(dxva_ctx->slice_long,
34*437bfbebSnyanmisaka                                        DXVA_Slice_H264_Long,
35*437bfbebSnyanmisaka                                        dxva_ctx->max_slice_size);
36*437bfbebSnyanmisaka     MEM_CHECK(ret, dxva_ctx->slice_long);
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka     return ret = MPP_OK;
39*437bfbebSnyanmisaka __FAILED:
40*437bfbebSnyanmisaka     return ret;
41*437bfbebSnyanmisaka }
42*437bfbebSnyanmisaka 
fill_slice_stream(H264dDxvaCtx_t * dxva_ctx,H264_Nalu_t * p_nal)43*437bfbebSnyanmisaka static MPP_RET fill_slice_stream(H264dDxvaCtx_t *dxva_ctx, H264_Nalu_t *p_nal)
44*437bfbebSnyanmisaka {
45*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
46*437bfbebSnyanmisaka     DXVA_Slice_H264_Long  *p_long = NULL;
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka     if (dxva_ctx->slice_count >= dxva_ctx->max_slice_size) {
49*437bfbebSnyanmisaka         FUN_CHECK(ret = realloc_slice_list(dxva_ctx));
50*437bfbebSnyanmisaka     }
51*437bfbebSnyanmisaka     p_long = &dxva_ctx->slice_long[dxva_ctx->slice_count];
52*437bfbebSnyanmisaka     memset(p_long, 0, sizeof(DXVA_Slice_H264_Long));
53*437bfbebSnyanmisaka     p_long->BSNALunitDataLocation  = dxva_ctx->strm_offset;
54*437bfbebSnyanmisaka     p_long->wBadSliceChopping  = 0; //!< set to 0 in Rock-Chip RKVDEC IP
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka     (void)p_nal;
57*437bfbebSnyanmisaka     return ret = MPP_OK;
58*437bfbebSnyanmisaka __FAILED:
59*437bfbebSnyanmisaka     return ret;
60*437bfbebSnyanmisaka }
61*437bfbebSnyanmisaka 
fill_picture_entry(DXVA_PicEntry_H264 * pic,RK_U32 index,RK_U32 flag)62*437bfbebSnyanmisaka static void fill_picture_entry(DXVA_PicEntry_H264 *pic, RK_U32 index, RK_U32 flag)
63*437bfbebSnyanmisaka {
64*437bfbebSnyanmisaka     ASSERT((index & 0x7f) == index && (flag & 0x01) == flag);
65*437bfbebSnyanmisaka     pic->bPicEntry = index | (flag << 7);
66*437bfbebSnyanmisaka }
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka /*!
70*437bfbebSnyanmisaka ***********************************************************************
71*437bfbebSnyanmisaka * \brief
72*437bfbebSnyanmisaka *    fill picture parameters
73*437bfbebSnyanmisaka ***********************************************************************
74*437bfbebSnyanmisaka */
75*437bfbebSnyanmisaka //extern "C"
fill_scanlist(H264dVideoCtx_t * p_Vid,DXVA_Qmatrix_H264 * qm)76*437bfbebSnyanmisaka void fill_scanlist(H264dVideoCtx_t *p_Vid, DXVA_Qmatrix_H264 *qm)
77*437bfbebSnyanmisaka {
78*437bfbebSnyanmisaka     RK_S32 i = 0, j = 0;
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     memset(qm, 0, sizeof(DXVA_Qmatrix_H264));
81*437bfbebSnyanmisaka     for (i = 0; i < 6; ++i) { //!< 4x4, 6 lists
82*437bfbebSnyanmisaka         for (j = 0; j < H264ScalingList4x4Length; j++) {
83*437bfbebSnyanmisaka             qm->bScalingLists4x4[i][j] = p_Vid->qmatrix[i][j];
84*437bfbebSnyanmisaka         }
85*437bfbebSnyanmisaka     }
86*437bfbebSnyanmisaka     for (i = 6; i < ((p_Vid->active_sps->chroma_format_idc != H264_CHROMA_444) ? 8 : 12); ++i) {
87*437bfbebSnyanmisaka         for (j = 0; j < H264ScalingList8x8Length; j++) {
88*437bfbebSnyanmisaka             qm->bScalingLists8x8[i - 6][j] = p_Vid->qmatrix[i][j];
89*437bfbebSnyanmisaka         }
90*437bfbebSnyanmisaka     }
91*437bfbebSnyanmisaka }
92*437bfbebSnyanmisaka /*!
93*437bfbebSnyanmisaka ***********************************************************************
94*437bfbebSnyanmisaka * \brief
95*437bfbebSnyanmisaka *    fill picture parameters
96*437bfbebSnyanmisaka ***********************************************************************
97*437bfbebSnyanmisaka */
98*437bfbebSnyanmisaka //extern "C"
fill_picparams(H264dVideoCtx_t * p_Vid,DXVA_PicParams_H264_MVC * pp)99*437bfbebSnyanmisaka void fill_picparams(H264dVideoCtx_t *p_Vid, DXVA_PicParams_H264_MVC *pp)
100*437bfbebSnyanmisaka {
101*437bfbebSnyanmisaka     RK_U32 i = 0, j = 0;
102*437bfbebSnyanmisaka     H264_StorePic_t *dec_pic = p_Vid->dec_pic;
103*437bfbebSnyanmisaka     H264_DpbInfo_t *dpb_info = p_Vid->p_Dec->dpb_info;
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka     // memset(pp, 0, sizeof(DXVA_PicParams_H264_MVC));
106*437bfbebSnyanmisaka     //!< Configure current picture
107*437bfbebSnyanmisaka     fill_picture_entry(&pp->CurrPic, dec_pic->mem_mark->slot_idx, dec_pic->structure == BOTTOM_FIELD);
108*437bfbebSnyanmisaka     //!< Configure the set of references
109*437bfbebSnyanmisaka     pp->UsedForReferenceFlags = 0;
110*437bfbebSnyanmisaka     pp->NonExistingFrameFlags = 0;
111*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(pp->RefFrameList); i++) {
112*437bfbebSnyanmisaka         if (dpb_info[i].refpic) {
113*437bfbebSnyanmisaka             fill_picture_entry(&pp->RefFrameList[i], dpb_info[i].slot_index, dpb_info[i].is_long_term);
114*437bfbebSnyanmisaka             pp->FieldOrderCntList[i][0] = dpb_info[i].TOP_POC;
115*437bfbebSnyanmisaka             pp->FieldOrderCntList[i][1] = dpb_info[i].BOT_POC;
116*437bfbebSnyanmisaka             pp->FrameNumList[i] = dpb_info[i].is_long_term ? dpb_info[i].long_term_frame_idx : dpb_info[i].frame_num;
117*437bfbebSnyanmisaka             pp->LongTermPicNumList[i] = dpb_info[i].long_term_pic_num;
118*437bfbebSnyanmisaka             if (dpb_info[i].is_used & 0x01) { //!< top_field
119*437bfbebSnyanmisaka                 pp->UsedForReferenceFlags |= 1 << (2 * i + 0);
120*437bfbebSnyanmisaka             }
121*437bfbebSnyanmisaka             if (dpb_info[i].is_used & 0x02) { //!< bot_field
122*437bfbebSnyanmisaka                 pp->UsedForReferenceFlags |= 1 << (2 * i + 1);
123*437bfbebSnyanmisaka             }
124*437bfbebSnyanmisaka         } else {
125*437bfbebSnyanmisaka             pp->RefFrameList[i].bPicEntry = 0xff;
126*437bfbebSnyanmisaka             pp->FieldOrderCntList[i][0]   = 0;
127*437bfbebSnyanmisaka             pp->FieldOrderCntList[i][1]   = 0;
128*437bfbebSnyanmisaka             pp->FrameNumList[i]           = 0;
129*437bfbebSnyanmisaka         }
130*437bfbebSnyanmisaka     }
131*437bfbebSnyanmisaka 
132*437bfbebSnyanmisaka     pp->spspps_update = p_Vid->spspps_update;
133*437bfbebSnyanmisaka     if (pp->spspps_update) {
134*437bfbebSnyanmisaka         pp->wFrameWidthInMbsMinus1         = p_Vid->active_sps->pic_width_in_mbs_minus1;
135*437bfbebSnyanmisaka         pp->wFrameHeightInMbsMinus1        = p_Vid->active_sps->pic_height_in_map_units_minus1;
136*437bfbebSnyanmisaka         pp->num_ref_frames                 = p_Vid->active_sps->max_num_ref_frames;
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka         pp->residual_colour_transform_flag = 0;
139*437bfbebSnyanmisaka         pp->sp_for_switch_flag             = 0;
140*437bfbebSnyanmisaka         pp->chroma_format_idc              = p_Vid->active_sps->chroma_format_idc;
141*437bfbebSnyanmisaka         pp->constrained_intra_pred_flag    = p_Vid->active_pps->constrained_intra_pred_flag;
142*437bfbebSnyanmisaka         pp->weighted_pred_flag             = p_Vid->active_pps->weighted_pred_flag;
143*437bfbebSnyanmisaka         pp->weighted_bipred_idc            = p_Vid->active_pps->weighted_bipred_idc;
144*437bfbebSnyanmisaka         pp->MbsConsecutiveFlag             = 1;
145*437bfbebSnyanmisaka         pp->frame_mbs_only_flag            = p_Vid->active_sps->frame_mbs_only_flag;
146*437bfbebSnyanmisaka         pp->transform_8x8_mode_flag        = p_Vid->active_pps->transform_8x8_mode_flag;
147*437bfbebSnyanmisaka         pp->MinLumaBipredSize8x8Flag       = (p_Vid->active_sps->level_idc >= 31);
148*437bfbebSnyanmisaka         pp->IntraPicFlag                   = 1; //(Modified if we detect a non-intra slice in dxva2_h264_decode_slice)
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka         pp->bit_depth_luma_minus8          = p_Vid->active_sps->bit_depth_luma_minus8;
151*437bfbebSnyanmisaka         pp->bit_depth_chroma_minus8        = p_Vid->active_sps->bit_depth_chroma_minus8;
152*437bfbebSnyanmisaka         pp->Reserved16Bits                 = 3;  //!< FIXME is there a way to detect the right mode
153*437bfbebSnyanmisaka 
154*437bfbebSnyanmisaka         pp->StatusReportFeedbackNumber     = 1 /*+ ctx->report_id++*/;
155*437bfbebSnyanmisaka     }
156*437bfbebSnyanmisaka     pp->MbaffFrameFlag = dec_pic->mb_aff_frame_flag;
157*437bfbebSnyanmisaka     pp->field_pic_flag = (dec_pic->iCodingType == FIELD_CODING);
158*437bfbebSnyanmisaka     pp->RefPicFlag     = dec_pic->used_for_reference;
159*437bfbebSnyanmisaka     //!< for current poc
160*437bfbebSnyanmisaka     pp->CurrFieldOrderCnt[0] = 0;
161*437bfbebSnyanmisaka     if (dec_pic->structure == TOP_FIELD || dec_pic->structure == FRAME) {
162*437bfbebSnyanmisaka         pp->CurrFieldOrderCnt[0] = dec_pic->top_poc;
163*437bfbebSnyanmisaka     }
164*437bfbebSnyanmisaka     pp->CurrFieldOrderCnt[1] = 0;
165*437bfbebSnyanmisaka     if (dec_pic->structure == BOTTOM_FIELD || dec_pic->structure == FRAME) {
166*437bfbebSnyanmisaka         pp->CurrFieldOrderCnt[1] = dec_pic->bottom_poc;
167*437bfbebSnyanmisaka     }
168*437bfbebSnyanmisaka     pp->frame_num = dec_pic->frame_num;
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka     if (pp->spspps_update) {
171*437bfbebSnyanmisaka         pp->pic_init_qs_minus26           = p_Vid->active_pps->pic_init_qs_minus26;
172*437bfbebSnyanmisaka         pp->chroma_qp_index_offset        = p_Vid->active_pps->chroma_qp_index_offset;
173*437bfbebSnyanmisaka         pp->second_chroma_qp_index_offset = p_Vid->active_pps->second_chroma_qp_index_offset;
174*437bfbebSnyanmisaka         pp->ContinuationFlag              = 1;
175*437bfbebSnyanmisaka         pp->pic_init_qp_minus26           = p_Vid->active_pps->pic_init_qp_minus26;
176*437bfbebSnyanmisaka         pp->num_ref_idx_l0_active_minus1  = p_Vid->active_pps->num_ref_idx_l0_default_active_minus1;
177*437bfbebSnyanmisaka         pp->num_ref_idx_l1_active_minus1  = p_Vid->active_pps->num_ref_idx_l1_default_active_minus1;
178*437bfbebSnyanmisaka         pp->Reserved8BitsA                = 0;
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka         pp->log2_max_frame_num_minus4     = p_Vid->active_sps->log2_max_frame_num_minus4;
181*437bfbebSnyanmisaka         pp->pic_order_cnt_type            = p_Vid->active_sps->pic_order_cnt_type;
182*437bfbebSnyanmisaka         if (pp->pic_order_cnt_type == 0) {
183*437bfbebSnyanmisaka             pp->log2_max_pic_order_cnt_lsb_minus4 = p_Vid->active_sps->log2_max_pic_order_cnt_lsb_minus4;
184*437bfbebSnyanmisaka         } else if (pp->pic_order_cnt_type == 1) {
185*437bfbebSnyanmisaka             pp->delta_pic_order_always_zero_flag = p_Vid->active_sps->delta_pic_order_always_zero_flag;
186*437bfbebSnyanmisaka         }
187*437bfbebSnyanmisaka         pp->direct_8x8_inference_flag              = p_Vid->active_sps->direct_8x8_inference_flag;
188*437bfbebSnyanmisaka         pp->entropy_coding_mode_flag               = p_Vid->active_pps->entropy_coding_mode_flag;
189*437bfbebSnyanmisaka         pp->pic_order_present_flag                 = p_Vid->active_pps->bottom_field_pic_order_in_frame_present_flag;
190*437bfbebSnyanmisaka         pp->num_slice_groups_minus1                = p_Vid->active_pps->num_slice_groups_minus1;
191*437bfbebSnyanmisaka         pp->slice_group_map_type                   = p_Vid->active_pps->slice_group_map_type;
192*437bfbebSnyanmisaka         pp->deblocking_filter_control_present_flag = p_Vid->active_pps->deblocking_filter_control_present_flag;
193*437bfbebSnyanmisaka         pp->redundant_pic_cnt_present_flag         = p_Vid->active_pps->redundant_pic_cnt_present_flag;
194*437bfbebSnyanmisaka         pp->Reserved8BitsB                         = 0;
195*437bfbebSnyanmisaka         /* FMO is not implemented and is not implemented by FF neither */
196*437bfbebSnyanmisaka         pp->slice_group_change_rate_minus1         = 0;
197*437bfbebSnyanmisaka     }
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka     //!< scaleing list flag
200*437bfbebSnyanmisaka     if (p_Vid->active_pps->pic_scaling_matrix_present_flag
201*437bfbebSnyanmisaka         || p_Vid->active_sps->seq_scaling_matrix_present_flag) {
202*437bfbebSnyanmisaka         pp->scaleing_list_enable_flag = 1;
203*437bfbebSnyanmisaka     } else {
204*437bfbebSnyanmisaka         pp->scaleing_list_enable_flag = 0;
205*437bfbebSnyanmisaka     }
206*437bfbebSnyanmisaka 
207*437bfbebSnyanmisaka     //!< add in Rock-chip RKVDEC IP
208*437bfbebSnyanmisaka     pp->RefPicFiledFlags = 0;
209*437bfbebSnyanmisaka     pp->RefPicColmvUsedFlags = 0;
210*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(pp->RefFrameList); i++) {
211*437bfbebSnyanmisaka         if (dpb_info[i].refpic) {
212*437bfbebSnyanmisaka             if (dpb_info[i].colmv_is_used) {
213*437bfbebSnyanmisaka                 pp->RefPicColmvUsedFlags |= 1 << i;
214*437bfbebSnyanmisaka             }
215*437bfbebSnyanmisaka             if (dpb_info[i].field_flag) {
216*437bfbebSnyanmisaka                 pp->RefPicFiledFlags |= 1 << i;
217*437bfbebSnyanmisaka             }
218*437bfbebSnyanmisaka         }
219*437bfbebSnyanmisaka     }
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka     //!< Following are H.264 MVC Specific parameters
222*437bfbebSnyanmisaka     if (p_Vid->active_subsps) {
223*437bfbebSnyanmisaka         RK_S32 num_views = 0;
224*437bfbebSnyanmisaka         pp->num_views_minus1 = p_Vid->active_subsps->num_views_minus1;
225*437bfbebSnyanmisaka         num_views = 1 + pp->num_views_minus1;
226*437bfbebSnyanmisaka         ASSERT(num_views <= 16);
227*437bfbebSnyanmisaka         ASSERT(num_views >= 0);
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka         for (i = 0; i < (RK_U32)num_views; i++) {
230*437bfbebSnyanmisaka             pp->view_id[i] = p_Vid->active_subsps->view_id[i];
231*437bfbebSnyanmisaka             pp->num_anchor_refs_l0[i] = p_Vid->active_subsps->num_anchor_refs_l0[i];
232*437bfbebSnyanmisaka             for (j = 0; j < pp->num_anchor_refs_l0[i]; j++) {
233*437bfbebSnyanmisaka                 pp->anchor_ref_l0[i][j] = p_Vid->active_subsps->anchor_ref_l0[i][j];
234*437bfbebSnyanmisaka             }
235*437bfbebSnyanmisaka             pp->num_anchor_refs_l1[i] = p_Vid->active_subsps->num_anchor_refs_l1[i];
236*437bfbebSnyanmisaka             for (j = 0; j < pp->num_anchor_refs_l1[i]; j++) {
237*437bfbebSnyanmisaka                 pp->anchor_ref_l1[i][j] = p_Vid->active_subsps->anchor_ref_l1[i][j];
238*437bfbebSnyanmisaka             }
239*437bfbebSnyanmisaka             pp->num_non_anchor_refs_l0[i] = p_Vid->active_subsps->num_non_anchor_refs_l0[i];
240*437bfbebSnyanmisaka             for (j = 0; j < pp->num_non_anchor_refs_l0[i]; j++) {
241*437bfbebSnyanmisaka                 pp->non_anchor_ref_l0[i][j] = p_Vid->active_subsps->non_anchor_ref_l0[i][j];
242*437bfbebSnyanmisaka             }
243*437bfbebSnyanmisaka             pp->num_non_anchor_refs_l1[i] = p_Vid->active_subsps->num_non_anchor_refs_l1[i];
244*437bfbebSnyanmisaka             for (j = 0; j < pp->num_non_anchor_refs_l1[i]; j++) {
245*437bfbebSnyanmisaka                 pp->non_anchor_ref_l1[i][j] = p_Vid->active_subsps->non_anchor_ref_l1[i][j];
246*437bfbebSnyanmisaka             }
247*437bfbebSnyanmisaka         }
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka         for (i = num_views; i < 16; i++)
250*437bfbebSnyanmisaka             pp->view_id[i] = 0xffff;
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka         pp->curr_view_id = dec_pic->view_id;
253*437bfbebSnyanmisaka         pp->anchor_pic_flag = dec_pic->anchor_pic_flag;
254*437bfbebSnyanmisaka         pp->inter_view_flag = dec_pic->inter_view_flag;
255*437bfbebSnyanmisaka         for (i = 0; i < 16; i++) {
256*437bfbebSnyanmisaka             pp->ViewIDList[i] = dpb_info[i].view_id;
257*437bfbebSnyanmisaka         }
258*437bfbebSnyanmisaka         //!< add in Rock-chip RKVDEC IP
259*437bfbebSnyanmisaka         pp->curr_layer_id = dec_pic->layer_id;
260*437bfbebSnyanmisaka         pp->UsedForInTerviewflags = 0;
261*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(pp->RefFrameList); i++) {
262*437bfbebSnyanmisaka             if (dpb_info[i].is_ilt_flag) {
263*437bfbebSnyanmisaka                 pp->UsedForInTerviewflags |= 1 << i;
264*437bfbebSnyanmisaka             }
265*437bfbebSnyanmisaka             pp->RefPicLayerIdList[i] = dpb_info[i].voidx;
266*437bfbebSnyanmisaka         }
267*437bfbebSnyanmisaka     } else {
268*437bfbebSnyanmisaka         pp->num_views_minus1 = 0;
269*437bfbebSnyanmisaka         pp->curr_layer_id = dec_pic->layer_id;
270*437bfbebSnyanmisaka         memset(pp->view_id, 0, sizeof(pp->view_id));
271*437bfbebSnyanmisaka         memset(pp->ViewIDList, 0, sizeof(pp->ViewIDList));
272*437bfbebSnyanmisaka         memset(pp->RefPicLayerIdList, 0, sizeof(pp->RefPicLayerIdList));
273*437bfbebSnyanmisaka     }
274*437bfbebSnyanmisaka 
275*437bfbebSnyanmisaka     p_Vid->spspps_update = 0;
276*437bfbebSnyanmisaka 
277*437bfbebSnyanmisaka     //!< for fpga test
278*437bfbebSnyanmisaka     pp->seq_parameter_set_id        = p_Vid->active_sps->seq_parameter_set_id;
279*437bfbebSnyanmisaka     pp->pps_seq_parameter_set_id    = p_Vid->active_pps->seq_parameter_set_id;
280*437bfbebSnyanmisaka     pp->pps_pic_parameter_set_id    = p_Vid->active_pps->pic_parameter_set_id;
281*437bfbebSnyanmisaka     pp->profile_idc                 = p_Vid->active_sps->profile_idc;
282*437bfbebSnyanmisaka     pp->constraint_set3_flag        = p_Vid->active_sps->constrained_set3_flag;
283*437bfbebSnyanmisaka     pp->qpprime_y_zero_transform_bypass_flag = p_Vid->active_sps->qpprime_y_zero_transform_bypass_flag;;
284*437bfbebSnyanmisaka     pp->mvc_extension_enable        = p_Vid->active_subsps ? 1 : 0;
285*437bfbebSnyanmisaka }
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka /*!
288*437bfbebSnyanmisaka ***********************************************************************
289*437bfbebSnyanmisaka * \brief
290*437bfbebSnyanmisaka *    fill slice short struct
291*437bfbebSnyanmisaka ***********************************************************************
292*437bfbebSnyanmisaka */
293*437bfbebSnyanmisaka //extern "C"
fill_slice_syntax(H264_SLICE_t * currSlice,H264dDxvaCtx_t * dxva_ctx)294*437bfbebSnyanmisaka MPP_RET fill_slice_syntax(H264_SLICE_t *currSlice, H264dDxvaCtx_t *dxva_ctx)
295*437bfbebSnyanmisaka {
296*437bfbebSnyanmisaka     RK_U32 list = 0, i = 0;
297*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
298*437bfbebSnyanmisaka     DXVA_Slice_H264_Long *p_long  = NULL;
299*437bfbebSnyanmisaka     RK_S32 dpb_idx = 0, dpb_valid = 0, bottom_flag = 0;
300*437bfbebSnyanmisaka 
301*437bfbebSnyanmisaka     FUN_CHECK(ret = fill_slice_stream(dxva_ctx, &currSlice->p_Cur->nalu));
302*437bfbebSnyanmisaka     p_long  = &dxva_ctx->slice_long[dxva_ctx->slice_count];
303*437bfbebSnyanmisaka     //!< fill slice long contents
304*437bfbebSnyanmisaka     p_long->first_mb_in_slice = currSlice->start_mb_nr;
305*437bfbebSnyanmisaka     p_long->NumMbsForSlice = 0;       //!< XXX it is set once we have all slices
306*437bfbebSnyanmisaka     p_long->slice_type = currSlice->slice_type;
307*437bfbebSnyanmisaka     p_long->num_ref_idx_l0_active_minus1 = currSlice->active_pps->num_ref_idx_l0_default_active_minus1;
308*437bfbebSnyanmisaka     p_long->num_ref_idx_l1_active_minus1 = currSlice->active_pps->num_ref_idx_l1_default_active_minus1;
309*437bfbebSnyanmisaka     p_long->redundant_pic_cnt = currSlice->redundant_pic_cnt;
310*437bfbebSnyanmisaka     p_long->direct_spatial_mv_pred_flag = currSlice->direct_spatial_mv_pred_flag;
311*437bfbebSnyanmisaka     p_long->slice_id = dxva_ctx->slice_count;
312*437bfbebSnyanmisaka     //!< add parameters
313*437bfbebSnyanmisaka     p_long->active_sps_id = currSlice->active_sps->seq_parameter_set_id;
314*437bfbebSnyanmisaka     p_long->active_pps_id = currSlice->active_pps->pic_parameter_set_id;
315*437bfbebSnyanmisaka     p_long->idr_pic_id = currSlice->idr_pic_id;
316*437bfbebSnyanmisaka     p_long->idr_flag = currSlice->idr_flag;
317*437bfbebSnyanmisaka     p_long->drpm_used_bitlen = currSlice->drpm_used_bitlen;
318*437bfbebSnyanmisaka     p_long->poc_used_bitlen = currSlice->poc_used_bitlen;
319*437bfbebSnyanmisaka     p_long->nal_ref_idc = currSlice->nal_reference_idc;
320*437bfbebSnyanmisaka     p_long->profileIdc = currSlice->active_sps->profile_idc;
321*437bfbebSnyanmisaka 
322*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(p_long->RefPicList[0]); i++) {
323*437bfbebSnyanmisaka         dpb_idx = currSlice->p_Dec->refpic_info_p[i].dpb_idx;
324*437bfbebSnyanmisaka         dpb_valid = currSlice->p_Dec->refpic_info_p[i].valid;
325*437bfbebSnyanmisaka         //dpb_valid = (currSlice->p_Dec->dpb_info[dpb_idx].refpic ? 1 : 0);
326*437bfbebSnyanmisaka         if (dpb_valid) {
327*437bfbebSnyanmisaka             bottom_flag = currSlice->p_Dec->refpic_info_p[i].bottom_flag;
328*437bfbebSnyanmisaka             fill_picture_entry(&p_long->RefPicList[0][i], dpb_idx, bottom_flag);
329*437bfbebSnyanmisaka         } else {
330*437bfbebSnyanmisaka             p_long->RefPicList[0][i].bPicEntry = 0xff;
331*437bfbebSnyanmisaka         }
332*437bfbebSnyanmisaka     }
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka     for (list = 0; list < 2; list++) {
335*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(p_long->RefPicList[list + 1]); i++) {
336*437bfbebSnyanmisaka             dpb_idx = currSlice->p_Dec->refpic_info_b[list][i].dpb_idx;
337*437bfbebSnyanmisaka             dpb_valid = currSlice->p_Dec->refpic_info_b[list][i].valid;
338*437bfbebSnyanmisaka             //dpb_valid = (currSlice->p_Dec->dpb_info[dpb_idx].refpic ? 1 : 0);
339*437bfbebSnyanmisaka             if (dpb_valid) {
340*437bfbebSnyanmisaka                 bottom_flag = currSlice->p_Dec->refpic_info_b[list][i].bottom_flag;
341*437bfbebSnyanmisaka                 fill_picture_entry(&p_long->RefPicList[list + 1][i], dpb_idx, bottom_flag);
342*437bfbebSnyanmisaka             } else {
343*437bfbebSnyanmisaka                 p_long->RefPicList[list + 1][i].bPicEntry = 0xff;
344*437bfbebSnyanmisaka             }
345*437bfbebSnyanmisaka         }
346*437bfbebSnyanmisaka     }
347*437bfbebSnyanmisaka     dxva_ctx->slice_count++;
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka     return ret = MPP_OK;
350*437bfbebSnyanmisaka __FAILED:
351*437bfbebSnyanmisaka     return ret;
352*437bfbebSnyanmisaka }
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka 
355*437bfbebSnyanmisaka /*!
356*437bfbebSnyanmisaka ***********************************************************************
357*437bfbebSnyanmisaka * \brief
358*437bfbebSnyanmisaka *    check parser is end and then configure register
359*437bfbebSnyanmisaka ***********************************************************************
360*437bfbebSnyanmisaka */
361*437bfbebSnyanmisaka //extern "C"
commit_buffer(H264dDxvaCtx_t * dxva_ctx)362*437bfbebSnyanmisaka void commit_buffer(H264dDxvaCtx_t *dxva_ctx)
363*437bfbebSnyanmisaka {
364*437bfbebSnyanmisaka     H264dSyntax_t *p_syn = &dxva_ctx->syn;
365*437bfbebSnyanmisaka     DXVA2_DecodeBufferDesc *p_dec = NULL;
366*437bfbebSnyanmisaka 
367*437bfbebSnyanmisaka     p_syn->num = 0;
368*437bfbebSnyanmisaka     //!< commit picture paramters
369*437bfbebSnyanmisaka     p_dec = &p_syn->buf[p_syn->num++];
370*437bfbebSnyanmisaka     memset(p_dec, 0, sizeof(DXVA2_DecodeBufferDesc));
371*437bfbebSnyanmisaka     p_dec->CompressedBufferType = DXVA2_PictureParametersBufferType;
372*437bfbebSnyanmisaka     p_dec->pvPVPState = (void *)&dxva_ctx->pp;
373*437bfbebSnyanmisaka     p_dec->DataSize = sizeof(DXVA_PicParams_H264_MVC);
374*437bfbebSnyanmisaka     p_dec->NumMBsInBuffer = 0;
375*437bfbebSnyanmisaka     //!< commit scanlist Qmatrix
376*437bfbebSnyanmisaka     p_dec = &p_syn->buf[p_syn->num++];
377*437bfbebSnyanmisaka     memset(p_dec, 0, sizeof(DXVA2_DecodeBufferDesc));
378*437bfbebSnyanmisaka     p_dec->CompressedBufferType = DXVA2_InverseQuantizationMatrixBufferType;
379*437bfbebSnyanmisaka     p_dec->pvPVPState = (void *)&dxva_ctx->qm;
380*437bfbebSnyanmisaka     p_dec->DataSize = sizeof(DXVA_Qmatrix_H264);
381*437bfbebSnyanmisaka     p_dec->NumMBsInBuffer = 0;
382*437bfbebSnyanmisaka     //!< commit bitstream
383*437bfbebSnyanmisaka     p_dec = &p_syn->buf[p_syn->num++];
384*437bfbebSnyanmisaka     memset(p_dec, 0, sizeof(DXVA2_DecodeBufferDesc));
385*437bfbebSnyanmisaka     p_dec->CompressedBufferType = DXVA2_BitStreamDateBufferType;
386*437bfbebSnyanmisaka     p_dec->DataSize = MPP_ALIGN(dxva_ctx->strm_offset, 16);
387*437bfbebSnyanmisaka     memset(dxva_ctx->bitstream + dxva_ctx->strm_offset, 0, p_dec->DataSize - dxva_ctx->strm_offset);
388*437bfbebSnyanmisaka     p_dec->pvPVPState = (void *)dxva_ctx->bitstream;
389*437bfbebSnyanmisaka     //!< commit slice control, DXVA_Slice_H264_Long
390*437bfbebSnyanmisaka     p_dec = &p_syn->buf[p_syn->num++];
391*437bfbebSnyanmisaka     memset(p_dec, 0, sizeof(DXVA2_DecodeBufferDesc));
392*437bfbebSnyanmisaka     p_dec->CompressedBufferType = DXVA2_SliceControlBufferType;
393*437bfbebSnyanmisaka     p_dec->NumMBsInBuffer = (dxva_ctx->pp.wFrameHeightInMbsMinus1 + 1)
394*437bfbebSnyanmisaka                             * (dxva_ctx->pp.wFrameWidthInMbsMinus1 + 1);
395*437bfbebSnyanmisaka     p_dec->pvPVPState = dxva_ctx->slice_long;
396*437bfbebSnyanmisaka     p_dec->DataSize   = dxva_ctx->slice_count * sizeof(DXVA_Slice_H264_Long);
397*437bfbebSnyanmisaka 
398*437bfbebSnyanmisaka     //!< reset dxva parameters
399*437bfbebSnyanmisaka     dxva_ctx->slice_count = 0;
400*437bfbebSnyanmisaka     dxva_ctx->strm_offset = 0;
401*437bfbebSnyanmisaka }
402