hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
/*
 *
 * Copyright 2015 Rockchip Electronics Co. LTD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
/*
 * @file        h265d_parser.h
 * @brief
 * @author      csy(csy@rock-chips.com)
 
 * @version     1.0.0
 * @history
 *   2015.7.15 : Create
 */
 
 
#ifndef __H265D_PARSER_H__
#define __H265D_PARSER_H__
 
#include <limits.h>
#include <string.h>
 
#include "mpp_debug.h"
#include "mpp_bitread.h"
#include "mpp_buf_slot.h"
#include "mpp_mem_pool.h"
 
#include "hal_dec_task.h"
#include "h265d_codec.h"
#include "h265_syntax.h"
 
extern RK_U32 h265d_debug;
 
#define H265D_DBG_FUNCTION          (0x00000001)
#define H265D_DBG_VPS               (0x00000002)
#define H265D_DBG_SPS               (0x00000004)
#define H265D_DBG_PPS               (0x00000008)
#define H265D_DBG_SLICE_HDR         (0x00000010)
#define H265D_DBG_SEI               (0x00000020)
#define H265D_DBG_GLOBAL            (0x00000040)
#define H265D_DBG_REF               (0x00000080)
#define H265D_DBG_TIME              (0x00000100)
 
 
#define h265d_dbg(flag, fmt, ...) _mpp_dbg(h265d_debug, flag, fmt, ## __VA_ARGS__)
 
#define MAX_FRAME_SIZE 2048000
 
typedef struct ShortTermRPS {
    RK_U32 num_negative_pics;
    RK_S32 num_delta_pocs;
    RK_S32 rps_idx_num_delta_pocs;
    RK_S32 delta_poc[32];
    RK_U8  used[32];
} ShortTermRPS;
 
typedef struct LongTermRPS {
    RK_S32  poc[32];
    RK_U8   used[32];
    RK_U8   nb_refs;
} LongTermRPS;
 
typedef struct RefPicList {
    struct HEVCFrame *ref[MAX_REFS];
    RK_S32 list[MAX_REFS];
    RK_S32 isLongTerm[MAX_REFS];
    RK_S32 nb_refs;
} RefPicList;
 
typedef struct RefPicListTab {
    RefPicList refPicList[2];
} RefPicListTab;
 
typedef struct HEVCWindow {
    RK_S32 left_offset;
    RK_S32 right_offset;
    RK_S32 top_offset;
    RK_S32 bottom_offset;
} HEVCWindow;
 
typedef struct VUI {
    MppRational_t sar;
 
    RK_S32 overscan_info_present_flag;
    RK_S32 overscan_appropriate_flag;
 
    RK_S32 video_signal_type_present_flag;
    RK_S32 video_format;
    RK_S32 video_full_range_flag;
    RK_S32 colour_description_present_flag;
    RK_U8  colour_primaries;
    RK_U8  transfer_characteristic;
    RK_U8  matrix_coeffs;
 
    RK_S32 chroma_loc_info_present_flag;
    RK_S32 chroma_sample_loc_type_top_field;
    RK_S32 chroma_sample_loc_type_bottom_field;
    RK_S32 neutra_chroma_indication_flag;
 
    RK_S32 field_seq_flag;
    RK_S32 frame_field_info_present_flag;
 
    RK_S32 default_display_window_flag;
    HEVCWindow def_disp_win;
 
    RK_S32 vui_timing_info_present_flag;
    RK_U32 vui_num_units_in_tick;
    RK_U32 vui_time_scale;
    RK_S32 vui_poc_proportional_to_timing_flag;
    RK_S32 vui_num_ticks_poc_diff_one_minus1;
    RK_S32 vui_hrd_parameters_present_flag;
 
    RK_S32 bitstream_restriction_flag;
    RK_S32 tiles_fixed_structure_flag;
    RK_S32 motion_vectors_over_pic_boundaries_flag;
    RK_S32 restricted_ref_pic_lists_flag;
    RK_S32 min_spatial_segmentation_idc;
    RK_S32 max_bytes_per_pic_denom;
    RK_S32 max_bits_per_min_cu_denom;
    RK_S32 log2_max_mv_length_horizontal;
    RK_S32 log2_max_mv_length_vertical;
} VUI;
 
