/*
|
* 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 __H264E_SLICE_H__
|
#define __H264E_SLICE_H__
|
|
#include "mpp_enc_cfg.h"
|
|
#include "h264e_syntax.h"
|
#include "h264e_sps.h"
|
#include "h264e_pps.h"
|
|
/*
|
* For H.264 encoder slice header process.
|
* Remove some syntax that encoder not supported.
|
* Field, mbaff, B slice are not supported yet.
|
*
|
* The reorder and mmco syntax will be create by dpb and attach to slice.
|
* Then slice syntax will be passed to hal to config hardware or modify the
|
* hardware stream.
|
*/
|
|
/* reference picture list modification operation */
|
typedef struct H264eRplmo_t {
|
RK_S32 modification_of_pic_nums_idc;
|
RK_S32 abs_diff_pic_num_minus1;
|
RK_S32 long_term_pic_idx;
|
RK_S32 abs_diff_view_idx_minus1;
|
} H264eRplmo;
|
|
typedef struct H264eReorderInfo_t {
|
RK_S32 rd_cnt;
|
RK_S32 wr_cnt;
|
RK_S32 size;
|
H264eRplmo ops[H264E_MAX_REFS_CNT];
|
} H264eReorderInfo;
|
|
/*
|
* mmco (Memory management control operation) value
|
* 0 - End memory_management_control_operation syntax element loop
|
* 1 - Mark a short-term reference picture as "unused for reference"
|
* 2 - Mark a long-term reference picture as "unused for reference"
|
* 3 - Mark a short-term reference picture as "used for long-term
|
* reference" and assign a long-term frame index to it
|
* 4 - Specify the maximum long-term frame index and mark all long-term
|
* reference pictures having long-term frame indices greater than
|
* the maximum value as "unused for reference"
|
* 5 - Mark all reference pictures as "unused for reference" and set the
|
* MaxLongTermFrameIdx variable to "no long-term frame indices"
|
* 6 - Mark the current picture as "used for long-term reference" and
|
* assign a long-term frame index to it
|
*/
|
typedef struct H264eMmco_t {
|
RK_S32 mmco;
|
RK_S32 difference_of_pic_nums_minus1; // for MMCO 1 & 3
|
RK_S32 long_term_pic_num; // for MMCO 2
|
RK_S32 long_term_frame_idx; // for MMCO 3 & 6
|
RK_S32 max_long_term_frame_idx_plus1; // for MMCO 4
|
} H264eMmco;
|
|
#define MAX_H264E_MMCO_CNT 8
|
|
typedef struct H264eMarkingInfo_t {
|
RK_S32 idr_flag;
|
/* idr marking flag */
|
RK_S32 no_output_of_prior_pics;
|
RK_S32 long_term_reference_flag;
|
/* non-idr marking flag */
|
RK_S32 adaptive_ref_pic_buffering;
|
RK_S32 rd_cnt;
|
RK_S32 wr_cnt;
|
RK_S32 size;
|
H264eMmco ops[MAX_H264E_MMCO_CNT];
|
} H264eMarkingInfo;
|
|
typedef struct H264eSlice_t {
|
/* Copy of sps/pps parameter */
|
RK_S32 mb_w;
|
RK_S32 mb_h;
|
RK_U32 max_num_ref_frames;
|
RK_U32 entropy_coding_mode;
|
RK_S32 log2_max_frame_num;
|
RK_S32 log2_max_poc_lsb;
|
RK_S32 pic_order_cnt_type;
|
RK_S32 qp_init;
|
|
/* Nal parameters */
|
RK_S32 nal_reference_idc;
|
RK_S32 nalu_type;
|
|
/* Unchanged parameters */
|
RK_U32 first_mb_in_slice;
|
RK_U32 slice_type;
|
RK_U32 pic_parameter_set_id;
|
RK_S32 frame_num;
|
RK_S32 num_ref_idx_override;
|
RK_S32 qp_delta;
|
RK_U32 cabac_init_idc;
|
RK_U32 disable_deblocking_filter_idc;
|
RK_S32 slice_alpha_c0_offset_div2;
|
RK_S32 slice_beta_offset_div2;
|
|
/* reorder parameter */
|
RK_S32 ref_pic_list_modification_flag;
|
H264eReorderInfo *reorder;
|
H264eMarkingInfo *marking;
|
|
RK_S32 idr_flag;
|
RK_U32 idr_pic_id;
|
RK_U32 next_idr_pic_id;
|
/* for poc mode 0 */
|
RK_U32 pic_order_cnt_lsb;
|
RK_S32 num_ref_idx_active;
|
/* idr mmco flag */
|
RK_S32 no_output_of_prior_pics;
|
RK_S32 long_term_reference_flag;
|
|
/* Changable parameters */
|
RK_S32 adaptive_ref_pic_buffering;
|
|
/* for multi-slice writing */
|
RK_S32 is_multi_slice;
|
} H264eSlice;
|
|
#ifdef __cplusplus
|
extern "C" {
|
#endif
|
|
/*
|
* reorder context for both dpb and slice
|
*/
|
MPP_RET h264e_reorder_init(H264eReorderInfo *reorder);
|
MPP_RET h264e_reorder_wr_rewind(H264eReorderInfo *info);
|
MPP_RET h264e_reorder_rd_rewind(H264eReorderInfo *info);
|
MPP_RET h264e_reorder_wr_op(H264eReorderInfo *info, H264eRplmo *op);
|
MPP_RET h264e_reorder_rd_op(H264eReorderInfo *info, H264eRplmo *op);
|
|
/* mmco context for both dpb and slice */
|
MPP_RET h264e_marking_init(H264eMarkingInfo *marking);
|
RK_S32 h264e_marking_is_empty(H264eMarkingInfo *info);
|
MPP_RET h264e_marking_wr_rewind(H264eMarkingInfo *marking);
|
MPP_RET h264e_marking_rd_rewind(H264eMarkingInfo *marking);
|
MPP_RET h264e_marking_wr_op(H264eMarkingInfo *info, H264eMmco *op);
|
MPP_RET h264e_marking_rd_op(H264eMarkingInfo *info, H264eMmco *op);
|
|
/*
|
* h264e_slice_update is called only on cfg is update.
|
* When cfg has no changes just use slice next to setup
|
*/
|
void h264e_slice_init(H264eSlice *slice, H264eReorderInfo *reorder,
|
H264eMarkingInfo *marking);
|
RK_S32 h264e_slice_update(H264eSlice *slice, MppEncCfgSet *cfg,
|
H264eSps *sps, H264ePps *pps,
|
H264eDpbFrm *frm);
|
|
RK_S32 h264e_slice_read(H264eSlice *slice, void *p, RK_S32 size);
|
RK_S32 h264e_slice_write(H264eSlice *slice, void *p, RK_U32 size);
|
RK_S32 h264e_slice_write_pskip(H264eSlice *slice, void *p, RK_U32 size);
|
RK_S32 h264e_slice_move(RK_U8 *dst, RK_U8 *src, RK_S32 dst_bit, RK_S32 src_bit,
|
RK_S32 src_size);
|
|
RK_S32 h264e_slice_write_prefix_nal_unit_svc(H264ePrefixNal *nal, void *p, RK_S32 size);
|
|
#ifdef __cplusplus
|
}
|
#endif
|
|
#endif /* __H264E_SLICE_H__ */
|