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