typedef struct PTLCommon {
    RK_U8 profile_space;
    RK_U8 tier_flag;
    RK_U8 profile_idc;
    RK_U8 profile_compatibility_flag[32];
    RK_U8 level_idc;
    RK_U8 progressive_source_flag;
    RK_U8 interlaced_source_flag;
    RK_U8 non_packed_constraint_flag;
    RK_U8 frame_only_constraint_flag;
} PTLCommon;
 
typedef struct PTL {
    PTLCommon general_ptl;
    PTLCommon sub_layer_ptl[MAX_SUB_LAYERS];
 
    RK_U8  sub_layer_profile_present_flag[MAX_SUB_LAYERS];
    RK_U8  sub_layer_level_present_flag[MAX_SUB_LAYERS];
 
    RK_S32 sub_layer_profile_space[MAX_SUB_LAYERS];
    RK_U8  sub_layer_tier_flag[MAX_SUB_LAYERS];
    RK_S32 sub_layer_profile_idc[MAX_SUB_LAYERS];
    RK_U8  sub_layer_profile_compatibility_flags[MAX_SUB_LAYERS][32];
    RK_S32 sub_layer_level_idc[MAX_SUB_LAYERS];
} PTL;
 
typedef struct HEVCVPS {
    RK_U8  vps_temporal_id_nesting_flag;
    RK_S32 vps_max_layers;
    RK_S32 vps_max_sub_layers; ///< vps_max_temporal_layers_minus1 + 1
 
    PTL     ptl;
    RK_S32 vps_sub_layer_ordering_info_present_flag;
    RK_U32 vps_max_dec_pic_buffering[MAX_SUB_LAYERS];
    RK_U32 vps_num_reorder_pics[MAX_SUB_LAYERS];
    RK_U32 vps_max_latency_increase[MAX_SUB_LAYERS];
    RK_S32 vps_max_layer_id;
    RK_S32 vps_num_layer_sets; ///< vps_num_layer_sets_minus1 + 1
    RK_U8  vps_timing_info_present_flag;
    RK_U32 vps_num_units_in_tick;
    RK_U32 vps_time_scale;
    RK_U8  vps_poc_proportional_to_timing_flag;
    RK_S32 vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1
    RK_S32 vps_num_hrd_parameters;
 
    RK_S32 vps_extension_flag;
 
} HEVCVPS;
 
typedef struct ScalingList {
    /* This is a little wasteful, since sizeID 0 only needs 8 coeffs,
     * and size ID 3 only has 2 arrays, not 6. */
    RK_U8 sl[4][6][64];
    RK_U8 sl_dc[2][6];
} ScalingList;
 
