diff --git a/mpp/hal/common/h264/hal_h264e_api.c b/mpp/hal/common/h264/hal_h264e_api.c index b7fdecad..286aeb4b 100644 --- a/mpp/hal/common/h264/hal_h264e_api.c +++ b/mpp/hal/common/h264/hal_h264e_api.c @@ -122,6 +122,8 @@ MPP_RET hal_h264e_init(void *hal, MppHalCfg *cfg) ctx->cfg = cfg->cfg; ctx->set = cfg->set; + ctx->sei_mode = MPP_ENC_SEI_MODE_ONE_SEQ; + return api->init(hal, cfg); } diff --git a/mpp/hal/common/h264/hal_h264e_com.c b/mpp/hal/common/h264/hal_h264e_com.c index 8a6d5c4a..f42bdaa7 100644 --- a/mpp/hal/common/h264/hal_h264e_com.c +++ b/mpp/hal/common/h264/hal_h264e_com.c @@ -730,3 +730,56 @@ MPP_RET hal_h264e_set_pps(h264e_hal_context *ctx, h264e_hal_pps *pps, h264e_hal_ return MPP_OK; } +void hal_h264e_sei_pack2str(char *str, h264e_hal_context *ctx) +{ + MppEncCfgSet *cfg = ctx->cfg; + MppEncH264Cfg *codec = &cfg->codec.h264; + MppEncPrepCfg *prep = &cfg->prep; + MppEncRcCfg *rc = &cfg->rc; + + if (prep->change || codec->change || rc->change) + H264E_HAL_SPRINT(str, "frm %d: ", ctx->frame_cnt); + + /* prep cfg */ + if (prep->change) { + RK_U32 change = prep->change; + + H264E_HAL_SPRINT(str, "[prep] "); + if (change & MPP_ENC_PREP_CFG_CHANGE_INPUT) { + H264E_HAL_SPRINT(str, "w=%d ", prep->width); + H264E_HAL_SPRINT(str, "h=%d ", prep->height); + H264E_HAL_SPRINT(str, "fmt=%d ", prep->format); + H264E_HAL_SPRINT(str, "h_std=%d ", prep->hor_stride); + H264E_HAL_SPRINT(str, "v_std=%d ", prep->ver_stride); + } + } + + /* codec cfg */ + if (codec->change) { + H264E_HAL_SPRINT(str, "[codec] "); + H264E_HAL_SPRINT(str, "profile=%d ", codec->profile); + H264E_HAL_SPRINT(str, "level=%d ", codec->level); + H264E_HAL_SPRINT(str, "b_cabac=%d ", codec->entropy_coding_mode); + H264E_HAL_SPRINT(str, "cabac_idc=%d ", codec->cabac_init_idc); + H264E_HAL_SPRINT(str, "t8x8=%d ", codec->transform8x8_mode); + H264E_HAL_SPRINT(str, "constrain_intra=%d ", codec->constrained_intra_pred_mode); + H264E_HAL_SPRINT(str, "dblk=%d:%d:%d ", codec->deblock_disable, + codec->deblock_offset_alpha, codec->deblock_offset_beta); + H264E_HAL_SPRINT(str, "cbcr_qp_offset=%d:%d ", codec->chroma_cb_qp_offset, + codec->chroma_cr_qp_offset); + H264E_HAL_SPRINT(str, "qp_max=%d ", codec->qp_max); + H264E_HAL_SPRINT(str, "qp_min=%d ", codec->qp_min); + H264E_HAL_SPRINT(str, "qp_max_step=%d ", codec->qp_max_step); + } + + /* rc cfg */ + if (rc->change) { + H264E_HAL_SPRINT(str, "[rc] "); + H264E_HAL_SPRINT(str, "rc_mode=%d ", rc->rc_mode); + H264E_HAL_SPRINT(str, "quality=%d ", rc->quality); + H264E_HAL_SPRINT(str, "bps=%d:%d:%d ", rc->bps_target, rc->bps_min, rc->bps_max); + H264E_HAL_SPRINT(str, "fps_in=%d:%d:%d ", rc->fps_in_num, rc->fps_in_denorm, rc->fps_in_flex); + H264E_HAL_SPRINT(str, "fps_out=%d:%d:%d ", rc->fps_out_num, rc->fps_out_denorm, rc->fps_out_flex); + H264E_HAL_SPRINT(str, "gop=%d ", rc->gop); + } +} diff --git a/mpp/hal/common/h264/hal_h264e_com.h b/mpp/hal/common/h264/hal_h264e_com.h index d6af16f4..fc3cfbc2 100644 --- a/mpp/hal/common/h264/hal_h264e_com.h +++ b/mpp/hal/common/h264/hal_h264e_com.h @@ -44,7 +44,8 @@ extern RK_U32 h264e_hal_log_mode; #define H264E_HAL_LOG_FILE 0x00100000 - +#define H264E_SEI_CHG_SPSPPS 0x00000001 +#define H264E_SEI_CHG_RC 0x00000010 #define H264E_HAL_MASK_2b (RK_U32)0x00000003 #define H264E_HAL_MASK_3b (RK_U32)0x00000007 @@ -467,5 +468,6 @@ const RK_U8 h264e_zigzag_scan4[2][16]; const RK_U8 h264e_zigzag_scan8[2][64]; void hal_h264e_rkv_set_format(H264eHwCfg *hw_cfg, MppEncPrepCfg *prep_cfg); void hal_h264e_vpu_set_format(H264eHwCfg *hw_cfg, MppEncPrepCfg *prep_cfg); +void hal_h264e_sei_pack2str(char *str, h264e_hal_context *ctx); #endif diff --git a/mpp/hal/rkenc/h264e/hal_h264e_rkv.c b/mpp/hal/rkenc/h264e/hal_h264e_rkv.c index 83ad6687..ee47d18c 100644 --- a/mpp/hal/rkenc/h264e/hal_h264e_rkv.c +++ b/mpp/hal/rkenc/h264e/hal_h264e_rkv.c @@ -1636,58 +1636,6 @@ MPP_RET hal_h264e_rkv_encapsulate_nals(h264e_hal_rkv_extra_info *out) return MPP_OK; } -static MPP_RET hal_h264e_rkv_sei_pack2str(char *str, h264e_hal_context *ctx) -{ - h264e_hal_rkv_extra_info *info = (h264e_hal_rkv_extra_info *)ctx->extra_info; - h264e_hal_sps *sps = &info->sps; - h264e_hal_pps *pps = &info->pps; - MppEncCfgSet *cfg = ctx->cfg; - MppEncPrepCfg *prep = &cfg->prep; - MppEncRcCfg *rc_cfg = &cfg->rc; - - h264e_hal_debug_enter(); - - H264E_HAL_SPRINT(str, "frame %d rkvenc_cfg: ", ctx->frame_cnt); - - if (info->sei_change_flg & H264E_SEI_CHG_SPSPPS) { - h264e_hal_log_sei("write sei extra_info_cfg"); - H264E_HAL_SPRINT(str, "extra_info: "); - H264E_HAL_SPRINT(str, "pic_w %d ", prep->width); - H264E_HAL_SPRINT(str, "pic_h %d ", prep->height); - H264E_HAL_SPRINT(str, "en_cabac %d ", pps->b_cabac); - H264E_HAL_SPRINT(str, "t8x8 %d ", pps->b_transform_8x8_mode); - H264E_HAL_SPRINT(str, "cb_qp_ofst %d ", pps->i_chroma_qp_index_offset); - H264E_HAL_SPRINT(str, "pic_init_qp %d ", pps->i_pic_init_qp); - H264E_HAL_SPRINT(str, "fps %d ", rc_cfg->fps_in_num / rc_cfg->fps_in_denorm); - H264E_HAL_SPRINT(str, "src_fmt %d ", prep->format); - H264E_HAL_SPRINT(str, "profile %d ", sps->i_profile_idc); - H264E_HAL_SPRINT(str, "level %d ", sps->i_level_idc); - H264E_HAL_SPRINT(str, "key_interval %d ", sps->keyframe_max_interval); - H264E_HAL_SPRINT(str, "cr_qp_ofst %d ", pps->i_second_chroma_qp_index_offset); - H264E_HAL_SPRINT(str, "pps_id %d ", pps->i_id); - info->sei_change_flg &= ~H264E_SEI_CHG_SPSPPS; - } - - if (info->sei_change_flg & H264E_SEI_CHG_RC) { - h264e_hal_log_sei("write sei rc_cfg"); - H264E_HAL_SPRINT(str, "rc: "); - H264E_HAL_SPRINT(str, "mode %d ", rc_cfg->rc_mode); - H264E_HAL_SPRINT(str, "qlt %d ", rc_cfg->quality); - H264E_HAL_SPRINT(str, "bps_tgt %d ", rc_cfg->bps_target); - H264E_HAL_SPRINT(str, "bps_max %d ", rc_cfg->bps_max); - H264E_HAL_SPRINT(str, "bps_min %d ", rc_cfg->bps_min); - H264E_HAL_SPRINT(str, "fps_in %d ", rc_cfg->fps_in_num / rc_cfg->fps_in_denorm); - H264E_HAL_SPRINT(str, "fps_out %d ", rc_cfg->fps_out_num / rc_cfg->fps_out_denorm); - H264E_HAL_SPRINT(str, "gop %d ", rc_cfg->gop); - H264E_HAL_SPRINT(str, "skip_cnt %d ", rc_cfg->skip_cnt); - info->sei_change_flg &= ~H264E_SEI_CHG_RC; - } - - h264e_hal_debug_leave(); - - return MPP_OK; -} - static MPP_RET hal_h264e_rkv_sei_write(h264e_hal_rkv_stream *s, RK_U8 *payload, RK_S32 payload_size, RK_S32 payload_type) { RK_S32 i = 0; @@ -1722,7 +1670,7 @@ MPP_RET hal_h264e_rkv_sei_encode(h264e_hal_context *ctx) char *str = (char *)info->sei_buf; RK_S32 str_len = 0; - hal_h264e_rkv_sei_pack2str(str + H264E_UUID_LENGTH, ctx); + hal_h264e_sei_pack2str(str + H264E_UUID_LENGTH, ctx); str_len = strlen(str) + 1; if (str_len > H264E_SEI_BUF_SIZE) { diff --git a/mpp/hal/rkenc/h264e/hal_h264e_rkv.h b/mpp/hal/rkenc/h264e/hal_h264e_rkv.h index 127f0573..5c8cd8eb 100644 --- a/mpp/hal/rkenc/h264e/hal_h264e_rkv.h +++ b/mpp/hal/rkenc/h264e/hal_h264e_rkv.h @@ -55,9 +55,6 @@ enc_mode #define RKV_H264E_INT_BUS_READ_ERROR 0x00000080 #define RKV_H264E_INT_TIMEOUT_ERROR 0x00000100 -#define H264E_SEI_CHG_SPSPPS 0x00000001 -#define H264E_SEI_CHG_RC 0x00000010 - #if RKV_H264E_SDK_TEST typedef struct h264e_hal_rkv_coveragetest_cfg_t { RK_U32 qp; diff --git a/mpp/hal/vpu/h264e/hal_h264e_vpu.c b/mpp/hal/vpu/h264e/hal_h264e_vpu.c index 638e9e41..6cbf559a 100644 --- a/mpp/hal/vpu/h264e/hal_h264e_vpu.c +++ b/mpp/hal/vpu/h264e/hal_h264e_vpu.c @@ -748,11 +748,63 @@ static MPP_RET hal_h264e_vpu_write_pps(h264e_hal_vpu_stream *stream, h264e_hal_p return MPP_OK; } +static MPP_RET hal_h264e_vpu_write_sei(h264e_hal_vpu_stream *s, RK_U8 *payload, RK_S32 payload_size, RK_S32 payload_type) +{ + RK_S32 i = 0; + + h264e_hal_debug_enter(); + + hal_h264e_vpu_nal_start(s, RKVENC_NAL_PRIORITY_DISPOSABLE, RKVENC_NAL_SEI); + + for (i = 0; i <= payload_type - 255; i += 255) + hal_h264e_vpu_stream_put_bits_with_detect(s, 0xff, 8, "sei_payload_type_ff_byte"); + hal_h264e_vpu_stream_put_bits_with_detect(s, payload_type - i, 8, "sei_last_payload_type_byte"); + + for (i = 0; i <= payload_size - 255; i += 255) + hal_h264e_vpu_stream_put_bits_with_detect(s, 0xff, 8, "sei_payload_size_ff_byte"); + hal_h264e_vpu_stream_put_bits_with_detect( s, payload_size - i, 8, "sei_last_payload_size_byte"); + + for (i = 0; i < payload_size; i++) + hal_h264e_vpu_stream_put_bits_with_detect(s, (RK_U32)payload[i], 8, "sei_payload_data"); + + hal_h264e_vpu_rbsp_trailing_bits(s); + + h264e_hal_debug_leave(); + + return MPP_OK; +} + + +MPP_RET hal_h264e_vpu_sei_encode(h264e_hal_context *ctx) +{ + h264e_hal_vpu_extra_info *info = (h264e_hal_vpu_extra_info *)ctx->extra_info; + h264e_hal_vpu_stream *sei_stream = &info->sei_stream; + char *str = (char *)info->sei_buf; + RK_S32 str_len = 0; + + hal_h264e_sei_pack2str(str + H264E_UUID_LENGTH, ctx); + + str_len = strlen(str) + 1; + if (str_len > H264E_SEI_BUF_SIZE) { + h264e_hal_log_err("SEI actual string length %d exceed malloced size %d", str_len, H264E_SEI_BUF_SIZE); + return MPP_NOK; + } else { + hal_h264e_vpu_write_sei(sei_stream, (RK_U8 *)str, str_len, H264E_SEI_USER_DATA_UNREGISTERED); + } + + return MPP_OK; +} + static MPP_RET hal_h264e_vpu_init_extra_info(void *extra_info) { + static const RK_U8 h264e_sei_uuid[H264E_UUID_LENGTH] = { + 0x63, 0xfc, 0x6a, 0x3c, 0xd8, 0x5c, 0x44, 0x1e, + 0x87, 0xfb, 0x3f, 0xab, 0xec, 0xb3, 0xb6, 0x77 + }; h264e_hal_vpu_extra_info *info = (h264e_hal_vpu_extra_info *)extra_info; h264e_hal_vpu_stream *sps_stream = &info->sps_stream; h264e_hal_vpu_stream *pps_stream = &info->pps_stream; + h264e_hal_vpu_stream *sei_stream = &info->sei_stream; if (MPP_OK != hal_h264e_vpu_stream_buffer_init(sps_stream, 128)) { mpp_err("sps stream sw buf init failed"); @@ -762,6 +814,12 @@ static MPP_RET hal_h264e_vpu_init_extra_info(void *extra_info) mpp_err("pps stream sw buf init failed"); return MPP_NOK; } + if (MPP_OK != hal_h264e_vpu_stream_buffer_init(sei_stream, H264E_SEI_BUF_SIZE)) { + mpp_err("sei stream sw buf init failed"); + return MPP_NOK; + } + info->sei_buf = mpp_calloc_size(RK_U8, H264E_SEI_BUF_SIZE); + memcpy(info->sei_buf, h264e_sei_uuid, H264E_UUID_LENGTH); return MPP_OK; } @@ -771,9 +829,12 @@ static MPP_RET hal_h264e_vpu_deinit_extra_info(void *extra_info) h264e_hal_vpu_extra_info *info = (h264e_hal_vpu_extra_info *)extra_info; h264e_hal_vpu_stream *sps_stream = &info->sps_stream; h264e_hal_vpu_stream *pps_stream = &info->pps_stream; + h264e_hal_vpu_stream *sei_stream = &info->sei_stream; MPP_FREE(sps_stream->buffer); MPP_FREE(pps_stream->buffer); + MPP_FREE(sei_stream->buffer); + MPP_FREE(info->sei_buf); return MPP_OK; } @@ -797,6 +858,12 @@ static MPP_RET hal_h264e_vpu_set_extra_info(h264e_hal_context *ctx) hal_h264e_vpu_write_sps(sps_stream, sps); hal_h264e_vpu_write_pps(pps_stream, pps); + if (ctx->sei_mode == MPP_ENC_SEI_MODE_ONE_SEQ || ctx->sei_mode == MPP_ENC_SEI_MODE_ONE_FRAME) { + info->sei_change_flg |= H264E_SEI_CHG_SPSPPS; + hal_h264e_vpu_sei_encode(ctx); + } + + h264e_hal_debug_leave(); return MPP_OK; @@ -1538,8 +1605,6 @@ MPP_RET hal_h264e_vpu_wait(void *hal, HalTaskInfo *task) mpp_assert(avg_qp >= 0); mpp_assert(avg_qp <= 51); - mpp_log("qp sum %d avg %d\n", fb->qp_sum, avg_qp); - result.bits = fb->out_strm_size * 8; result.type = syn->type; fb->result = &result; @@ -1598,6 +1663,7 @@ MPP_RET hal_h264e_vpu_control(void *hal, RK_S32 cmd_type, void *param) h264e_hal_vpu_extra_info *src = (h264e_hal_vpu_extra_info *)ctx->extra_info; h264e_hal_vpu_stream *sps_stream = &src->sps_stream; h264e_hal_vpu_stream *pps_stream = &src->pps_stream; + h264e_hal_vpu_stream *sei_stream = &src->sei_stream; size_t offset = 0; @@ -1609,6 +1675,9 @@ MPP_RET hal_h264e_vpu_control(void *hal, RK_S32 cmd_type, void *param) mpp_packet_write(pkt, offset, pps_stream->buffer, pps_stream->byte_cnt); offset += pps_stream->byte_cnt; + mpp_packet_write(pkt, offset, sei_stream->buffer, sei_stream->byte_cnt); + offset += sei_stream->byte_cnt; + mpp_packet_set_length(pkt, offset); *pkt_out = pkt; diff --git a/mpp/hal/vpu/h264e/hal_h264e_vpu.h b/mpp/hal/vpu/h264e/hal_h264e_vpu.h index d53c33ac..bb506fea 100644 --- a/mpp/hal/vpu/h264e/hal_h264e_vpu.h +++ b/mpp/hal/vpu/h264e/hal_h264e_vpu.h @@ -639,9 +639,12 @@ typedef struct h264e_hal_vpu_stream_t { typedef struct h264e_hal_vpu_extra_info_t { h264e_hal_vpu_stream sps_stream; h264e_hal_vpu_stream pps_stream; + h264e_hal_vpu_stream sei_stream; h264e_hal_sps sps; h264e_hal_pps pps; h264e_hal_sei sei; + RK_U8 *sei_buf; + RK_U32 sei_change_flg; } h264e_hal_vpu_extra_info; typedef struct h264e_vpu_reg_set_t { diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index 66fba579..db9a024d 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -657,6 +657,7 @@ MPP_RET test_mpp_setup(MpiEncTestData *p) } /* optional */ + p->sei_mode = MPP_ENC_SEI_MODE_ONE_SEQ; ret = mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &p->sei_mode); if (ret) { mpp_err("mpi control enc set sei cfg failed ret %d\n", ret);