hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
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
/*
 * 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.
 */
 
#ifndef __H265E_DPB_H__
#define __H265E_DPB_H__
 
#include "mpp_buffer.h"
#include "h265e_slice.h"
#include "h265_syntax.h"
#include "mpp_enc_cfg.h"
 
/*
 * H.265 encoder dpb structure info
 *
 *     +----------+ DPB +-> build list +-> REF_LIST
 *     |             +                        +
 *     v             v                        v
 * FRM_BUF_GRP    DPB_FRM +------+------> RPS
 *     +             +
 *     |             v
 *     +--------> FRM_BUF
 *
 * H265eDpb is overall structure contain the whole dpb info.
 * It is composed H265eDpbFrm and H265eRpsList.
 *
 */
 
#define H265E_MAX_BUF_CNT   8
#define H265_MAX_GOP        64          ///< max. value of hierarchical GOP size
#define H265_MAX_GOP_CNT    (H265_MAX_GOP + 1)
 
#define RPSLIST_MAX         (H265_MAX_GOP * 3)
 
typedef struct  H265eDpb_t          H265eDpb;
typedef struct  H265eReferencePictureSet_e H265eReferencePictureSet;
typedef struct  H265eRefPicListModification_e H265eRefPicListModification;
typedef struct  H265eSlice_e  H265eSlice;
 
 
typedef struct  H265eDpb_t          H265eDpb;
 
/*
 * Split reference frame configure to two parts
 * The first part is slice depended info like poc / frame_num, and frame
 * type and flags.
 * The other part is gop structure depended info like gop index, ref_status
 * and ref_frm_index. This part is inited from dpb gop hierarchy info.
 */
 
typedef struct  H265eDpbFrm_t {
    H265eDpb            *dpb;
 
    RK_S32              slot_idx;
    RK_S32              seq_idx;
    RK_S32              gop_idx;
    RK_S32              gop_cnt;
    EncFrmStatus        status;
 
    RK_U32              on_used;
    RK_U32              inited;
 
    RK_U32              is_long_term;
    RK_U32              used_by_cur;
    RK_U32              check_lt_msb;
    RK_S32              poc;
 
    H265eSlice          *slice;
 
    RK_S64              pts;
    RK_S64              dts;
 
    RK_U32              is_key_frame;
} H265eDpbFrm;
 
typedef struct H265eRpsList_e {
    RK_S32 lt_num;
    RK_S32 st_num;
    RK_S32 poc_cur_list;
 
    RK_S32 poc[RPSLIST_MAX];
 
    RK_U32 used_by_cur[MAX_REFS];
 
    H265eRefPicListModification  *m_RefPicListModification;
} H265eRpsList;
 
 
/*
 * dpb frame arrangement
 *
 * If dpb size is 3 then dpb frame will be total 4 frames.
 * Then the frame 3 is always current frame and frame 0~2 is reference frame
 * in the gop structure.
 *
 * When one frame is encoded all it info will be moved to its gop position for
 * next frame encoding.
 */
typedef struct H265eDpb_t {
    RK_S32             seq_idx;
    RK_S32             gop_idx;
    // status and count for one gop structure
 
    RK_S32              last_idr;
    RK_S32              poc_cra;
    RK_U32              refresh_pending;
    RK_S32              max_ref_l0;
    RK_S32              max_ref_l1;
 
    H265eRpsList        RpsList;
    H265eDpbFrm         *curr;
    H265eDpbFrm         frame_list[MAX_REFS + 1];
} H265eDpb;
 
#ifdef __cplusplus
extern "C" {
#endif
 
void h265e_set_ref_list(H265eRpsList *RpsList, H265eReferencePictureSet *m_pRps);
MPP_RET h265e_dpb_init(H265eDpb **dpb);
MPP_RET h265e_dpb_deinit(H265eDpb *dpb);
MPP_RET h265e_dpb_setup_buf_size(H265eDpb *dpb, RK_U32 size[], RK_U32 count);
MPP_RET h265e_dpb_get_curr(H265eDpb *dpb);
void h265e_dpb_build_list(H265eDpb *dpb, EncCpbStatus *cpb);
void h265e_dpb_proc_cpb(H265eDpb *dpb, EncCpbStatus *cpb);
 
#define h265e_dpb_dump_frms(dpb) h265e_dpb_dump_frm(dpb, __FUNCTION__)
 
void h265e_dpb_dump_frm(H265eDpb *dpb, const char *caller);
 
#ifdef __cplusplus
}
#endif
 
#endif /* __H265E_DPB_H__ */