typedef struct HEVCSPS {
    RK_U32 vps_id;
    RK_S32 sps_id;
    RK_S32 chroma_format_idc;
    RK_U8 separate_colour_plane_flag;
 
    ///< output (i.e. cropped) values
    RK_S32 output_width, output_height;
    HEVCWindow output_window;
 
    HEVCWindow pic_conf_win;
 
    RK_S32 bit_depth;
    RK_S32 bit_depth_chroma;///<- zrh add
    RK_S32 pixel_shift;
    RK_S32 pix_fmt;
 
    RK_U32 log2_max_poc_lsb;
    RK_S32 pcm_enabled_flag;
 
    RK_S32 max_sub_layers;
    struct {
        int max_dec_pic_buffering;
        int num_reorder_pics;
        int max_latency_increase;
    } temporal_layer[MAX_SUB_LAYERS];
 
    VUI vui;
    PTL ptl;
 
    RK_U8 scaling_list_enable_flag;
    ScalingList scaling_list;
 
    RK_U32 nb_st_rps;
    ShortTermRPS st_rps[MAX_SHORT_TERM_RPS_COUNT];
 
    RK_U8 amp_enabled_flag;
    RK_U8 sao_enabled;
 
    RK_U8 long_term_ref_pics_present_flag;
    RK_U16 lt_ref_pic_poc_lsb_sps[32];
    RK_U8 used_by_curr_pic_lt_sps_flag[32];
    RK_U8 num_long_term_ref_pics_sps;
 
    struct {
        RK_U8  bit_depth;
        RK_U8  bit_depth_chroma;
        RK_U32 log2_min_pcm_cb_size;
        RK_U32 log2_max_pcm_cb_size;
        RK_U8  loop_filter_disable_flag;
    } pcm;
    RK_U8 sps_temporal_mvp_enabled_flag;
    RK_U8 sps_strong_intra_smoothing_enable_flag;
 
    RK_U32 log2_min_cb_size;
    RK_U32 log2_diff_max_min_coding_block_size;
    RK_U32 log2_min_tb_size;
    RK_U32 log2_max_trafo_size;
    RK_S32 log2_ctb_size;
    RK_U32 log2_min_pu_size;
 
    RK_S32 max_transform_hierarchy_depth_inter;
    RK_S32 max_transform_hierarchy_depth_intra;
 
    ///< coded frame dimension in various units
    RK_S32 width;
    RK_S32 height;
    RK_S32 ctb_width;
    RK_S32 ctb_height;
    RK_S32 ctb_size;
    RK_S32 min_cb_width;
    RK_S32 min_cb_height;
    RK_S32 min_tb_width;
    RK_S32 min_tb_height;
    RK_S32 min_pu_width;
    RK_S32 min_pu_height;
 
    RK_S32 hshift[3];
    RK_S32 vshift[3];
 
    RK_S32 qp_bd_offset;
#ifdef SCALED_REF_LAYER_OFFSETS
    HEVCWindow      scaled_ref_layer_window;
#endif
#ifdef REF_IDX_MFM
    RK_S32 set_mfm_enabled_flag;
#endif
} HEVCSPS;
 
typedef struct HevcPpsBufInfo_t {
    RK_U32 *column_width;       ///< ColumnWidth
    RK_U32 *row_height;         ///< RowHeight
 
    RK_S32 column_width_size;
    RK_S32 row_height_size;
} HevcPpsBufInfo;
 
typedef struct HEVCPPS {
    RK_S32 sps_id;
    RK_S32 pps_id;
 
    RK_U8 sign_data_hiding_flag;
 
    RK_U8 cabac_init_present_flag;
 
    RK_S32 num_ref_idx_l0_default_active; ///< num_ref_idx_l0_default_active_minus1 + 1
    RK_S32 num_ref_idx_l1_default_active; ///< num_ref_idx_l1_default_active_minus1 + 1
    RK_S32 pic_init_qp_minus26;
 
    RK_U8 constrained_intra_pred_flag;
    RK_U8 transform_skip_enabled_flag;
 
    RK_U8 cu_qp_delta_enabled_flag;
    RK_S32 diff_cu_qp_delta_depth;
 
    RK_S32 cb_qp_offset;
    RK_S32 cr_qp_offset;
    RK_U8 pic_slice_level_chroma_qp_offsets_present_flag;
    RK_U8 weighted_pred_flag;
    RK_U8 weighted_bipred_flag;
    RK_U8 output_flag_present_flag;
    RK_U8 transquant_bypass_enable_flag;
 
    RK_U8 dependent_slice_segments_enabled_flag;
    RK_U8 tiles_enabled_flag;
    RK_U8 entropy_coding_sync_enabled_flag;
 
    RK_S32 num_tile_columns;   ///< num_tile_columns_minus1 + 1
    RK_S32 num_tile_rows;      ///< num_tile_rows_minus1 + 1
    RK_U8 uniform_spacing_flag;
    RK_U8 loop_filter_across_tiles_enabled_flag;
 
    RK_U8 seq_loop_filter_across_slices_enabled_flag;
 
    RK_U8 deblocking_filter_control_present_flag;
    RK_U8 deblocking_filter_override_enabled_flag;
    RK_U8 disable_dbf;
    RK_S32 beta_offset;    ///< beta_offset_div2 * 2
    RK_S32 tc_offset;      ///< tc_offset_div2 * 2
 
    RK_U8 scaling_list_data_present_flag;
    ScalingList scaling_list;
 
    RK_U8 lists_modification_present_flag;
    RK_S32 log2_parallel_merge_level; ///< log2_parallel_merge_level_minus2 + 2
    RK_S32 num_extra_slice_header_bits;
    RK_U8 slice_header_extension_present_flag;
 
    RK_U8 pps_extension_flag;
    RK_U8 pps_range_extensions_flag;
    RK_U8 pps_extension_data_flag;
 
    // Inferred parameters
    HevcPpsBufInfo bufs;
} HEVCPPS;
 
