diff --git a/inc/mpp_meta.h b/inc/mpp_meta.h index 10b8fa2a..527cca88 100644 --- a/inc/mpp_meta.h +++ b/inc/mpp_meta.h @@ -79,6 +79,7 @@ typedef enum MppMetaKey_e { KEY_ROI_DATA = FOURCC_META('r', 'o', 'i', ' '), KEY_OSD_DATA = FOURCC_META('o', 's', 'd', ' '), KEY_USER_DATA = FOURCC_META('u', 's', 'r', 'd'), + KEY_USER_DATAS = FOURCC_META('u', 'r', 'd', 's'), /* input motion list for smart p rate control */ KEY_MV_LIST = FOURCC_META('m', 'v', 'l', 't'), diff --git a/inc/rk_venc_cmd.h b/inc/rk_venc_cmd.h index a06dba72..f7458add 100644 --- a/inc/rk_venc_cmd.h +++ b/inc/rk_venc_cmd.h @@ -1097,8 +1097,19 @@ typedef struct MppEncOSDData_t { } MppEncOSDData; typedef struct MppEncUserData_t { - RK_U32 len; - void *pdata; + RK_U32 len; + void *pdata; } MppEncUserData; +typedef struct MppEncUserDataFull_t { + RK_U32 len; + RK_U8 *uuid; + void *pdata; +} MppEncUserDataFull; + +typedef struct MppEncUserDataSet_t { + RK_U32 count; + MppEncUserDataFull *datas; +} MppEncUserDataSet; + #endif /*__RK_VENC_CMD_H__*/ diff --git a/mpp/base/mpp_meta.cpp b/mpp/base/mpp_meta.cpp index 7d0cddf7..e7d8a390 100644 --- a/mpp/base/mpp_meta.cpp +++ b/mpp/base/mpp_meta.cpp @@ -46,6 +46,7 @@ static MppMetaDef meta_defs[] = { { KEY_ROI_DATA, TYPE_PTR, }, { KEY_OSD_DATA, TYPE_PTR, }, { KEY_USER_DATA, TYPE_PTR, }, + { KEY_USER_DATAS, TYPE_PTR, }, { KEY_MV_LIST, TYPE_PTR, }, { KEY_ENC_MARK_LTR, TYPE_S32, }, diff --git a/mpp/codec/mpp_enc_v2.cpp b/mpp/codec/mpp_enc_v2.cpp index ae274b09..04c6269f 100644 --- a/mpp/codec/mpp_enc_v2.cpp +++ b/mpp/codec/mpp_enc_v2.cpp @@ -203,6 +203,11 @@ static RK_U8 uuid_usr_data[16] = { 0x85, 0xd9, 0xb2, 0xa2, 0x4f, 0xa1, 0x19, 0x5b, }; +static RK_U8 uuid_debug_info[16] = { + 0x57, 0x68, 0x97, 0x80, 0xe7, 0x0c, 0x4b, 0x65, + 0xa9, 0x06, 0xae, 0x29, 0x94, 0x11, 0xcd, 0x9a +}; + static void reset_hal_enc_task(HalEncTask *task) { memset(task, 0, sizeof(*task)); @@ -709,6 +714,47 @@ static void update_rc_cfg_log(MppEncImpl *impl, const char* fmt, ...) va_end(args); } +static void update_user_datas(EncImpl impl, MppPacket packet, MppFrame frame, HalEncTask *hal_task) +{ + MppMeta frm_meta = mpp_frame_get_meta(frame); + MppEncUserData *user_data = NULL; + MppEncUserDataSet *user_datas = NULL; + RK_S32 length = 0; + + mpp_meta_get_ptr(frm_meta, KEY_USER_DATA, (void**)&user_data); + if (user_data) { + if (user_data->pdata && user_data->len) { + enc_impl_add_prefix(impl, packet, &length, uuid_usr_data, + user_data->pdata, user_data->len); + + hal_task->sei_length += length; + hal_task->length += length; + } else + mpp_err_f("failed to insert user data %p len %d\n", + user_data->pdata, user_data->len); + } + + mpp_meta_get_ptr(frm_meta, KEY_USER_DATAS, (void**)&user_datas); + if (user_datas && user_datas->count) { + RK_U32 i = 0; + + for (i = 0; i < user_datas->count; i++) { + MppEncUserDataFull *user_data_v2 = &user_datas->datas[i]; + if (user_data_v2->pdata && user_data_v2->len) { + if (user_data_v2->uuid) + enc_impl_add_prefix(impl, packet, &length, user_data_v2->uuid, + user_data_v2->pdata, user_data_v2->len); + else + enc_impl_add_prefix(impl, packet, &length, uuid_debug_info, + user_data_v2->pdata, user_data_v2->len); + + hal_task->sei_length += length; + hal_task->length += length; + } + } + } +} + static void set_rc_cfg(RcCfg *cfg, MppEncCfgSet *cfg_set) { MppEncRcCfg *rc = &cfg_set->rc; @@ -906,24 +952,7 @@ static MPP_RET mpp_enc_normal(Mpp *mpp, EncTask *task) } if (mpp_frame_has_meta(frame)) { - MppMeta frm_meta = mpp_frame_get_meta(frame); - MppEncUserData *user_data = NULL; - - mpp_meta_get_ptr(frm_meta, KEY_USER_DATA, (void**)&user_data); - - if (user_data) { - if (user_data->pdata && user_data->len) { - RK_S32 length = 0; - - enc_impl_add_prefix(impl, packet, &length, uuid_usr_data, - user_data->pdata, user_data->len); - - hal_task->sei_length += length; - hal_task->length += length; - } else - mpp_err_f("failed to insert user data %p len %d\n", - user_data->pdata, user_data->len); - } + update_user_datas(impl, packet, frame, hal_task); } // check for user data adding diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index e932a17a..e72078c4 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -470,8 +470,8 @@ MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p) } } - mpp_env_get_u32("osd_enable", &p->user_data_enable, 0); mpp_env_get_u32("roi_enable", &p->roi_enable, 0); + mpp_env_get_u32("user_data_enable", &p->user_data_enable, 0); RET: return ret; @@ -599,6 +599,27 @@ MPP_RET test_mpp_run(MpiEncTestData *p) user_data.len = strlen(str) + 1; mpp_meta_set_ptr(meta, KEY_USER_DATA, &user_data); } + static RK_U8 uuid_debug_info[16] = { + 0x57, 0x68, 0x97, 0x80, 0xe7, 0x0c, 0x4b, 0x65, + 0xa9, 0x06, 0xae, 0x29, 0x94, 0x11, 0xcd, 0x9a + }; + + MppEncUserDataSet data_group; + MppEncUserDataFull datas[2]; + char *str1 = "this is user data 1\n"; + char *str2 = "this is user data 2\n"; + data_group.count = 2; + datas[0].len = strlen(str1) + 1; + datas[0].pdata = str1; + datas[0].uuid = uuid_debug_info; + + datas[1].len = strlen(str2) + 1; + datas[1].pdata = str2; + datas[1].uuid = uuid_debug_info; + + data_group.datas = datas; + + mpp_meta_set_ptr(meta, KEY_USER_DATAS, &data_group); } if (p->osd_enable) {