mirror of
				https://github.com/nyanmisaka/mpp.git
				synced 2025-10-31 04:26:39 +08:00 
			
		
		
		
	[h264e]: Add poc type / poc_lsb / frm_num setup
1. Add poc type / poc_lsb / frm_num default device value. 2. Add force update path. 3. Sps will use codec cfg directly. Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: I5f23b74f0453213c89c7238a36570484b91b48ce
This commit is contained in:
		| @@ -506,6 +506,12 @@ typedef enum MppEncH264CfgChange_e { | |||||||
|     MPP_ENC_H264_CFG_CHANGE_LONG_TERM       = (1 << 8), |     MPP_ENC_H264_CFG_CHANGE_LONG_TERM       = (1 << 8), | ||||||
|     /* change on scaling_list_mode */ |     /* change on scaling_list_mode */ | ||||||
|     MPP_ENC_H264_CFG_CHANGE_SCALING_LIST    = (1 << 9), |     MPP_ENC_H264_CFG_CHANGE_SCALING_LIST    = (1 << 9), | ||||||
|  |     /* change on poc type */ | ||||||
|  |     MPP_ENC_H264_CFG_CHANGE_POC_TYPE        = (1 << 10), | ||||||
|  |     /* change on log2 max poc lsb minus 4 */ | ||||||
|  |     MPP_ENC_H264_CFG_CHANGE_MAX_POC_LSB     = (1 << 11), | ||||||
|  |     /* change on log2 max frame number minus 4 */ | ||||||
|  |     MPP_ENC_H264_CFG_CHANGE_MAX_FRM_NUM     = (1 << 12), | ||||||
|  |  | ||||||
|     /* change on max_qp / min_qp / max_qp_step */ |     /* change on max_qp / min_qp / max_qp_step */ | ||||||
|     MPP_ENC_H264_CFG_CHANGE_QP_LIMIT        = (1 << 16), |     MPP_ENC_H264_CFG_CHANGE_QP_LIMIT        = (1 << 16), | ||||||
| @@ -535,8 +541,19 @@ typedef struct MppEncH264Cfg_t { | |||||||
|      */ |      */ | ||||||
|     RK_S32              stream_type; |     RK_S32              stream_type; | ||||||
|  |  | ||||||
|     /* H.264 codec syntax config */ |     /* | ||||||
|     RK_S32              svc;                        /* 0 - avc 1 - svc */ |      * H.264 codec syntax config | ||||||
|  |      * svc                  - deprecated, reserved for compile compatibility | ||||||
|  |      * | ||||||
|  |      * do NOT setup the three option below unless you are familiar with encoder detail | ||||||
|  |      * poc_type             - picture order count type 0 ~ 2 | ||||||
|  |      * log2_max_poc_lsb     - used in sps with poc_type 0, | ||||||
|  |      * log2_max_frame_num   - used in sps | ||||||
|  |      */ | ||||||
|  |     RK_U8               svc; | ||||||
|  |     RK_U8               poc_type; | ||||||
|  |     RK_U8               log2_max_poc_lsb; | ||||||
|  |     RK_U8               log2_max_frame_num; | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|      * H.264 profile_idc parameter |      * H.264 profile_idc parameter | ||||||
|   | |||||||
| @@ -178,6 +178,9 @@ static const char *cfg_func_names[] = { | |||||||
|     ENTRY(h264, stream_type,    S32, RK_S32,            MPP_ENC_H264_CFG_STREAM_TYPE,           codec.h264, stream_type) \ |     ENTRY(h264, stream_type,    S32, RK_S32,            MPP_ENC_H264_CFG_STREAM_TYPE,           codec.h264, stream_type) \ | ||||||
|     ENTRY(h264, profile,        S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_PROFILE,        codec.h264, profile) \ |     ENTRY(h264, profile,        S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_PROFILE,        codec.h264, profile) \ | ||||||
|     ENTRY(h264, level,          S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_PROFILE,        codec.h264, level) \ |     ENTRY(h264, level,          S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_PROFILE,        codec.h264, level) \ | ||||||
|  |     ENTRY(h264, poc_type,       U32, RK_U32,            MPP_ENC_H264_CFG_CHANGE_POC_TYPE,       codec.h264, poc_type) \ | ||||||
|  |     ENTRY(h264, log2_max_poc_lsb,   U32, RK_U32,        MPP_ENC_H264_CFG_CHANGE_MAX_POC_LSB,    codec.h264, log2_max_poc_lsb) \ | ||||||
|  |     ENTRY(h264, log2_max_frm_num,   U32, RK_U32,        MPP_ENC_H264_CFG_CHANGE_MAX_FRM_NUM,    codec.h264, log2_max_frame_num) \ | ||||||
|     ENTRY(h264, cabac_en,       S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_ENTROPY,        codec.h264, entropy_coding_mode) \ |     ENTRY(h264, cabac_en,       S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_ENTROPY,        codec.h264, entropy_coding_mode) \ | ||||||
|     ENTRY(h264, cabac_idc,      S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_ENTROPY,        codec.h264, cabac_init_idc) \ |     ENTRY(h264, cabac_idc,      S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_ENTROPY,        codec.h264, cabac_init_idc) \ | ||||||
|     ENTRY(h264, trans8x8,       S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_TRANS_8x8,      codec.h264, transform8x8_mode) \ |     ENTRY(h264, trans8x8,       S32, RK_S32,            MPP_ENC_H264_CFG_CHANGE_TRANS_8x8,      codec.h264, transform8x8_mode) \ | ||||||
| @@ -236,7 +239,7 @@ RK_S32 const_strlen(const char* str) | |||||||
|     return *str ? 1 + const_strlen(str + 1) : 0; |     return *str ? 1 + const_strlen(str + 1) : 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static RK_S32 node_len = ENTRY_TABLE(EXPAND_AS_STRLEN) - 23; | static RK_S32 node_len = ENTRY_TABLE(EXPAND_AS_STRLEN) - 21; | ||||||
|  |  | ||||||
| class MppEncCfgService | class MppEncCfgService | ||||||
| { | { | ||||||
|   | |||||||
| @@ -83,7 +83,7 @@ typedef struct { | |||||||
|     H264eSyntaxDesc     syntax[H264E_SYN_BUTT]; |     H264eSyntaxDesc     syntax[H264E_SYN_BUTT]; | ||||||
| } H264eCtx; | } H264eCtx; | ||||||
|  |  | ||||||
| static void init_h264e_cfg_set(MppEncCfgSet *cfg) | static void init_h264e_cfg_set(MppEncCfgSet *cfg, MppDeviceId dev_id) | ||||||
| { | { | ||||||
|     MppEncRcCfg *rc_cfg = &cfg->rc; |     MppEncRcCfg *rc_cfg = &cfg->rc; | ||||||
|     MppEncPrepCfg *prep = &cfg->prep; |     MppEncPrepCfg *prep = &cfg->prep; | ||||||
| @@ -103,6 +103,24 @@ static void init_h264e_cfg_set(MppEncCfgSet *cfg) | |||||||
|     h264->qp_min = 8; |     h264->qp_min = 8; | ||||||
|     h264->qp_max_step = 8; |     h264->qp_max_step = 8; | ||||||
|  |  | ||||||
|  |     switch (dev_id) { | ||||||
|  |     case DEV_VEPU : { | ||||||
|  |         h264->poc_type = 2; | ||||||
|  |         h264->log2_max_poc_lsb = 12; | ||||||
|  |         h264->log2_max_frame_num = 12; | ||||||
|  |     } break; | ||||||
|  |     case DEV_RKVENC : { | ||||||
|  |         h264->poc_type = 0; | ||||||
|  |         h264->log2_max_poc_lsb = 12; | ||||||
|  |         h264->log2_max_frame_num = 12; | ||||||
|  |     } break; | ||||||
|  |     default : { | ||||||
|  |         h264->poc_type = 0; | ||||||
|  |         h264->log2_max_poc_lsb = 12; | ||||||
|  |         h264->log2_max_frame_num = 12; | ||||||
|  |     } break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|      * default prep: |      * default prep: | ||||||
|      * 720p |      * 720p | ||||||
| @@ -174,7 +192,7 @@ static MPP_RET h264e_init(void *ctx, EncImplCfg *ctrl_cfg) | |||||||
|     h264e_dpb_init(&p->dpb, &p->reorder, &p->marking); |     h264e_dpb_init(&p->dpb, &p->reorder, &p->marking); | ||||||
|     h264e_slice_init(&p->slice, &p->reorder, &p->marking); |     h264e_slice_init(&p->slice, &p->reorder, &p->marking); | ||||||
|  |  | ||||||
|     init_h264e_cfg_set(p->cfg); |     init_h264e_cfg_set(p->cfg, p->dev_id); | ||||||
|  |  | ||||||
|     mpp_env_get_u32("h264e_debug", &h264e_debug, 0); |     mpp_env_get_u32("h264e_debug", &h264e_debug, 0); | ||||||
|  |  | ||||||
| @@ -354,6 +372,21 @@ static MPP_RET h264e_proc_h264_cfg(MppEncH264Cfg *dst, MppEncH264Cfg *src) | |||||||
|         dst->level = src->level; |         dst->level = src->level; | ||||||
|         dst->change |= MPP_ENC_H264_CFG_CHANGE_PROFILE; |         dst->change |= MPP_ENC_H264_CFG_CHANGE_PROFILE; | ||||||
|     } |     } | ||||||
|  |     if ((change & MPP_ENC_H264_CFG_CHANGE_POC_TYPE) && | ||||||
|  |         (dst->poc_type != src->poc_type)) { | ||||||
|  |         dst->poc_type = src->poc_type; | ||||||
|  |         dst->change |= MPP_ENC_H264_CFG_CHANGE_POC_TYPE; | ||||||
|  |     } | ||||||
|  |     if ((change & MPP_ENC_H264_CFG_CHANGE_MAX_POC_LSB) && | ||||||
|  |         (dst->log2_max_poc_lsb != src->log2_max_poc_lsb)) { | ||||||
|  |         dst->log2_max_poc_lsb = src->log2_max_poc_lsb; | ||||||
|  |         dst->change |= MPP_ENC_H264_CFG_CHANGE_MAX_POC_LSB; | ||||||
|  |     } | ||||||
|  |     if ((change & MPP_ENC_H264_CFG_CHANGE_MAX_FRM_NUM) && | ||||||
|  |         (dst->log2_max_frame_num != src->log2_max_frame_num)) { | ||||||
|  |         dst->log2_max_frame_num = src->log2_max_frame_num; | ||||||
|  |         dst->change |= MPP_ENC_H264_CFG_CHANGE_MAX_FRM_NUM; | ||||||
|  |     } | ||||||
|     if ((change & MPP_ENC_H264_CFG_CHANGE_ENTROPY) && |     if ((change & MPP_ENC_H264_CFG_CHANGE_ENTROPY) && | ||||||
|         ((dst->entropy_coding_mode != src->entropy_coding_mode) || |         ((dst->entropy_coding_mode != src->entropy_coding_mode) || | ||||||
|          (dst->cabac_init_idc != src->cabac_init_idc))) { |          (dst->cabac_init_idc != src->cabac_init_idc))) { | ||||||
| @@ -525,7 +558,7 @@ static MPP_RET h264e_gen_hdr(void *ctx, MppPacket pkt) | |||||||
|  |  | ||||||
|     h264e_dbg_func("enter\n"); |     h264e_dbg_func("enter\n"); | ||||||
|  |  | ||||||
|     h264e_sps_update(&p->sps, p->cfg, p->dev_id); |     h264e_sps_update(&p->sps, p->cfg); | ||||||
|     h264e_pps_update(&p->pps, p->cfg); |     h264e_pps_update(&p->pps, p->cfg); | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ H264eLevelInfo level_infos[] = { | |||||||
|     {   H264_LEVEL_6_2, 16711680,   139264,     696320,  800000, "6.2" }, |     {   H264_LEVEL_6_2, 16711680,   139264,     696320,  800000, "6.2" }, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| MPP_RET h264e_sps_update(SynH264eSps *sps, MppEncCfgSet *cfg, MppDeviceId dev) | MPP_RET h264e_sps_update(SynH264eSps *sps, MppEncCfgSet *cfg) | ||||||
| { | { | ||||||
|     SynH264eVui *vui = &sps->vui; |     SynH264eVui *vui = &sps->vui; | ||||||
|     MppEncPrepCfg *prep = &cfg->prep; |     MppEncPrepCfg *prep = &cfg->prep; | ||||||
| @@ -112,6 +112,10 @@ MPP_RET h264e_sps_update(SynH264eSps *sps, MppEncCfgSet *cfg, MppDeviceId dev) | |||||||
|     sps->chroma_format_idc = H264_CHROMA_420; |     sps->chroma_format_idc = H264_CHROMA_420; | ||||||
|  |  | ||||||
|     // set max frame number and poc lsb according to gop size |     // set max frame number and poc lsb according to gop size | ||||||
|  |     sps->pic_order_cnt_type = h264->poc_type; | ||||||
|  |     sps->log2_max_poc_lsb_minus4 = h264->log2_max_poc_lsb; | ||||||
|  |     sps->log2_max_frame_num_minus4 = h264->log2_max_frame_num; | ||||||
|  |  | ||||||
|     mpp_assert(gop >= 0); |     mpp_assert(gop >= 0); | ||||||
|     if (gop == 0) { |     if (gop == 0) { | ||||||
|         // only one I then all P frame |         // only one I then all P frame | ||||||
| @@ -124,22 +128,14 @@ MPP_RET h264e_sps_update(SynH264eSps *sps, MppEncCfgSet *cfg, MppDeviceId dev) | |||||||
|     } else { |     } else { | ||||||
|         // normal case |         // normal case | ||||||
|         RK_S32 log2_gop = mpp_log2(gop); |         RK_S32 log2_gop = mpp_log2(gop); | ||||||
|  |         RK_S32 log2_frm_num = (log2_gop <= 4) ? (0) : (log2_gop - 4); | ||||||
|  |         RK_S32 log2_poc_lsb = (log2_gop <= 3) ? (0) : (log2_gop - 3); | ||||||
|  |  | ||||||
|         sps->log2_max_frame_num_minus4 = (log2_gop <= 4) ? (0) : (log2_gop - 4); |         if (sps->log2_max_frame_num_minus4 < log2_frm_num) | ||||||
|         sps->log2_max_poc_lsb_minus4   = (log2_gop <= 3) ? (0) : (log2_gop - 3); |             sps->log2_max_frame_num_minus4 = log2_frm_num; | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // default poc_type 0 |         if (sps->log2_max_poc_lsb_minus4 < log2_poc_lsb) | ||||||
|     sps->pic_order_cnt_type = 0; |             sps->log2_max_poc_lsb_minus4 = log2_poc_lsb; | ||||||
|     if (dev == DEV_VEPU) { |  | ||||||
|         // VEPU hardware default poc_type is 2 |  | ||||||
|         sps->pic_order_cnt_type = 2; |  | ||||||
|         sps->log2_max_frame_num_minus4 = 12; |  | ||||||
|     } |  | ||||||
|     // NOTE: when tsvc mode enabled poc type should be zero. |  | ||||||
|     if (info->dpb_size > 1) { |  | ||||||
|         sps->pic_order_cnt_type = 0; |  | ||||||
|         sps->log2_max_frame_num_minus4 = 12; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // max one reference frame |     // max one reference frame | ||||||
|   | |||||||
| @@ -17,8 +17,6 @@ | |||||||
| #ifndef __H264E_SPS_H__ | #ifndef __H264E_SPS_H__ | ||||||
| #define __H264E_SPS_H__ | #define __H264E_SPS_H__ | ||||||
|  |  | ||||||
| #include "mpp_platform.h" |  | ||||||
|  |  | ||||||
| #include "mpp_packet.h" | #include "mpp_packet.h" | ||||||
| #include "mpp_enc_cfg.h" | #include "mpp_enc_cfg.h" | ||||||
|  |  | ||||||
| @@ -28,7 +26,7 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| MPP_RET h264e_sps_update(SynH264eSps *sps, MppEncCfgSet *cfg, MppDeviceId dev); | MPP_RET h264e_sps_update(SynH264eSps *sps, MppEncCfgSet *cfg); | ||||||
| MPP_RET h264e_sps_to_packet(SynH264eSps *sps, MppPacket packet, RK_S32 *len); | MPP_RET h264e_sps_to_packet(SynH264eSps *sps, MppPacket packet, RK_S32 *len); | ||||||
| MPP_RET h264e_sps_dump(SynH264eSps *sps); | MPP_RET h264e_sps_dump(SynH264eSps *sps); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Herman Chen
					Herman Chen