typedef struct SliceHeader {
    RK_U32 pps_id;
 
    ///< address (in raster order) of the first block in the current slice segment
    RK_U32   slice_segment_addr;
    ///< address (in raster order) of the first block in the current slice
    RK_U32   slice_addr;
 
    SliceType slice_type;
 
    RK_S32 pic_order_cnt_lsb;
 
    RK_U8 first_slice_in_pic_flag;
    RK_U8 dependent_slice_segment_flag;
    RK_U8 pic_output_flag;
    RK_U8 colour_plane_id;
 
    ///< RPS coded in the slice header itself is stored here
    int short_term_ref_pic_set_sps_flag;
    int short_term_ref_pic_set_size;
    ShortTermRPS slice_rps;
    const ShortTermRPS *short_term_rps;
    LongTermRPS long_term_rps;
    RK_U32 list_entry_lx[2][32];
 
    RK_U8 rpl_modification_flag[2];
    RK_U8 no_output_of_prior_pics_flag;
    RK_U8 slice_temporal_mvp_enabled_flag;
 
    RK_U32 nb_refs[2];
 
    RK_U8 slice_sample_adaptive_offset_flag[3];
    RK_U8 mvd_l1_zero_flag;
 
    RK_U8 cabac_init_flag;
    RK_U8 disable_deblocking_filter_flag; ///< slice_header_disable_deblocking_filter_flag
    RK_U8 slice_loop_filter_across_slices_enabled_flag;
    RK_U8 collocated_list;
 
    RK_U32 collocated_ref_idx;
 
    RK_S32 slice_qp_delta;
    RK_S32 slice_cb_qp_offset;
    RK_S32 slice_cr_qp_offset;
 
    RK_S32 beta_offset;    ///< beta_offset_div2 * 2
    RK_S32 tc_offset;      ///< tc_offset_div2 * 2
 
    RK_U32 max_num_merge_cand; ///< 5 - 5_minus_max_num_merge_cand
 
    RK_S32 *entry_point_offset;
    RK_S32 * offset;
    RK_S32 * size;
    RK_S32 num_entry_point_offsets;
 
    RK_S8 slice_qp;
 
    RK_U8 luma_log2_weight_denom;
    RK_S16 chroma_log2_weight_denom;
 
    RK_S16 luma_weight_l0[16];
    RK_S16 chroma_weight_l0[16][2];
    RK_S16 chroma_weight_l1[16][2];
    RK_S16 luma_weight_l1[16];
 
    RK_S16 luma_offset_l0[16];
    RK_S16 chroma_offset_l0[16][2];
 
    RK_S16 luma_offset_l1[16];
    RK_S16 chroma_offset_l1[16][2];
 
#ifdef REF_IDX_FRAMEWORK
    RK_S32 inter_layer_pred_enabled_flag;
#endif
 
#ifdef JCTVC_M0458_INTERLAYER_RPS_SIG
    RK_S32     active_num_ILR_ref_idx;        //< Active inter-layer reference pictures
    RK_S32     inter_layer_pred_layer_idc[MAX_VPS_LAYER_ID_PLUS1];
#endif
 
    RK_S32 slice_ctb_addr_rs;
} SliceHeader;
 
