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 /*
19*437bfbebSnyanmisaka * @file h265d_parser2_syntax.c
20*437bfbebSnyanmisaka * @brief
21*437bfbebSnyanmisaka * @author csy(csy@rock-chips.com)
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisaka * @version 1.0.0
24*437bfbebSnyanmisaka * @history
25*437bfbebSnyanmisaka * 2015.7.15 : Create
26*437bfbebSnyanmisaka */
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka #define MODULE_TAG "H265SYNATX"
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka #include "h265d_parser.h"
31*437bfbebSnyanmisaka #include "h265d_syntax.h"
32*437bfbebSnyanmisaka
33*437bfbebSnyanmisaka
fill_picture_entry(DXVA_PicEntry_HEVC * pic,unsigned index,unsigned flag)34*437bfbebSnyanmisaka static void fill_picture_entry(DXVA_PicEntry_HEVC *pic,
35*437bfbebSnyanmisaka unsigned index, unsigned flag)
36*437bfbebSnyanmisaka {
37*437bfbebSnyanmisaka mpp_assert((index & 0x7f) == index && (flag & 0x01) == flag);
38*437bfbebSnyanmisaka pic->bPicEntry = index | (flag << 7);
39*437bfbebSnyanmisaka }
40*437bfbebSnyanmisaka
get_refpic_index(const DXVA_PicParams_HEVC * pp,int surface_index)41*437bfbebSnyanmisaka static RK_S32 get_refpic_index(const DXVA_PicParams_HEVC *pp, int surface_index)
42*437bfbebSnyanmisaka {
43*437bfbebSnyanmisaka RK_U32 i;
44*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(pp->RefPicList); i++) {
45*437bfbebSnyanmisaka if ((pp->RefPicList[i].bPicEntry & 0x7f) == surface_index) {
46*437bfbebSnyanmisaka //mpp_err("retun %d slot_index = %d",i,surface_index);
47*437bfbebSnyanmisaka return i;
48*437bfbebSnyanmisaka }
49*437bfbebSnyanmisaka }
50*437bfbebSnyanmisaka return 0xff;
51*437bfbebSnyanmisaka }
52*437bfbebSnyanmisaka
fill_picture_parameters(const HEVCContext * h,DXVA_PicParams_HEVC * pp)53*437bfbebSnyanmisaka static void fill_picture_parameters(const HEVCContext *h,
54*437bfbebSnyanmisaka DXVA_PicParams_HEVC *pp)
55*437bfbebSnyanmisaka {
56*437bfbebSnyanmisaka const HEVCFrame *current_picture = h->ref;
57*437bfbebSnyanmisaka const HEVCPPS *pps = (HEVCPPS *)h->pps_list[h->sh.pps_id];
58*437bfbebSnyanmisaka const HEVCSPS *sps = (HEVCSPS *)h->sps_list[pps->sps_id];
59*437bfbebSnyanmisaka const ShortTermRPS *src_rps = sps->st_rps;
60*437bfbebSnyanmisaka Short_SPS_RPS_HEVC *dst_rps = pp->sps_st_rps;
61*437bfbebSnyanmisaka const ShortTermRPS *cur_src_rps = h->sh.short_term_rps;
62*437bfbebSnyanmisaka Short_SPS_RPS_HEVC *cur_dst_rps = &pp->cur_st_rps;
63*437bfbebSnyanmisaka
64*437bfbebSnyanmisaka RK_U32 i, j;
65*437bfbebSnyanmisaka RK_U32 rps_used[16];
66*437bfbebSnyanmisaka RK_U32 nb_rps_used;
67*437bfbebSnyanmisaka
68*437bfbebSnyanmisaka memset(pp, 0, sizeof(*pp));
69*437bfbebSnyanmisaka
70*437bfbebSnyanmisaka pp->PicWidthInMinCbsY = sps->min_cb_width;
71*437bfbebSnyanmisaka pp->PicHeightInMinCbsY = sps->min_cb_height;
72*437bfbebSnyanmisaka pp->pps_id = h->sh.pps_id;
73*437bfbebSnyanmisaka pp->sps_id = pps->sps_id;
74*437bfbebSnyanmisaka pp->vps_id = sps->vps_id;
75*437bfbebSnyanmisaka
76*437bfbebSnyanmisaka pp->wFormatAndSequenceInfoFlags = (sps->chroma_format_idc << 0) |
77*437bfbebSnyanmisaka (sps->separate_colour_plane_flag << 2) |
78*437bfbebSnyanmisaka ((sps->bit_depth - 8) << 3) |
79*437bfbebSnyanmisaka ((sps->bit_depth - 8) << 6) |
80*437bfbebSnyanmisaka ((sps->log2_max_poc_lsb - 4) << 9) |
81*437bfbebSnyanmisaka (0 << 13) |
82*437bfbebSnyanmisaka (0 << 14) |
83*437bfbebSnyanmisaka (0 << 15);
84*437bfbebSnyanmisaka
85*437bfbebSnyanmisaka fill_picture_entry(&pp->CurrPic, current_picture->slot_index, 0);
86*437bfbebSnyanmisaka
87*437bfbebSnyanmisaka pp->sps_max_dec_pic_buffering_minus1 = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering - 1;
88*437bfbebSnyanmisaka pp->log2_min_luma_coding_block_size_minus3 = sps->log2_min_cb_size - 3;
89*437bfbebSnyanmisaka pp->log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_coding_block_size;
90*437bfbebSnyanmisaka pp->log2_min_transform_block_size_minus2 = sps->log2_min_tb_size - 2;
91*437bfbebSnyanmisaka pp->log2_diff_max_min_transform_block_size = sps->log2_max_trafo_size - sps->log2_min_tb_size;
92*437bfbebSnyanmisaka pp->max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter;
93*437bfbebSnyanmisaka pp->max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra;
94*437bfbebSnyanmisaka pp->num_short_term_ref_pic_sets = sps->nb_st_rps;
95*437bfbebSnyanmisaka pp->num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps;
96*437bfbebSnyanmisaka
97*437bfbebSnyanmisaka pp->num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active - 1;
98*437bfbebSnyanmisaka pp->num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active - 1;
99*437bfbebSnyanmisaka pp->init_qp_minus26 = pps->pic_init_qp_minus26;
100*437bfbebSnyanmisaka
101*437bfbebSnyanmisaka if (h->sh.short_term_ref_pic_set_sps_flag == 0 && h->sh.short_term_rps) {
102*437bfbebSnyanmisaka pp->ucNumDeltaPocsOfRefRpsIdx = h->sh.short_term_rps->rps_idx_num_delta_pocs;
103*437bfbebSnyanmisaka pp->wNumBitsForShortTermRPSInSlice = h->sh.short_term_ref_pic_set_size;
104*437bfbebSnyanmisaka }
105*437bfbebSnyanmisaka
106*437bfbebSnyanmisaka pp->dwCodingParamToolFlags = (sps->scaling_list_enable_flag << 0) |
107*437bfbebSnyanmisaka (sps->amp_enabled_flag << 1) |
108*437bfbebSnyanmisaka (sps->sao_enabled << 2) |
109*437bfbebSnyanmisaka (sps->pcm_enabled_flag << 3) |
110*437bfbebSnyanmisaka ((sps->pcm_enabled_flag ? (sps->pcm.bit_depth - 1) : 0) << 4) |
111*437bfbebSnyanmisaka ((sps->pcm_enabled_flag ? (sps->pcm.bit_depth_chroma - 1) : 0) << 8) |
112*437bfbebSnyanmisaka ((sps->pcm_enabled_flag ? (sps->pcm.log2_min_pcm_cb_size - 3) : 0) << 12) |
113*437bfbebSnyanmisaka ((sps->pcm_enabled_flag ? (sps->pcm.log2_max_pcm_cb_size - sps->pcm.log2_min_pcm_cb_size) : 0) << 14) |
114*437bfbebSnyanmisaka (sps->pcm.loop_filter_disable_flag << 16) |
115*437bfbebSnyanmisaka (sps->long_term_ref_pics_present_flag << 17) |
116*437bfbebSnyanmisaka (sps->sps_temporal_mvp_enabled_flag << 18) |
117*437bfbebSnyanmisaka (sps->sps_strong_intra_smoothing_enable_flag << 19) |
118*437bfbebSnyanmisaka (pps->dependent_slice_segments_enabled_flag << 20) |
119*437bfbebSnyanmisaka (pps->output_flag_present_flag << 21) |
120*437bfbebSnyanmisaka (pps->num_extra_slice_header_bits << 22) |
121*437bfbebSnyanmisaka (pps->sign_data_hiding_flag << 25) |
122*437bfbebSnyanmisaka (pps->cabac_init_present_flag << 26) |
123*437bfbebSnyanmisaka (0 << 27);
124*437bfbebSnyanmisaka
125*437bfbebSnyanmisaka pp->dwCodingSettingPicturePropertyFlags = (pps->constrained_intra_pred_flag << 0) |
126*437bfbebSnyanmisaka (pps->transform_skip_enabled_flag << 1) |
127*437bfbebSnyanmisaka (pps->cu_qp_delta_enabled_flag << 2) |
128*437bfbebSnyanmisaka (pps->pic_slice_level_chroma_qp_offsets_present_flag << 3) |
129*437bfbebSnyanmisaka (pps->weighted_pred_flag << 4) |
130*437bfbebSnyanmisaka (pps->weighted_bipred_flag << 5) |
131*437bfbebSnyanmisaka (pps->transquant_bypass_enable_flag << 6) |
132*437bfbebSnyanmisaka (pps->tiles_enabled_flag << 7) |
133*437bfbebSnyanmisaka (pps->entropy_coding_sync_enabled_flag << 8) |
134*437bfbebSnyanmisaka (pps->uniform_spacing_flag << 9) |
135*437bfbebSnyanmisaka (pps->loop_filter_across_tiles_enabled_flag << 10) |
136*437bfbebSnyanmisaka (pps->seq_loop_filter_across_slices_enabled_flag << 11) |
137*437bfbebSnyanmisaka (pps->deblocking_filter_override_enabled_flag << 12) |
138*437bfbebSnyanmisaka (pps->disable_dbf << 13) |
139*437bfbebSnyanmisaka (pps->lists_modification_present_flag << 14) |
140*437bfbebSnyanmisaka (pps->slice_header_extension_present_flag << 15) |
141*437bfbebSnyanmisaka (0 << 19);
142*437bfbebSnyanmisaka
143*437bfbebSnyanmisaka pp->IdrPicFlag = (h->first_nal_type == 19 || h->first_nal_type == 20);
144*437bfbebSnyanmisaka pp->IrapPicFlag = (h->first_nal_type >= 16 && h->first_nal_type <= 23);
145*437bfbebSnyanmisaka pp->IntraPicFlag = (h->first_nal_type >= 16 && h->first_nal_type <= 23) || h->sh.slice_type == I_SLICE;
146*437bfbebSnyanmisaka pp->pps_cb_qp_offset = pps->cb_qp_offset;
147*437bfbebSnyanmisaka pp->pps_cr_qp_offset = pps->cr_qp_offset;
148*437bfbebSnyanmisaka if (pps->tiles_enabled_flag) {
149*437bfbebSnyanmisaka pp->num_tile_columns_minus1 = pps->num_tile_columns - 1;
150*437bfbebSnyanmisaka pp->num_tile_rows_minus1 = pps->num_tile_rows - 1;
151*437bfbebSnyanmisaka
152*437bfbebSnyanmisaka if (!pps->uniform_spacing_flag) {
153*437bfbebSnyanmisaka for (i = 0; i < (RK_U32)pps->num_tile_columns; i++)
154*437bfbebSnyanmisaka pp->column_width_minus1[i] = pps->bufs.column_width[i] - 1;
155*437bfbebSnyanmisaka
156*437bfbebSnyanmisaka for (i = 0; i < (RK_U32)pps->num_tile_rows; i++)
157*437bfbebSnyanmisaka pp->row_height_minus1[i] = pps->bufs.row_height[i] - 1;
158*437bfbebSnyanmisaka }
159*437bfbebSnyanmisaka }
160*437bfbebSnyanmisaka
161*437bfbebSnyanmisaka pp->diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth;
162*437bfbebSnyanmisaka pp->pps_beta_offset_div2 = pps->beta_offset / 2;
163*437bfbebSnyanmisaka pp->pps_tc_offset_div2 = pps->tc_offset / 2;
164*437bfbebSnyanmisaka pp->log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2;
165*437bfbebSnyanmisaka pp->slice_segment_header_extension_present_flag = pps->slice_header_extension_present_flag;
166*437bfbebSnyanmisaka pp->CurrPicOrderCntVal = h->poc;
167*437bfbebSnyanmisaka pp->ps_update_flag = h->ps_need_upate;
168*437bfbebSnyanmisaka pp->rps_update_flag = h->rps_need_upate || h->ps_need_upate;
169*437bfbebSnyanmisaka
170*437bfbebSnyanmisaka if (pp->rps_update_flag) {
171*437bfbebSnyanmisaka for (i = 0; i < 32; i++) {
172*437bfbebSnyanmisaka pp->sps_lt_rps[i].lt_ref_pic_poc_lsb = sps->lt_ref_pic_poc_lsb_sps[i];
173*437bfbebSnyanmisaka pp->sps_lt_rps[i].used_by_curr_pic_lt_flag = sps->used_by_curr_pic_lt_sps_flag[i];
174*437bfbebSnyanmisaka }
175*437bfbebSnyanmisaka
176*437bfbebSnyanmisaka if (cur_src_rps) {
177*437bfbebSnyanmisaka RK_U32 n_pics = h->sh.short_term_rps->num_negative_pics;
178*437bfbebSnyanmisaka cur_dst_rps->num_negative_pics = n_pics;
179*437bfbebSnyanmisaka cur_dst_rps->num_positive_pics = cur_src_rps->num_delta_pocs - n_pics;
180*437bfbebSnyanmisaka for (i = 0; i < cur_dst_rps->num_negative_pics; i++) {
181*437bfbebSnyanmisaka cur_dst_rps->delta_poc_s0[i] = cur_src_rps->delta_poc[i];
182*437bfbebSnyanmisaka cur_dst_rps->s0_used_flag[i] = cur_src_rps->used[i];
183*437bfbebSnyanmisaka }
184*437bfbebSnyanmisaka for (i = 0; i < cur_dst_rps->num_positive_pics; i++) {
185*437bfbebSnyanmisaka cur_dst_rps->delta_poc_s1[i] = cur_src_rps->delta_poc[i + n_pics];
186*437bfbebSnyanmisaka cur_dst_rps->s1_used_flag[i] = cur_src_rps->used[i + n_pics];
187*437bfbebSnyanmisaka }
188*437bfbebSnyanmisaka }
189*437bfbebSnyanmisaka
190*437bfbebSnyanmisaka for (i = 0; i < 64; i++) {
191*437bfbebSnyanmisaka if (i < sps->nb_st_rps) {
192*437bfbebSnyanmisaka
193*437bfbebSnyanmisaka RK_U32 n_pics = src_rps[i].num_negative_pics;
194*437bfbebSnyanmisaka dst_rps[i].num_negative_pics = n_pics;
195*437bfbebSnyanmisaka dst_rps[i].num_positive_pics = src_rps[i].num_delta_pocs - n_pics;
196*437bfbebSnyanmisaka for (j = 0; j < dst_rps[i].num_negative_pics; j++) {
197*437bfbebSnyanmisaka dst_rps[i].delta_poc_s0[j] = src_rps[i].delta_poc[j];
198*437bfbebSnyanmisaka dst_rps[i].s0_used_flag[j] = src_rps[i].used[j];
199*437bfbebSnyanmisaka }
200*437bfbebSnyanmisaka
201*437bfbebSnyanmisaka for ( j = 0; j < dst_rps[i].num_positive_pics; j++) {
202*437bfbebSnyanmisaka dst_rps[i].delta_poc_s1[j] = src_rps[i].delta_poc[j + n_pics];
203*437bfbebSnyanmisaka dst_rps[i].s1_used_flag[j] = src_rps[i].used[j + n_pics];
204*437bfbebSnyanmisaka }
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka }
207*437bfbebSnyanmisaka }
208*437bfbebSnyanmisaka
209*437bfbebSnyanmisaka nb_rps_used = 0;
210*437bfbebSnyanmisaka for (i = 0; i < NB_RPS_TYPE; i++) {
211*437bfbebSnyanmisaka for (j = 0; j < (RK_U32)h->rps[i].nb_refs; j++) {
212*437bfbebSnyanmisaka if ((i == ST_FOLL) || (i == LT_FOLL)) {
213*437bfbebSnyanmisaka ;
214*437bfbebSnyanmisaka } else {
215*437bfbebSnyanmisaka rps_used[nb_rps_used++] = h->rps[i].list[j];
216*437bfbebSnyanmisaka }
217*437bfbebSnyanmisaka }
218*437bfbebSnyanmisaka }
219*437bfbebSnyanmisaka // mpp_err("fill RefPicList from the DPB");
220*437bfbebSnyanmisaka // fill RefPicList from the DPB
221*437bfbebSnyanmisaka pp->current_poc = current_picture->poc;
222*437bfbebSnyanmisaka for (i = 0, j = 0; i < MPP_ARRAY_ELEMS(pp->RefPicList); i++) {
223*437bfbebSnyanmisaka const HEVCFrame *frame = NULL;
224*437bfbebSnyanmisaka while (!frame && j < MPP_ARRAY_ELEMS(h->DPB)) {
225*437bfbebSnyanmisaka if (&h->DPB[j] != current_picture &&
226*437bfbebSnyanmisaka (h->DPB[j].flags & (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF))) {
227*437bfbebSnyanmisaka RK_U32 k = 0;
228*437bfbebSnyanmisaka for (k = 0; k < nb_rps_used; k++) { /*skip fill RefPicList no used in rps*/
229*437bfbebSnyanmisaka if (rps_used[k] == (RK_U32)h->DPB[j].poc) {
230*437bfbebSnyanmisaka frame = &h->DPB[j];
231*437bfbebSnyanmisaka }
232*437bfbebSnyanmisaka }
233*437bfbebSnyanmisaka }
234*437bfbebSnyanmisaka j++;
235*437bfbebSnyanmisaka }
236*437bfbebSnyanmisaka
237*437bfbebSnyanmisaka if (frame && (frame->slot_index != 0xff)) {
238*437bfbebSnyanmisaka fill_picture_entry(&pp->RefPicList[i], frame->slot_index, !!(frame->flags & HEVC_FRAME_FLAG_LONG_REF));
239*437bfbebSnyanmisaka pp->PicOrderCntValList[i] = frame->poc;
240*437bfbebSnyanmisaka mpp_buf_slot_set_flag(h->slots, frame->slot_index, SLOT_HAL_INPUT);
241*437bfbebSnyanmisaka h->task->refer[i] = frame->slot_index;
242*437bfbebSnyanmisaka //mpp_err("ref[%d] = %d",i,frame->slot_index);
243*437bfbebSnyanmisaka } else {
244*437bfbebSnyanmisaka pp->RefPicList[i].bPicEntry = 0xff;
245*437bfbebSnyanmisaka pp->PicOrderCntValList[i] = 0;
246*437bfbebSnyanmisaka h->task->refer[i] = -1;
247*437bfbebSnyanmisaka }
248*437bfbebSnyanmisaka }
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka #define DO_REF_LIST(ref_idx, ref_list) { \
251*437bfbebSnyanmisaka const RefPicList *rpl = &h->rps[ref_idx]; \
252*437bfbebSnyanmisaka for (i = 0, j = 0; i < MPP_ARRAY_ELEMS(pp->ref_list); i++) { \
253*437bfbebSnyanmisaka const HEVCFrame *frame = NULL; \
254*437bfbebSnyanmisaka while (!frame && j < (RK_U32)rpl->nb_refs) \
255*437bfbebSnyanmisaka frame = rpl->ref[j++]; \
256*437bfbebSnyanmisaka if (frame) \
257*437bfbebSnyanmisaka pp->ref_list[i] = get_refpic_index(pp, frame->slot_index); \
258*437bfbebSnyanmisaka else \
259*437bfbebSnyanmisaka pp->ref_list[i] = 0xff; \
260*437bfbebSnyanmisaka } \
261*437bfbebSnyanmisaka }
262*437bfbebSnyanmisaka
263*437bfbebSnyanmisaka // Fill short term and long term lists
264*437bfbebSnyanmisaka DO_REF_LIST(ST_CURR_BEF, RefPicSetStCurrBefore);
265*437bfbebSnyanmisaka DO_REF_LIST(ST_CURR_AFT, RefPicSetStCurrAfter);
266*437bfbebSnyanmisaka DO_REF_LIST(LT_CURR, RefPicSetLtCurr);
267*437bfbebSnyanmisaka
268*437bfbebSnyanmisaka // sps exension flags
269*437bfbebSnyanmisaka pp->sps_extension_flag = sps->sps_extension_flag;;
270*437bfbebSnyanmisaka pp->sps_range_extension_flag = sps->sps_range_extension_flag;;
271*437bfbebSnyanmisaka pp->transform_skip_rotation_enabled_flag = sps->transform_skip_rotation_enabled_flag;;
272*437bfbebSnyanmisaka pp->transform_skip_context_enabled_flag = sps->transform_skip_context_enabled_flag;;
273*437bfbebSnyanmisaka pp->implicit_rdpcm_enabled_flag = sps->implicit_rdpcm_enabled_flag;;
274*437bfbebSnyanmisaka pp->explicit_rdpcm_enabled_flag = sps->explicit_rdpcm_enabled_flag;;
275*437bfbebSnyanmisaka pp->extended_precision_processing_flag = sps->extended_precision_processing_flag;;
276*437bfbebSnyanmisaka pp->intra_smoothing_disabled_flag = sps->intra_smoothing_disabled_flag;;
277*437bfbebSnyanmisaka pp->high_precision_offsets_enabled_flag = sps->high_precision_offsets_enabled_flag;;
278*437bfbebSnyanmisaka pp->persistent_rice_adaptation_enabled_flag = sps->persistent_rice_adaptation_enabled_flag;;
279*437bfbebSnyanmisaka pp->cabac_bypass_alignment_enabled_flag = sps->cabac_bypass_alignment_enabled_flag;;
280*437bfbebSnyanmisaka
281*437bfbebSnyanmisaka // pps exension flags
282*437bfbebSnyanmisaka pp->cross_component_prediction_enabled_flag = pps->cross_component_prediction_enabled_flag;
283*437bfbebSnyanmisaka pp->chroma_qp_offset_list_enabled_flag = pps->chroma_qp_offset_list_enabled_flag;
284*437bfbebSnyanmisaka
285*437bfbebSnyanmisaka // PPS extension
286*437bfbebSnyanmisaka pp->log2_max_transform_skip_block_size = pps->log2_max_transform_skip_block_size;
287*437bfbebSnyanmisaka pp->diff_cu_chroma_qp_offset_depth = pps->diff_cu_chroma_qp_offset_depth;
288*437bfbebSnyanmisaka pp->chroma_qp_offset_list_len_minus1 = pps->chroma_qp_offset_list_len_minus1;
289*437bfbebSnyanmisaka for (i = 0; i < 6; i++) {
290*437bfbebSnyanmisaka pp->cb_qp_offset_list[i] = pps->cb_qp_offset_list[i];
291*437bfbebSnyanmisaka pp->cr_qp_offset_list[i] = pps->cr_qp_offset_list[i];
292*437bfbebSnyanmisaka }
293*437bfbebSnyanmisaka }
294*437bfbebSnyanmisaka extern RK_U8 mpp_hevc_diag_scan4x4_x[16];
295*437bfbebSnyanmisaka extern RK_U8 mpp_hevc_diag_scan4x4_y[16];
296*437bfbebSnyanmisaka extern RK_U8 mpp_hevc_diag_scan8x8_x[64];
297*437bfbebSnyanmisaka extern RK_U8 mpp_hevc_diag_scan8x8_y[64];
298*437bfbebSnyanmisaka
fill_scaling_lists(const HEVCContext * h,DXVA_Qmatrix_HEVC * qm)299*437bfbebSnyanmisaka static void fill_scaling_lists(const HEVCContext *h, DXVA_Qmatrix_HEVC *qm)
300*437bfbebSnyanmisaka {
301*437bfbebSnyanmisaka RK_U32 i, j, pos;
302*437bfbebSnyanmisaka const HEVCPPS *pps = (HEVCPPS *)h->pps_list[h->sh.pps_id];
303*437bfbebSnyanmisaka const HEVCSPS *sps = (HEVCSPS *)h->sps_list[pps->sps_id];
304*437bfbebSnyanmisaka const ScalingList *sl = pps->scaling_list_data_present_flag ?
305*437bfbebSnyanmisaka &pps->scaling_list : &sps->scaling_list;
306*437bfbebSnyanmisaka if (!sps->scaling_list_enable_flag) {
307*437bfbebSnyanmisaka return;
308*437bfbebSnyanmisaka }
309*437bfbebSnyanmisaka memset(qm, 0, sizeof(DXVA_Qmatrix_HEVC));
310*437bfbebSnyanmisaka for (i = 0; i < 6; i++) {
311*437bfbebSnyanmisaka for (j = 0; j < 16; j++) {
312*437bfbebSnyanmisaka pos = 4 * mpp_hevc_diag_scan4x4_y[j] + mpp_hevc_diag_scan4x4_x[j];
313*437bfbebSnyanmisaka qm->ucScalingLists0[i][j] = sl->sl[0][i][pos];
314*437bfbebSnyanmisaka }
315*437bfbebSnyanmisaka
316*437bfbebSnyanmisaka for (j = 0; j < 64; j++) {
317*437bfbebSnyanmisaka pos = 8 * mpp_hevc_diag_scan8x8_y[j] + mpp_hevc_diag_scan8x8_x[j];
318*437bfbebSnyanmisaka qm->ucScalingLists1[i][j] = sl->sl[1][i][pos];
319*437bfbebSnyanmisaka qm->ucScalingLists2[i][j] = sl->sl[2][i][pos];
320*437bfbebSnyanmisaka
321*437bfbebSnyanmisaka if (i < 2)
322*437bfbebSnyanmisaka qm->ucScalingLists3[i][j] = sl->sl[3][i * 3][pos];
323*437bfbebSnyanmisaka }
324*437bfbebSnyanmisaka
325*437bfbebSnyanmisaka qm->ucScalingListDCCoefSizeID2[i] = sl->sl_dc[0][i];
326*437bfbebSnyanmisaka
327*437bfbebSnyanmisaka if (i < 2)
328*437bfbebSnyanmisaka qm->ucScalingListDCCoefSizeID3[i] = sl->sl_dc[1][i * 3];
329*437bfbebSnyanmisaka }
330*437bfbebSnyanmisaka }
331*437bfbebSnyanmisaka
fill_slice_short(DXVA_Slice_HEVC_Short * slice,unsigned position,unsigned size)332*437bfbebSnyanmisaka static void fill_slice_short(DXVA_Slice_HEVC_Short *slice,
333*437bfbebSnyanmisaka unsigned position, unsigned size)
334*437bfbebSnyanmisaka {
335*437bfbebSnyanmisaka memset(slice, 0, sizeof(*slice));
336*437bfbebSnyanmisaka slice->BSNALunitDataLocation = position;
337*437bfbebSnyanmisaka slice->SliceBytesInBuffer = size;
338*437bfbebSnyanmisaka slice->wBadSliceChopping = 0;
339*437bfbebSnyanmisaka }
340*437bfbebSnyanmisaka
init_slice_cut_param(DXVA_Slice_HEVC_Cut_Param * slice)341*437bfbebSnyanmisaka static void init_slice_cut_param(DXVA_Slice_HEVC_Cut_Param *slice)
342*437bfbebSnyanmisaka {
343*437bfbebSnyanmisaka memset(slice, 0, sizeof(*slice));
344*437bfbebSnyanmisaka }
345*437bfbebSnyanmisaka
h265d_parser2_syntax(void * ctx)346*437bfbebSnyanmisaka RK_S32 h265d_parser2_syntax(void *ctx)
347*437bfbebSnyanmisaka {
348*437bfbebSnyanmisaka
349*437bfbebSnyanmisaka H265dContext_t *h265dctx = (H265dContext_t *)ctx;
350*437bfbebSnyanmisaka const HEVCContext *h = (const HEVCContext *)h265dctx->priv_data;
351*437bfbebSnyanmisaka
352*437bfbebSnyanmisaka h265d_dxva2_picture_context_t *ctx_pic = (h265d_dxva2_picture_context_t *)h->hal_pic_private;
353*437bfbebSnyanmisaka
354*437bfbebSnyanmisaka /* Fill up DXVA_PicParams_HEVC */
355*437bfbebSnyanmisaka fill_picture_parameters(h, &ctx_pic->pp);
356*437bfbebSnyanmisaka
357*437bfbebSnyanmisaka /* Fill up DXVA_Qmatrix_HEVC */
358*437bfbebSnyanmisaka fill_scaling_lists(h, &ctx_pic->qm);
359*437bfbebSnyanmisaka
360*437bfbebSnyanmisaka return 0;
361*437bfbebSnyanmisaka }
362*437bfbebSnyanmisaka
h265d_syntax_fill_slice(void * ctx,RK_S32 input_index)363*437bfbebSnyanmisaka RK_S32 h265d_syntax_fill_slice(void *ctx, RK_S32 input_index)
364*437bfbebSnyanmisaka {
365*437bfbebSnyanmisaka H265dContext_t *h265dctx = (H265dContext_t *)ctx;
366*437bfbebSnyanmisaka const HEVCContext *h = (const HEVCContext *)h265dctx->priv_data;
367*437bfbebSnyanmisaka h265d_dxva2_picture_context_t *ctx_pic = (h265d_dxva2_picture_context_t *)h->hal_pic_private;
368*437bfbebSnyanmisaka MppBuffer streambuf = NULL;
369*437bfbebSnyanmisaka RK_S32 i, count = 0;
370*437bfbebSnyanmisaka RK_U32 position = 0;
371*437bfbebSnyanmisaka RK_U8 *ptr = NULL;
372*437bfbebSnyanmisaka RK_U8 *current = NULL;
373*437bfbebSnyanmisaka RK_U32 size = 0, length = 0;
374*437bfbebSnyanmisaka // mpp_err("input_index = %d",input_index);
375*437bfbebSnyanmisaka if (-1 != input_index) {
376*437bfbebSnyanmisaka mpp_buf_slot_get_prop(h->packet_slots, input_index, SLOT_BUFFER, &streambuf);
377*437bfbebSnyanmisaka current = ptr = (RK_U8 *)mpp_buffer_get_ptr(streambuf);
378*437bfbebSnyanmisaka if (current == NULL) {
379*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
380*437bfbebSnyanmisaka }
381*437bfbebSnyanmisaka } else {
382*437bfbebSnyanmisaka RK_S32 buff_size = 0;
383*437bfbebSnyanmisaka current = (RK_U8 *)mpp_packet_get_data(h->input_packet);
384*437bfbebSnyanmisaka size = (RK_U32)mpp_packet_get_size(h->input_packet);
385*437bfbebSnyanmisaka for (i = 0; i < h->nb_nals; i++) {
386*437bfbebSnyanmisaka length += h->nals[i].size + 4;
387*437bfbebSnyanmisaka }
388*437bfbebSnyanmisaka length = MPP_ALIGN(length, 16) + 64;
389*437bfbebSnyanmisaka if (length > size) {
390*437bfbebSnyanmisaka mpp_free(current);
391*437bfbebSnyanmisaka buff_size = MPP_ALIGN(length + 10 * 1024, 1024);
392*437bfbebSnyanmisaka current = mpp_malloc(RK_U8, buff_size);
393*437bfbebSnyanmisaka mpp_packet_set_data(h->input_packet, (void*)current);
394*437bfbebSnyanmisaka mpp_packet_set_size(h->input_packet, buff_size);
395*437bfbebSnyanmisaka }
396*437bfbebSnyanmisaka }
397*437bfbebSnyanmisaka if (ctx_pic->max_slice_num < h->nb_nals) {
398*437bfbebSnyanmisaka
399*437bfbebSnyanmisaka MPP_FREE(ctx_pic->slice_short);
400*437bfbebSnyanmisaka
401*437bfbebSnyanmisaka ctx_pic->slice_short = (DXVA_Slice_HEVC_Short *)mpp_malloc(DXVA_Slice_HEVC_Short, h->nb_nals);
402*437bfbebSnyanmisaka if (!ctx_pic->slice_short)
403*437bfbebSnyanmisaka return MPP_ERR_NOMEM;
404*437bfbebSnyanmisaka
405*437bfbebSnyanmisaka MPP_FREE(ctx_pic->slice_cut_param);
406*437bfbebSnyanmisaka
407*437bfbebSnyanmisaka ctx_pic->slice_cut_param = (DXVA_Slice_HEVC_Cut_Param *)mpp_malloc(DXVA_Slice_HEVC_Cut_Param, h->nb_nals);
408*437bfbebSnyanmisaka if (!ctx_pic->slice_cut_param)
409*437bfbebSnyanmisaka return MPP_ERR_NOMEM;
410*437bfbebSnyanmisaka
411*437bfbebSnyanmisaka ctx_pic->max_slice_num = h->nb_nals;
412*437bfbebSnyanmisaka }
413*437bfbebSnyanmisaka for (i = 0; i < h->nb_nals; i++) {
414*437bfbebSnyanmisaka static const RK_U8 start_code[] = {0, 0, 1 };
415*437bfbebSnyanmisaka static const RK_U32 start_code_size = sizeof(start_code);
416*437bfbebSnyanmisaka BitReadCtx_t gb_cxt, *gb;
417*437bfbebSnyanmisaka RK_S32 value;
418*437bfbebSnyanmisaka RK_U32 nal_type;
419*437bfbebSnyanmisaka
420*437bfbebSnyanmisaka mpp_set_bitread_ctx(&gb_cxt, (RK_U8 *)h->nals[i].data,
421*437bfbebSnyanmisaka h->nals[i].size);
422*437bfbebSnyanmisaka mpp_set_bitread_pseudo_code_type(&gb_cxt, PSEUDO_CODE_H264_H265);
423*437bfbebSnyanmisaka
424*437bfbebSnyanmisaka gb = &gb_cxt;
425*437bfbebSnyanmisaka
426*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); /*this bit should be zero*/
427*437bfbebSnyanmisaka
428*437bfbebSnyanmisaka READ_BITS(gb, 6, &nal_type);
429*437bfbebSnyanmisaka
430*437bfbebSnyanmisaka if (nal_type >= 32) {
431*437bfbebSnyanmisaka continue;
432*437bfbebSnyanmisaka }
433*437bfbebSnyanmisaka memcpy(current, start_code, start_code_size);
434*437bfbebSnyanmisaka current += start_code_size;
435*437bfbebSnyanmisaka position += start_code_size;
436*437bfbebSnyanmisaka memcpy(current, h->nals[i].data, h->nals[i].size);
437*437bfbebSnyanmisaka // mpp_log("h->nals[%d].size = %d", i, h->nals[i].size);
438*437bfbebSnyanmisaka fill_slice_short(&ctx_pic->slice_short[count], position, h->nals[i].size);
439*437bfbebSnyanmisaka init_slice_cut_param(&ctx_pic->slice_cut_param[count]);
440*437bfbebSnyanmisaka current += h->nals[i].size;
441*437bfbebSnyanmisaka position += h->nals[i].size;
442*437bfbebSnyanmisaka count++;
443*437bfbebSnyanmisaka }
444*437bfbebSnyanmisaka ctx_pic->slice_count = count;
445*437bfbebSnyanmisaka ctx_pic->bitstream_size = position;
446*437bfbebSnyanmisaka if (-1 != input_index) {
447*437bfbebSnyanmisaka ctx_pic->bitstream = (RK_U8*)ptr;
448*437bfbebSnyanmisaka
449*437bfbebSnyanmisaka mpp_buf_slot_set_flag(h->packet_slots, input_index, SLOT_CODEC_READY);
450*437bfbebSnyanmisaka mpp_buf_slot_set_flag(h->packet_slots, input_index, SLOT_HAL_INPUT);
451*437bfbebSnyanmisaka } else {
452*437bfbebSnyanmisaka ctx_pic->bitstream = NULL;
453*437bfbebSnyanmisaka mpp_packet_set_length(h->input_packet, position);
454*437bfbebSnyanmisaka }
455*437bfbebSnyanmisaka return MPP_OK;
456*437bfbebSnyanmisaka __BITREAD_ERR:
457*437bfbebSnyanmisaka return MPP_ERR_STREAM;
458*437bfbebSnyanmisaka }
459