xref: /rockchip-linux_mpp/mpp/codec/enc/h265/h265e_syntax.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 "H265E_SYNTAX"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "h265e_codec.h"
23*437bfbebSnyanmisaka #include "h265e_syntax_new.h"
24*437bfbebSnyanmisaka 
h265e_get_nal_type(H265eSlicParams * sp,RK_S32 frame_type)25*437bfbebSnyanmisaka RK_S32 h265e_get_nal_type(H265eSlicParams* sp, RK_S32 frame_type)
26*437bfbebSnyanmisaka {
27*437bfbebSnyanmisaka     RK_U32 nal_type = 0;
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka     if (sp->temporal_id > 0) {
30*437bfbebSnyanmisaka         nal_type = sp->non_reference_flag ? NAL_TSA_N : NAL_TSA_R;
31*437bfbebSnyanmisaka     } else if (frame_type == INTRA_FRAME) {
32*437bfbebSnyanmisaka         nal_type = NAL_IDR_W_RADL;
33*437bfbebSnyanmisaka     } else {
34*437bfbebSnyanmisaka         nal_type = sp->non_reference_flag ? NAL_TRAIL_N : NAL_TRAIL_R;
35*437bfbebSnyanmisaka     }
36*437bfbebSnyanmisaka 
37*437bfbebSnyanmisaka     return nal_type;
38*437bfbebSnyanmisaka }
39*437bfbebSnyanmisaka 
fill_picture_parameters(const H265eCtx * h,H265ePicParams * pp)40*437bfbebSnyanmisaka static void fill_picture_parameters(const H265eCtx *h,
41*437bfbebSnyanmisaka                                     H265ePicParams *pp)
42*437bfbebSnyanmisaka {
43*437bfbebSnyanmisaka     const H265ePps *pps = (H265ePps *)&h->pps;
44*437bfbebSnyanmisaka     const H265eSps *sps = (H265eSps *)&h->sps;
45*437bfbebSnyanmisaka     MppEncCfgSet *cfg = h->cfg;
46*437bfbebSnyanmisaka     memset(pp, 0, sizeof(H265ePicParams));
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka     pp->pic_width  = h->cfg->prep.width;
49*437bfbebSnyanmisaka     pp->pic_height = h->cfg->prep.height;
50*437bfbebSnyanmisaka     pp->hor_stride = h->cfg->prep.hor_stride;
51*437bfbebSnyanmisaka     pp->ver_stride = h->cfg->prep.ver_stride;
52*437bfbebSnyanmisaka     pp->pps_id = h->slice->m_ppsId;
53*437bfbebSnyanmisaka     pp->sps_id = pps->m_SPSId;
54*437bfbebSnyanmisaka     pp->vps_id = sps->m_VPSId;
55*437bfbebSnyanmisaka     pp->mpp_format = cfg->prep.format;
56*437bfbebSnyanmisaka 
57*437bfbebSnyanmisaka     pp->wFormatAndSequenceInfoFlags = (sps->m_chromaFormatIdc               <<  0) |
58*437bfbebSnyanmisaka                                       (sps->m_colorPlaneFlag                <<  2) |
59*437bfbebSnyanmisaka                                       ((sps->m_bitDepthY - 8)               <<  3) |
60*437bfbebSnyanmisaka                                       ((sps->m_bitDepthC - 8)               <<  6) |
61*437bfbebSnyanmisaka                                       ((sps->m_bitsForPOC - 4)              <<  9) |
62*437bfbebSnyanmisaka                                       (0                                    << 13) |
63*437bfbebSnyanmisaka                                       (0                                    << 14) |
64*437bfbebSnyanmisaka                                       (0                                    << 15);
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka     pp->sps_max_dec_pic_buffering_minus1         = sps->m_maxDecPicBuffering[sps->m_maxTLayers - 1] - 1;
68*437bfbebSnyanmisaka     pp->log2_min_luma_coding_block_size_minus3   = sps->m_log2MinCodingBlockSize - 3;
69*437bfbebSnyanmisaka     pp->log2_diff_max_min_luma_coding_block_size = sps->m_log2DiffMaxMinCodingBlockSize;
70*437bfbebSnyanmisaka 
71*437bfbebSnyanmisaka     pp->log2_min_transform_block_size_minus2     = sps->m_quadtreeTULog2MinSize - 2;
72*437bfbebSnyanmisaka     pp->log2_diff_max_min_transform_block_size   = sps->m_quadtreeTULog2MaxSize  - sps->m_quadtreeTULog2MinSize;
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka     pp->max_transform_hierarchy_depth_inter      = sps->m_quadtreeTUMaxDepthInter;
75*437bfbebSnyanmisaka     pp->max_transform_hierarchy_depth_intra      = sps->m_quadtreeTUMaxDepthIntra;
76*437bfbebSnyanmisaka 
77*437bfbebSnyanmisaka     pp->num_short_term_ref_pic_sets              = sps->m_RPSList.m_numberOfReferencePictureSets;
78*437bfbebSnyanmisaka     pp->num_long_term_ref_pics_sps               = sps->m_numLongTermRefPicSPS;
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     pp->sample_adaptive_offset_enabled_flag      = sps->m_bUseSAO;
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     pp->num_ref_idx_l0_default_active_minus1     = pps->m_numRefIdxL0DefaultActive - 1;
83*437bfbebSnyanmisaka     pp->num_ref_idx_l1_default_active_minus1     = pps->m_numRefIdxL1DefaultActive - 1;
84*437bfbebSnyanmisaka     pp->init_qp_minus26                          = pps->m_picInitQPMinus26;
85*437bfbebSnyanmisaka 
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     pp->CodingParamToolFlags = (sps->m_scalingListEnabledFlag                                 <<  0) |
88*437bfbebSnyanmisaka                                (sps->m_useAMP                                                 <<  1) |
89*437bfbebSnyanmisaka                                (sps->m_bUseSAO                                                <<  2) |
90*437bfbebSnyanmisaka                                (sps->m_usePCM                                                 <<  3) |
91*437bfbebSnyanmisaka                                ((sps->m_usePCM ? (sps->m_pcmBitDepthLuma - 1) : 0)            <<  4) |
92*437bfbebSnyanmisaka                                ((sps->m_usePCM ? (sps->m_pcmBitDepthChroma - 1) : 0)          <<  8) |
93*437bfbebSnyanmisaka                                ((sps->m_usePCM ? (sps->m_pcmLog2MinSize - 3) : 0)             << 12) |
94*437bfbebSnyanmisaka                                ((sps->m_usePCM ? (sps->m_pcmLog2MaxSize - sps->m_pcmLog2MinSize) : 0) << 14) |
95*437bfbebSnyanmisaka                                (sps->m_bPCMFilterDisableFlag                   << 16) |
96*437bfbebSnyanmisaka                                (sps->m_bLongTermRefsPresent                    << 17) |
97*437bfbebSnyanmisaka                                (sps->m_TMVPFlagsPresent                        << 18) |
98*437bfbebSnyanmisaka                                (sps->m_useStrongIntraSmoothing                 << 19) |
99*437bfbebSnyanmisaka                                (0                                              << 20) |
100*437bfbebSnyanmisaka                                (pps->m_outputFlagPresentFlag                   << 21) |
101*437bfbebSnyanmisaka                                (pps->m_numExtraSliceHeaderBits                 << 22) |
102*437bfbebSnyanmisaka                                (pps->m_signHideFlag                            << 25) |
103*437bfbebSnyanmisaka                                (pps->m_cabacInitPresentFlag                    << 26) |
104*437bfbebSnyanmisaka                                (0                                              << 27);
105*437bfbebSnyanmisaka 
106*437bfbebSnyanmisaka     pp->CodingSettingPicturePropertyFlags =   (pps->m_bConstrainedIntraPred                       <<  0) |
107*437bfbebSnyanmisaka                                               (pps->m_useTransformSkip                            <<  1) |
108*437bfbebSnyanmisaka                                               (pps->m_useDQP                                      <<  2) |
109*437bfbebSnyanmisaka                                               (pps->m_bSliceChromaQpFlag                          <<  3) |
110*437bfbebSnyanmisaka                                               (pps->m_bUseWeightPred                              <<  4) |
111*437bfbebSnyanmisaka                                               (pps->m_useWeightedBiPred                           <<  5) |
112*437bfbebSnyanmisaka                                               (pps->m_transquantBypassEnableFlag                  <<  6) |
113*437bfbebSnyanmisaka                                               (pps->m_tiles_enabled_flag                          <<  7) |
114*437bfbebSnyanmisaka                                               (pps->m_entropyCodingSyncEnabledFlag                <<  8) |
115*437bfbebSnyanmisaka                                               (pps->m_bTileUniformSpacing                         <<  9) |
116*437bfbebSnyanmisaka                                               (pps->m_loopFilterAcrossTilesEnabledFlag            << 10) |
117*437bfbebSnyanmisaka                                               (pps->m_LFCrossSliceBoundaryFlag                    << 11) |
118*437bfbebSnyanmisaka                                               (pps->m_deblockingFilterOverrideEnabledFlag         << 12) |
119*437bfbebSnyanmisaka                                               (pps->m_picDisableDeblockingFilterFlag              << 13) |
120*437bfbebSnyanmisaka                                               (pps->m_listsModificationPresentFlag                << 14) |
121*437bfbebSnyanmisaka                                               (pps->m_sliceHeaderExtensionPresentFlag             << 15);
122*437bfbebSnyanmisaka 
123*437bfbebSnyanmisaka     pp->pps_cb_qp_offset                 = pps->m_chromaCbQpOffset;
124*437bfbebSnyanmisaka     pp->pps_cr_qp_offset                 = pps->m_chromaCrQpOffset;
125*437bfbebSnyanmisaka     pp->diff_cu_qp_delta_depth           = pps->m_maxCuDQPDepth;
126*437bfbebSnyanmisaka     pp->pps_beta_offset_div2             = pps->m_deblockingFilterBetaOffsetDiv2;
127*437bfbebSnyanmisaka     pp->pps_tc_offset_div2               = pps->m_deblockingFilterTcOffsetDiv2;
128*437bfbebSnyanmisaka     pp->log2_parallel_merge_level_minus2 = pps->m_log2ParallelMergeLevelMinus2 - 2;
129*437bfbebSnyanmisaka     if (pps->m_tiles_enabled_flag) {
130*437bfbebSnyanmisaka         RK_U8 i = 0;
131*437bfbebSnyanmisaka 
132*437bfbebSnyanmisaka         mpp_assert(pps->m_nNumTileColumnsMinus1 <= 19);
133*437bfbebSnyanmisaka         mpp_assert(pps->m_nNumTileRowsMinus1 <= 21);
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka         pp->num_tile_columns_minus1 = pps->m_nNumTileColumnsMinus1;
136*437bfbebSnyanmisaka         pp->num_tile_rows_minus1 = pps->m_nNumTileRowsMinus1;
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka         for (i = 0; i <= pp->num_tile_columns_minus1; i++)
139*437bfbebSnyanmisaka             pp->column_width_minus1[i] = pps->m_nTileColumnWidthArray[i] - 1;
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka         for (i = 0; i <= pp->num_tile_rows_minus1; i++)
142*437bfbebSnyanmisaka             pp->row_height_minus1[i] = pps->m_nTileRowHeightArray[i] - 1;
143*437bfbebSnyanmisaka     }
144*437bfbebSnyanmisaka }
145*437bfbebSnyanmisaka 
fill_slice_parameters(const H265eCtx * h,H265eSlicParams * sp)146*437bfbebSnyanmisaka static void fill_slice_parameters( const H265eCtx *h,
147*437bfbebSnyanmisaka                                    H265eSlicParams *sp)
148*437bfbebSnyanmisaka {
149*437bfbebSnyanmisaka     MppEncH265Cfg *codec = &h->cfg->h265;
150*437bfbebSnyanmisaka     H265eSlice  *slice = h->slice;
151*437bfbebSnyanmisaka     memset(sp, 0, sizeof(H265eSlicParams));
152*437bfbebSnyanmisaka     if (codec->slice_cfg.split_enable) {
153*437bfbebSnyanmisaka         sp->sli_splt_cpst = 1;
154*437bfbebSnyanmisaka         sp->sli_splt = 1;
155*437bfbebSnyanmisaka         sp->sli_splt_mode = codec->slice_cfg.split_mode;
156*437bfbebSnyanmisaka         if (codec->slice_cfg.split_mode) {
157*437bfbebSnyanmisaka             sp->sli_splt_cnum_m1 = codec->slice_cfg.slice_size - 1;
158*437bfbebSnyanmisaka         } else {
159*437bfbebSnyanmisaka             sp->sli_splt_byte = codec->slice_cfg.slice_size;
160*437bfbebSnyanmisaka         }
161*437bfbebSnyanmisaka         sp->sli_max_num_m1 = 50;
162*437bfbebSnyanmisaka         sp->sli_flsh = 1;
163*437bfbebSnyanmisaka     }
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka     sp->cbc_init_flg        = slice->m_cabacInitFlag;
166*437bfbebSnyanmisaka     sp->mvd_l1_zero_flg     = slice->m_bLMvdL1Zero;
167*437bfbebSnyanmisaka     sp->merge_up_flag       = codec->merge_cfg.merge_up_flag;
168*437bfbebSnyanmisaka     sp->merge_left_flag     = codec->merge_cfg.merge_left_flag;
169*437bfbebSnyanmisaka     sp->ref_pic_lst_mdf_l0  = slice->ref_pic_list_modification_flag_l0;
170*437bfbebSnyanmisaka 
171*437bfbebSnyanmisaka     sp->num_refidx_l1_act   = 0;
172*437bfbebSnyanmisaka     sp->num_refidx_l0_act   = 0;
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka     sp->num_refidx_act_ovrd = (((RK_U32)slice->m_numRefIdx[0] != slice->m_pps->m_numRefIdxL0DefaultActive)
175*437bfbebSnyanmisaka                                || (slice->m_sliceType == B_SLICE &&
176*437bfbebSnyanmisaka                                    (RK_U32)slice->m_numRefIdx[1] != slice->m_pps->m_numRefIdxL1DefaultActive));
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka     sp->sli_sao_chrm_flg    = slice->m_sps->m_bUseSAO && slice->m_saoEnabledFlagChroma;
179*437bfbebSnyanmisaka     sp->sli_sao_luma_flg    = slice->m_sps->m_bUseSAO && slice->m_saoEnabledFlag;
180*437bfbebSnyanmisaka     sp->sli_tmprl_mvp_en    = slice->m_enableTMVPFlag;
181*437bfbebSnyanmisaka 
182*437bfbebSnyanmisaka     sp->pic_out_flg         = slice->m_picOutputFlag;
183*437bfbebSnyanmisaka     sp->slice_type          = slice->m_sliceType;
184*437bfbebSnyanmisaka     sp->slice_rsrv_flg      = 0;
185*437bfbebSnyanmisaka     sp->dpdnt_sli_seg_flg   = 0;
186*437bfbebSnyanmisaka     sp->sli_pps_id          = slice->m_pps->m_PPSId;
187*437bfbebSnyanmisaka     sp->no_out_pri_pic      = slice->no_output_of_prior_pics_flag;
188*437bfbebSnyanmisaka 
189*437bfbebSnyanmisaka     sp->sli_tc_ofst_div2 = slice->m_deblockingFilterTcOffsetDiv2;
190*437bfbebSnyanmisaka     sp->sli_beta_ofst_div2 = slice->m_deblockingFilterBetaOffsetDiv2;
191*437bfbebSnyanmisaka     sp->sli_lp_fltr_acrs_sli = slice->m_LFCrossSliceBoundaryFlag;
192*437bfbebSnyanmisaka     sp->sli_dblk_fltr_dis = slice->m_deblockingFilterDisable;
193*437bfbebSnyanmisaka     sp->dblk_fltr_ovrd_flg = slice->m_deblockingFilterOverrideFlag;
194*437bfbebSnyanmisaka     sp->sli_cb_qp_ofst = slice->m_sliceQpDeltaCb;
195*437bfbebSnyanmisaka     sp->sli_qp = slice->m_sliceQp;
196*437bfbebSnyanmisaka     sp->max_mrg_cnd = slice->m_maxNumMergeCand;
197*437bfbebSnyanmisaka     sp->temporal_id = slice->temporal_id;
198*437bfbebSnyanmisaka     sp->non_reference_flag = slice->m_temporalLayerNonReferenceFlag;
199*437bfbebSnyanmisaka     sp->col_ref_idx = 0;
200*437bfbebSnyanmisaka     sp->col_frm_l0_flg = slice->m_colFromL0Flag;
201*437bfbebSnyanmisaka     sp->sli_poc_lsb = (slice->poc - slice->last_idr + (1 << slice->m_sps->m_bitsForPOC)) %
202*437bfbebSnyanmisaka                       (1 << slice->m_sps->m_bitsForPOC);
203*437bfbebSnyanmisaka     sp->sli_hdr_ext_len = slice->slice_header_extension_length;
204*437bfbebSnyanmisaka }
205*437bfbebSnyanmisaka 
fill_ref_parameters(const H265eCtx * h,H265eSlicParams * sp)206*437bfbebSnyanmisaka RK_S32 fill_ref_parameters(const H265eCtx *h, H265eSlicParams *sp)
207*437bfbebSnyanmisaka {
208*437bfbebSnyanmisaka     H265eSlice  *slice = h->slice;
209*437bfbebSnyanmisaka     H265eReferencePictureSet* rps = slice->m_rps;
210*437bfbebSnyanmisaka     RK_U32 numRpsCurrTempList = 0;
211*437bfbebSnyanmisaka     RK_S32 ref_num = 0;
212*437bfbebSnyanmisaka     H265eDpbFrm *ref_frame;
213*437bfbebSnyanmisaka     RK_S32 i, j, k;
214*437bfbebSnyanmisaka     sp->dlt_poc_msb_prsnt0 = 0;
215*437bfbebSnyanmisaka     sp->dlt_poc_msb_cycl0 = 0;
216*437bfbebSnyanmisaka     sp->tot_poc_num = 0;
217*437bfbebSnyanmisaka     if (slice->m_bdIdx < 0) {
218*437bfbebSnyanmisaka         RK_S32 prev = 0;
219*437bfbebSnyanmisaka         sp->st_ref_pic_flg = 0;
220*437bfbebSnyanmisaka         sp->num_neg_pic = rps->num_negative_pic;
221*437bfbebSnyanmisaka         sp->num_pos_pic = rps->num_positive_pic;
222*437bfbebSnyanmisaka         for (j = 0; j < rps->num_negative_pic; j++) {
223*437bfbebSnyanmisaka             if (0 == j) {
224*437bfbebSnyanmisaka                 sp->dlt_poc_s0_m10 = prev - rps->delta_poc[j] - 1;
225*437bfbebSnyanmisaka                 sp->used_by_s0_flg = rps->m_ref[j];
226*437bfbebSnyanmisaka             } else if (1 == j) {
227*437bfbebSnyanmisaka                 sp->dlt_poc_s0_m11 = prev - rps->delta_poc[j] - 1;
228*437bfbebSnyanmisaka                 sp->used_by_s0_flg |= rps->m_ref[j] << 1;
229*437bfbebSnyanmisaka             } else if (2 == j) {
230*437bfbebSnyanmisaka                 sp->dlt_poc_s0_m12 = prev - rps->delta_poc[j] - 1;
231*437bfbebSnyanmisaka                 sp->used_by_s0_flg |= rps->m_ref[j] << 2;
232*437bfbebSnyanmisaka             } else if (3 == j) {
233*437bfbebSnyanmisaka                 sp->dlt_poc_s0_m13 = prev - rps->delta_poc[j] - 1;
234*437bfbebSnyanmisaka                 sp->used_by_s0_flg |= rps->m_ref[j] << 3;
235*437bfbebSnyanmisaka             }
236*437bfbebSnyanmisaka             prev = rps->delta_poc[j];
237*437bfbebSnyanmisaka         }
238*437bfbebSnyanmisaka     }
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka     for (i = 0; i < rps->m_numberOfPictures; i++) {
241*437bfbebSnyanmisaka         if (rps->m_ref[i]) {
242*437bfbebSnyanmisaka             sp->tot_poc_num++;
243*437bfbebSnyanmisaka         }
244*437bfbebSnyanmisaka     }
245*437bfbebSnyanmisaka 
246*437bfbebSnyanmisaka     if (slice->m_sps->m_bLongTermRefsPresent) {
247*437bfbebSnyanmisaka         RK_S32 numLtrpInSH = rps->num_long_term_pic;
248*437bfbebSnyanmisaka         RK_S32 numLtrpInSPS = 0;
249*437bfbebSnyanmisaka         RK_U32 poc_lsb_lt[3] = { 0, 0, 0 };
250*437bfbebSnyanmisaka         RK_U32 used_by_lt_flg[3] = { 0, 0, 0 };
251*437bfbebSnyanmisaka         RK_U32 dlt_poc_msb_prsnt[3] = { 0, 0, 0 };
252*437bfbebSnyanmisaka         RK_U32 dlt_poc_msb_cycl[3] = { 0, 0, 0 };
253*437bfbebSnyanmisaka         RK_S32 prevDeltaMSB = 0;
254*437bfbebSnyanmisaka         RK_S32 offset = rps->num_negative_pic + rps->num_positive_pic;
255*437bfbebSnyanmisaka         RK_S32 numLongTerm = rps->m_numberOfPictures - offset;
256*437bfbebSnyanmisaka         RK_S32 bitsForLtrpInSPS = 0;
257*437bfbebSnyanmisaka         for (k = rps->m_numberOfPictures - 1; k > rps->m_numberOfPictures - rps->num_long_term_pic - 1; k--) {
258*437bfbebSnyanmisaka             RK_U32 lsb = rps->poc[k] % (1 << slice->m_sps->m_bitsForPOC);
259*437bfbebSnyanmisaka             RK_U32 find_flag = 0;
260*437bfbebSnyanmisaka             for (i = 0; i < (RK_S32)slice->m_sps->m_numLongTermRefPicSPS; i++) {
261*437bfbebSnyanmisaka                 if ((lsb == slice->m_sps->m_ltRefPicPocLsbSps[i]) && (rps->m_used[k] == slice->m_sps->m_usedByCurrPicLtSPSFlag[i])) {
262*437bfbebSnyanmisaka                     find_flag = 1;
263*437bfbebSnyanmisaka                     break;
264*437bfbebSnyanmisaka                 }
265*437bfbebSnyanmisaka             }
266*437bfbebSnyanmisaka 
267*437bfbebSnyanmisaka             if (find_flag)
268*437bfbebSnyanmisaka                 numLtrpInSPS++;
269*437bfbebSnyanmisaka         }
270*437bfbebSnyanmisaka 
271*437bfbebSnyanmisaka         numLtrpInSH -= numLtrpInSPS;
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka         while (slice->m_sps->m_numLongTermRefPicSPS > (RK_U32)(1 << bitsForLtrpInSPS)) {
274*437bfbebSnyanmisaka             bitsForLtrpInSPS++;
275*437bfbebSnyanmisaka         }
276*437bfbebSnyanmisaka 
277*437bfbebSnyanmisaka         if (slice->m_sps->m_numLongTermRefPicSPS > 0) {
278*437bfbebSnyanmisaka             sp->num_lt_sps = numLtrpInSPS;
279*437bfbebSnyanmisaka         }
280*437bfbebSnyanmisaka         sp->num_lt_pic = numLtrpInSH;
281*437bfbebSnyanmisaka         // Note that the LSBs of the LT ref. pic. POCs must be sorted before.
282*437bfbebSnyanmisaka         // Not sorted here because LT ref indices will be used in setRefPicList()
283*437bfbebSnyanmisaka         sp->poc_lsb_lt0 = 0;
284*437bfbebSnyanmisaka         sp->used_by_lt_flg0 = 0;
285*437bfbebSnyanmisaka         sp->dlt_poc_msb_prsnt0 = 0;
286*437bfbebSnyanmisaka         sp->dlt_poc_msb_cycl0 = 0;
287*437bfbebSnyanmisaka         sp->poc_lsb_lt1 = 0;
288*437bfbebSnyanmisaka         sp->used_by_lt_flg1 = 0;
289*437bfbebSnyanmisaka         sp->dlt_poc_msb_prsnt1 = 0;
290*437bfbebSnyanmisaka         sp->dlt_poc_msb_cycl1 = 0;
291*437bfbebSnyanmisaka         sp->poc_lsb_lt2 = 0;
292*437bfbebSnyanmisaka         sp->used_by_lt_flg2 = 0;
293*437bfbebSnyanmisaka         sp->dlt_poc_msb_prsnt2 = 0;
294*437bfbebSnyanmisaka         sp->dlt_poc_msb_cycl2 = 0;
295*437bfbebSnyanmisaka 
296*437bfbebSnyanmisaka         for ( i = rps->m_numberOfPictures - 1; i > offset - 1; i--) {
297*437bfbebSnyanmisaka             RK_U32 deltaFlag = 0;
298*437bfbebSnyanmisaka             if ((i == rps->m_numberOfPictures - 1) || (i == rps->m_numberOfPictures - 1 - numLtrpInSPS)) {
299*437bfbebSnyanmisaka                 deltaFlag = 1;
300*437bfbebSnyanmisaka             }
301*437bfbebSnyanmisaka             poc_lsb_lt[numLongTerm - 1 - (i - offset)] = rps->m_pocLSBLT[i];
302*437bfbebSnyanmisaka             used_by_lt_flg[numLongTerm - 1 - (i - offset)] = rps->m_ref[i];
303*437bfbebSnyanmisaka             dlt_poc_msb_prsnt[numLongTerm - 1 - (i - offset)] = rps->m_deltaPocMSBPresentFlag[i];
304*437bfbebSnyanmisaka 
305*437bfbebSnyanmisaka             if (rps->m_deltaPocMSBPresentFlag[i]) {
306*437bfbebSnyanmisaka                 if (deltaFlag) {
307*437bfbebSnyanmisaka                     dlt_poc_msb_cycl[numLongTerm - 1 - (i - offset)] = rps->m_deltaPOCMSBCycleLT[i];
308*437bfbebSnyanmisaka                 } else {
309*437bfbebSnyanmisaka                     RK_S32 differenceInDeltaMSB = rps->m_deltaPOCMSBCycleLT[i] - prevDeltaMSB;
310*437bfbebSnyanmisaka                     mpp_assert(differenceInDeltaMSB >= 0);
311*437bfbebSnyanmisaka                     dlt_poc_msb_cycl[numLongTerm - 1 - (i - offset)] = differenceInDeltaMSB;
312*437bfbebSnyanmisaka                 }
313*437bfbebSnyanmisaka             }
314*437bfbebSnyanmisaka             prevDeltaMSB = rps->m_deltaPOCMSBCycleLT[i];
315*437bfbebSnyanmisaka         }
316*437bfbebSnyanmisaka 
317*437bfbebSnyanmisaka         sp->poc_lsb_lt0 = poc_lsb_lt[0];
318*437bfbebSnyanmisaka         sp->used_by_lt_flg0 = used_by_lt_flg[0];
319*437bfbebSnyanmisaka         sp->dlt_poc_msb_prsnt0 = dlt_poc_msb_prsnt[0];
320*437bfbebSnyanmisaka         sp->dlt_poc_msb_cycl0 = dlt_poc_msb_cycl[0];
321*437bfbebSnyanmisaka         sp->poc_lsb_lt1 = poc_lsb_lt[1];
322*437bfbebSnyanmisaka         sp->used_by_lt_flg1 = used_by_lt_flg[1];
323*437bfbebSnyanmisaka         sp->dlt_poc_msb_prsnt1 = dlt_poc_msb_prsnt[1];
324*437bfbebSnyanmisaka         sp->dlt_poc_msb_cycl1 = dlt_poc_msb_cycl[1];
325*437bfbebSnyanmisaka         sp->poc_lsb_lt2 = poc_lsb_lt[2];
326*437bfbebSnyanmisaka         sp->used_by_lt_flg2 = used_by_lt_flg[2];
327*437bfbebSnyanmisaka         sp->dlt_poc_msb_prsnt2 = dlt_poc_msb_prsnt[2];
328*437bfbebSnyanmisaka         sp->dlt_poc_msb_cycl2 = dlt_poc_msb_cycl[2];
329*437bfbebSnyanmisaka     }
330*437bfbebSnyanmisaka 
331*437bfbebSnyanmisaka     sp->lst_entry_l0 = 0;
332*437bfbebSnyanmisaka     sp->ref_pic_lst_mdf_l0 = 0;
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka     if (slice->m_sliceType == I_SLICE) {
335*437bfbebSnyanmisaka         numRpsCurrTempList = 0;
336*437bfbebSnyanmisaka     } else {
337*437bfbebSnyanmisaka         ref_num = rps->num_negative_pic + rps->num_positive_pic + rps->num_long_term_pic;
338*437bfbebSnyanmisaka         for (i = 0; i < ref_num; i++) {
339*437bfbebSnyanmisaka             if (rps->m_used[i]) {
340*437bfbebSnyanmisaka                 numRpsCurrTempList++;
341*437bfbebSnyanmisaka             }
342*437bfbebSnyanmisaka         }
343*437bfbebSnyanmisaka     }
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka     if (slice->m_pps->m_listsModificationPresentFlag && numRpsCurrTempList > 1) {
346*437bfbebSnyanmisaka         H265eRefPicListModification* refPicListModification = &slice->m_RefPicListModification;
347*437bfbebSnyanmisaka         if (slice->m_sliceType != I_SLICE) {
348*437bfbebSnyanmisaka             sp->ref_pic_lst_mdf_l0 = refPicListModification->m_refPicListModificationFlagL0 ? 1 : 0;
349*437bfbebSnyanmisaka             if (sp->ref_pic_lst_mdf_l0) {
350*437bfbebSnyanmisaka                 sp->lst_entry_l0 = refPicListModification->m_RefPicSetIdxL0[0];
351*437bfbebSnyanmisaka             }
352*437bfbebSnyanmisaka         }
353*437bfbebSnyanmisaka     }
354*437bfbebSnyanmisaka 
355*437bfbebSnyanmisaka     sp->recon_pic.slot_idx = h->dpb->curr->slot_idx;
356*437bfbebSnyanmisaka     ref_frame = slice->m_refPicList[0][0];
357*437bfbebSnyanmisaka 
358*437bfbebSnyanmisaka     if (ref_frame) {
359*437bfbebSnyanmisaka         if (ref_frame->status.force_pskip_is_ref)
360*437bfbebSnyanmisaka             sp->ref_pic.slot_idx =  slice->m_refPicList[0][0]->prev_ref_idx;
361*437bfbebSnyanmisaka         else
362*437bfbebSnyanmisaka             sp->ref_pic.slot_idx = ref_frame->slot_idx;
363*437bfbebSnyanmisaka     } else {
364*437bfbebSnyanmisaka         sp->ref_pic.slot_idx = h->dpb->curr->slot_idx;
365*437bfbebSnyanmisaka     }
366*437bfbebSnyanmisaka     return  0;
367*437bfbebSnyanmisaka }
368*437bfbebSnyanmisaka 
h265e_syntax_fill(void * ctx)369*437bfbebSnyanmisaka RK_S32 h265e_syntax_fill(void *ctx)
370*437bfbebSnyanmisaka {
371*437bfbebSnyanmisaka     H265eCtx *h = (H265eCtx *)ctx;
372*437bfbebSnyanmisaka     H265eSyntax_new *syn = (H265eSyntax_new*)&h->syntax;
373*437bfbebSnyanmisaka 
374*437bfbebSnyanmisaka     fill_picture_parameters(h, &syn->pp);
375*437bfbebSnyanmisaka     fill_slice_parameters(h, &syn->sp);
376*437bfbebSnyanmisaka     fill_ref_parameters(h, &syn->sp);
377*437bfbebSnyanmisaka     syn->dpb = h->dpb;
378*437bfbebSnyanmisaka     return 0;
379*437bfbebSnyanmisaka }
380