typedef struct CurrentFameInf {
    HEVCVPS vps[MAX_VPS_COUNT];
    HEVCSPS sps[MAX_SPS_COUNT];
    HEVCPPS pps[MAX_PPS_COUNT];
    SliceHeader sh;
} CurrentFameInf_t;
 
typedef struct DBParams {
    RK_S32 beta_offset;
    RK_S32 tc_offset;
} DBParams;
 
#define HEVC_FRAME_FLAG_OUTPUT    (1 << 0)
#define HEVC_FRAME_FLAG_SHORT_REF (1 << 1)
#define HEVC_FRAME_FLAG_LONG_REF  (1 << 2)
 
typedef struct HEVCFrame {
    MppFrame   frame;
    RefPicList *refPicList;
    RK_S32 ctb_count;
    RK_S32 poc;
    struct HEVCFrame *collocated_ref;
 
    HEVCWindow window;
 
    /**
     * A sequence counter, so that old frames are output first
     * after a POC reset
     */
    RK_U16 sequence;
 
    /**
     * A combination of HEVC_FRAME_FLAG_*
     */
    RK_U8 flags;
    RK_S32 slot_index;
    RK_U8  error_flag;
} HEVCFrame;
 
typedef struct HEVCNAL {
    RK_U8 *rbsp_buffer;
    RK_S32 rbsp_buffer_size;
    RK_S32 size;
    const RK_U8 *data;
} HEVCNAL;
 
typedef struct HEVCLocalContext {
    BitReadCtx_t gb;
} HEVCLocalContext;
 
 
typedef struct REF_PIC_DEC_INFO {
    RK_U8          dpb_index;
    RK_U8          is_long_term;
} REF_PIC_DEC_INFO;
 
typedef struct HEVCContext {
    H265dContext_t *h265dctx;
 
    HEVCLocalContext    *HEVClc;
 
    MppFrame frame;
 
    const HEVCVPS *vps;
    const HEVCSPS *sps;
    const HEVCPPS *pps;
    RK_U8 *vps_list[MAX_VPS_COUNT];
    RK_U8 *sps_list[MAX_SPS_COUNT];
    RK_U8 *pps_list[MAX_PPS_COUNT];
 
    MppMemPool sps_pool;
 
    SliceHeader sh;
 
    ///< candidate references for the current frame
    RefPicList rps[5];
 
    enum NALUnitType nal_unit_type;
    RK_S32 temporal_id;  ///< temporal_id_plus1 - 1
    HEVCFrame *ref;
    HEVCFrame DPB[MAX_DPB_SIZE];
    RK_S32 poc;
    RK_S32 pocTid0;
    RK_S32 slice_idx; ///< number of the slice being currently decoded
    RK_S32 eos;       ///< current packet contains an EOS/EOB NAL
    RK_S32 max_ra;
 
    RK_S32 is_decoded;
 
 
    /** used on BE to byteswap the lines for checksumming */
    RK_U8  *checksum_buf;
    RK_S32      checksum_buf_size;
 
    /**
     * Sequence counters for decoded and output frames, so that old
     * frames are output first after a POC reset
     */
    RK_U16 seq_decode;
    RK_U16 seq_output;
 
    RK_S32 wpp_err;
    RK_S32 skipped_bytes;
 
    RK_U8 *data;
 
    HEVCNAL *nals;
    RK_S32 nb_nals;
    RK_S32 nals_allocated;
    // type of the first VCL NAL of the current frame
    enum NALUnitType first_nal_type;
 
    RK_U8 context_initialized;
    RK_U8 is_nalff;       ///< this flag is != 0 if bitstream is encapsulated
    ///< as a format defined in 14496-15
    RK_S32 temporal_layer_id;
    RK_S32 decoder_id;
    RK_S32 apply_defdispwin;
 
    RK_S32 active_seq_parameter_set_id;
 
    RK_S32 nal_length_size;    ///< Number of bytes used for nal length (1, 2 or 4)
    RK_S32 nuh_layer_id;
 
    /** frame packing arrangement variables */
    RK_S32 sei_frame_packing_present;
    RK_S32 frame_packing_arrangement_type;
    RK_S32 content_interpretation_type;
    RK_S32 quincunx_subsampling;
 
    RK_S32 picture_struct;
 
    /** 1 if the independent slice segment header was successfully parsed */
    RK_U8 slice_initialized;
 
    RK_S32     decode_checksum_sei;
 
 
    RK_U8     scaling_list[81][1360];
    RK_U8     scaling_list_listen[81];
    RK_U8     sps_list_of_updated[MAX_SPS_COUNT];///< zrh add
    RK_U8     pps_list_of_updated[MAX_PPS_COUNT];///< zrh add
 
    RK_S32    rps_used[16];
    RK_S32    nb_rps_used;
    REF_PIC_DEC_INFO rps_pic_info[600][2][15];      // zrh add
    RK_U8     lowdelay_flag[600];
    RK_U8     rps_bit_offset[600];
    RK_U8     rps_bit_offset_st[600];
    RK_U8     slice_nb_rps_poc[600];
 
    RK_S32    frame_size;
 
    RK_S32    framestrid;
 
    RK_U32    nb_frame;
 
    RK_U8     output_frame_idx;
 
    RK_U32    got_frame;
    RK_U32    extra_has_frame;
 
    MppFrameMasteringDisplayMetadata mastering_display;
    MppFrameContentLightMetadata content_light;
 
    MppBufSlots slots;
 
    MppBufSlots packet_slots;
    HalDecTask *task;
 
    MppPacket input_packet;
    void *hal_pic_private;
 
    RK_S64 pts;
    RK_U8  has_get_eos;
    RK_U8  miss_ref_flag;
    RK_U8  pre_pps_id;
    RK_U8  ps_need_upate;
 
    /*temporary storage for slice_cut_param*/
    RK_U32  start_bit;
    RK_U32  end_bit;
    void   *pre_pps_data;
    RK_S32  pps_len;
    RK_S32  pps_buf_size;
} HEVCContext;
 
