xref: /rockchip-linux_mpp/mpp/codec/enc/h264/h264e_slice.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #ifndef __H264E_SLICE_H__
18*437bfbebSnyanmisaka #define __H264E_SLICE_H__
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include "mpp_enc_cfg.h"
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "h264e_syntax.h"
23*437bfbebSnyanmisaka #include "h264e_sps.h"
24*437bfbebSnyanmisaka #include "h264e_pps.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka /*
27*437bfbebSnyanmisaka  * For H.264 encoder slice header process.
28*437bfbebSnyanmisaka  * Remove some syntax that encoder not supported.
29*437bfbebSnyanmisaka  * Field, mbaff, B slice are not supported yet.
30*437bfbebSnyanmisaka  *
31*437bfbebSnyanmisaka  * The reorder and mmco syntax will be create by dpb and attach to slice.
32*437bfbebSnyanmisaka  * Then slice syntax will be passed to hal to config hardware or modify the
33*437bfbebSnyanmisaka  * hardware stream.
34*437bfbebSnyanmisaka  */
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka /* reference picture list modification operation */
37*437bfbebSnyanmisaka typedef struct H264eRplmo_t {
38*437bfbebSnyanmisaka     RK_S32      modification_of_pic_nums_idc;
39*437bfbebSnyanmisaka     RK_S32      abs_diff_pic_num_minus1;
40*437bfbebSnyanmisaka     RK_S32      long_term_pic_idx;
41*437bfbebSnyanmisaka     RK_S32      abs_diff_view_idx_minus1;
42*437bfbebSnyanmisaka } H264eRplmo;
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka typedef struct H264eReorderInfo_t {
45*437bfbebSnyanmisaka     RK_S32      rd_cnt;
46*437bfbebSnyanmisaka     RK_S32      wr_cnt;
47*437bfbebSnyanmisaka     RK_S32      size;
48*437bfbebSnyanmisaka     H264eRplmo  ops[H264E_MAX_REFS_CNT];
49*437bfbebSnyanmisaka } H264eReorderInfo;
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka /*
52*437bfbebSnyanmisaka  * mmco (Memory management control operation) value
53*437bfbebSnyanmisaka  * 0 - End memory_management_control_operation syntax element loop
54*437bfbebSnyanmisaka  * 1 - Mark a short-term reference picture as "unused for reference"
55*437bfbebSnyanmisaka  * 2 - Mark a long-term reference picture as "unused for reference"
56*437bfbebSnyanmisaka  * 3 - Mark a short-term reference picture as "used for long-term
57*437bfbebSnyanmisaka  *     reference" and assign a long-term frame index to it
58*437bfbebSnyanmisaka  * 4 - Specify the maximum long-term frame index and mark all long-term
59*437bfbebSnyanmisaka  *     reference pictures having long-term frame indices greater than
60*437bfbebSnyanmisaka  *     the maximum value as "unused for reference"
61*437bfbebSnyanmisaka  * 5 - Mark all reference pictures as "unused for reference" and set the
62*437bfbebSnyanmisaka  *     MaxLongTermFrameIdx variable to "no long-term frame indices"
63*437bfbebSnyanmisaka  * 6 - Mark the current picture as "used for long-term reference" and
64*437bfbebSnyanmisaka  *     assign a long-term frame index to it
65*437bfbebSnyanmisaka  */
66*437bfbebSnyanmisaka typedef struct H264eMmco_t {
67*437bfbebSnyanmisaka     RK_S32      mmco;
68*437bfbebSnyanmisaka     RK_S32      difference_of_pic_nums_minus1;   // for MMCO 1 & 3
69*437bfbebSnyanmisaka     RK_S32      long_term_pic_num;               // for MMCO 2
70*437bfbebSnyanmisaka     RK_S32      long_term_frame_idx;             // for MMCO 3 & 6
71*437bfbebSnyanmisaka     RK_S32      max_long_term_frame_idx_plus1;   // for MMCO 4
72*437bfbebSnyanmisaka } H264eMmco;
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka #define MAX_H264E_MMCO_CNT      8
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka typedef struct H264eMarkingInfo_t {
77*437bfbebSnyanmisaka     RK_S32      idr_flag;
78*437bfbebSnyanmisaka     /* idr marking flag */
79*437bfbebSnyanmisaka     RK_S32      no_output_of_prior_pics;
80*437bfbebSnyanmisaka     RK_S32      long_term_reference_flag;
81*437bfbebSnyanmisaka     /* non-idr marking flag */
82*437bfbebSnyanmisaka     RK_S32      adaptive_ref_pic_buffering;
83*437bfbebSnyanmisaka     RK_S32      rd_cnt;
84*437bfbebSnyanmisaka     RK_S32      wr_cnt;
85*437bfbebSnyanmisaka     RK_S32      size;
86*437bfbebSnyanmisaka     H264eMmco   ops[MAX_H264E_MMCO_CNT];
87*437bfbebSnyanmisaka } H264eMarkingInfo;
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka typedef struct H264eSlice_t {
90*437bfbebSnyanmisaka     /* Copy of sps/pps parameter */
91*437bfbebSnyanmisaka     RK_S32      mb_w;
92*437bfbebSnyanmisaka     RK_S32      mb_h;
93*437bfbebSnyanmisaka     RK_U32      max_num_ref_frames;
94*437bfbebSnyanmisaka     RK_U32      entropy_coding_mode;
95*437bfbebSnyanmisaka     RK_S32      log2_max_frame_num;
96*437bfbebSnyanmisaka     RK_S32      log2_max_poc_lsb;
97*437bfbebSnyanmisaka     RK_S32      pic_order_cnt_type;
98*437bfbebSnyanmisaka     RK_S32      qp_init;
99*437bfbebSnyanmisaka 
100*437bfbebSnyanmisaka     /* Nal parameters */
101*437bfbebSnyanmisaka     RK_S32      nal_reference_idc;
102*437bfbebSnyanmisaka     RK_S32      nalu_type;
103*437bfbebSnyanmisaka 
104*437bfbebSnyanmisaka     /* Unchanged parameters  */
105*437bfbebSnyanmisaka     RK_U32      first_mb_in_slice;
106*437bfbebSnyanmisaka     RK_U32      slice_type;
107*437bfbebSnyanmisaka     RK_U32      pic_parameter_set_id;
108*437bfbebSnyanmisaka     RK_S32      frame_num;
109*437bfbebSnyanmisaka     RK_S32      num_ref_idx_override;
110*437bfbebSnyanmisaka     RK_S32      qp_delta;
111*437bfbebSnyanmisaka     RK_U32      cabac_init_idc;
112*437bfbebSnyanmisaka     RK_U32      disable_deblocking_filter_idc;
113*437bfbebSnyanmisaka     RK_S32      slice_alpha_c0_offset_div2;
114*437bfbebSnyanmisaka     RK_S32      slice_beta_offset_div2;
115*437bfbebSnyanmisaka 
116*437bfbebSnyanmisaka     /* reorder parameter */
117*437bfbebSnyanmisaka     RK_S32      ref_pic_list_modification_flag;
118*437bfbebSnyanmisaka     H264eReorderInfo    *reorder;
119*437bfbebSnyanmisaka     H264eMarkingInfo    *marking;
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     RK_S32      idr_flag;
122*437bfbebSnyanmisaka     RK_U32      idr_pic_id;
123*437bfbebSnyanmisaka     RK_U32      next_idr_pic_id;
124*437bfbebSnyanmisaka     /* for poc mode 0 */
125*437bfbebSnyanmisaka     RK_U32      pic_order_cnt_lsb;
126*437bfbebSnyanmisaka     RK_S32      num_ref_idx_active;
127*437bfbebSnyanmisaka     /* idr mmco flag */
128*437bfbebSnyanmisaka     RK_S32      no_output_of_prior_pics;
129*437bfbebSnyanmisaka     RK_S32      long_term_reference_flag;
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka     /* Changable parameters  */
132*437bfbebSnyanmisaka     RK_S32      adaptive_ref_pic_buffering;
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka     /* for multi-slice writing */
135*437bfbebSnyanmisaka     RK_S32      is_multi_slice;
136*437bfbebSnyanmisaka } H264eSlice;
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka #ifdef  __cplusplus
139*437bfbebSnyanmisaka extern "C" {
140*437bfbebSnyanmisaka #endif
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka /*
143*437bfbebSnyanmisaka  * reorder context for both dpb and slice
144*437bfbebSnyanmisaka  */
145*437bfbebSnyanmisaka MPP_RET h264e_reorder_init(H264eReorderInfo *reorder);
146*437bfbebSnyanmisaka MPP_RET h264e_reorder_wr_rewind(H264eReorderInfo *info);
147*437bfbebSnyanmisaka MPP_RET h264e_reorder_rd_rewind(H264eReorderInfo *info);
148*437bfbebSnyanmisaka MPP_RET h264e_reorder_wr_op(H264eReorderInfo *info, H264eRplmo *op);
149*437bfbebSnyanmisaka MPP_RET h264e_reorder_rd_op(H264eReorderInfo *info, H264eRplmo *op);
150*437bfbebSnyanmisaka 
151*437bfbebSnyanmisaka /* mmco context for both dpb and slice */
152*437bfbebSnyanmisaka MPP_RET h264e_marking_init(H264eMarkingInfo *marking);
153*437bfbebSnyanmisaka RK_S32 h264e_marking_is_empty(H264eMarkingInfo *info);
154*437bfbebSnyanmisaka MPP_RET h264e_marking_wr_rewind(H264eMarkingInfo *marking);
155*437bfbebSnyanmisaka MPP_RET h264e_marking_rd_rewind(H264eMarkingInfo *marking);
156*437bfbebSnyanmisaka MPP_RET h264e_marking_wr_op(H264eMarkingInfo *info, H264eMmco *op);
157*437bfbebSnyanmisaka MPP_RET h264e_marking_rd_op(H264eMarkingInfo *info, H264eMmco *op);
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka /*
160*437bfbebSnyanmisaka  * h264e_slice_update is called only on cfg is update.
161*437bfbebSnyanmisaka  * When cfg has no changes just use slice next to setup
162*437bfbebSnyanmisaka  */
163*437bfbebSnyanmisaka void h264e_slice_init(H264eSlice *slice, H264eReorderInfo *reorder,
164*437bfbebSnyanmisaka                       H264eMarkingInfo *marking);
165*437bfbebSnyanmisaka RK_S32 h264e_slice_update(H264eSlice *slice, MppEncCfgSet *cfg,
166*437bfbebSnyanmisaka                           H264eSps *sps, H264ePps *pps,
167*437bfbebSnyanmisaka                           H264eDpbFrm *frm);
168*437bfbebSnyanmisaka 
169*437bfbebSnyanmisaka RK_S32 h264e_slice_read(H264eSlice *slice, void *p, RK_S32 size);
170*437bfbebSnyanmisaka RK_S32 h264e_slice_write(H264eSlice *slice, void *p, RK_U32 size);
171*437bfbebSnyanmisaka RK_S32 h264e_slice_write_pskip(H264eSlice *slice, void *p, RK_U32 size);
172*437bfbebSnyanmisaka RK_S32 h264e_slice_move(RK_U8 *dst, RK_U8 *src, RK_S32 dst_bit, RK_S32 src_bit,
173*437bfbebSnyanmisaka                         RK_S32 src_size);
174*437bfbebSnyanmisaka 
175*437bfbebSnyanmisaka RK_S32 h264e_slice_write_prefix_nal_unit_svc(H264ePrefixNal *nal, void *p, RK_S32 size);
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka #ifdef __cplusplus
178*437bfbebSnyanmisaka }
179*437bfbebSnyanmisaka #endif
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka #endif /* __H264E_SLICE_H__ */
182