RK_S32 mpp_hevc_decode_short_term_rps(HEVCContext *s, ShortTermRPS *rps,
                                      const HEVCSPS *sps, RK_S32 is_slice_header);
RK_S32 mpp_hevc_decode_nal_vps(HEVCContext *s);
RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s);
RK_S32 mpp_hevc_decode_nal_pps(HEVCContext *s);
RK_S32 mpp_hevc_decode_nal_sei(HEVCContext *s);
 
RK_S32 mpp_hevc_extract_rbsp(HEVCContext *s, const RK_U8 *src, RK_S32 length,
                             HEVCNAL *nal);
 
 
/**
 * Mark all frames in DPB as unused for reference.
 */
void mpp_hevc_clear_refs(HEVCContext *s);
 
/**
 * Drop all frames currently in DPB.
 */
void mpp_hevc_flush_dpb(HEVCContext *s);
 
/**
 * Compute POC of the current frame and return it.
 */
int mpp_hevc_compute_poc(HEVCContext *s, RK_S32 poc_lsb);
 
 
/**
 * Construct the reference picture sets for the current frame.
 */
RK_S32 mpp_hevc_frame_rps(HEVCContext *s);
 
/**
 * Construct the reference picture list(s) for the current slice.
 */
RK_S32 mpp_hevc_slice_rpl(HEVCContext *s);
 
/**
 * Get the number of candidate references for the current frame.
 */
RK_S32 mpp_hevc_frame_nb_refs(HEVCContext *s);
RK_S32 mpp_hevc_set_new_ref(HEVCContext *s, MppFrame *frame, RK_S32 poc);
 
/**
 * Find next frame in output order and put a reference to it in frame.
 * @return 1 if a frame was output, 0 otherwise
 */
void mpp_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, RK_S32 flags);
 
void mpp_hevc_pps_free(RK_U8 *data);
 
#endif /* __H265D_PAESER_H__ */