fixup! lavc/rkmppenc: add UDU SEI support for H26x encoders

polish the udu-sei impl.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
This commit is contained in:
nyanmisaka
2025-04-22 20:52:00 +08:00
parent 5898b091ee
commit 57d5befee9
2 changed files with 15 additions and 22 deletions

View File

@@ -182,8 +182,8 @@ static void clear_unused_frames(MPPEncFrame *list)
mpp_frame_deinit(&list->mpp_frame); mpp_frame_deinit(&list->mpp_frame);
list->mpp_frame = NULL; list->mpp_frame = NULL;
av_freep(&list->mpp_sei); av_freep(&list->mpp_sei_set.datas);
list->mpp_sei_sz = 0; list->mpp_sei_set.count = 0;
av_frame_free(&list->frame); av_frame_free(&list->frame);
list->queued = 0; list->queued = 0;
@@ -214,8 +214,8 @@ static void clear_frame_list(MPPEncFrame **list)
frame->mpp_frame = NULL; frame->mpp_frame = NULL;
} }
av_freep(&frame->mpp_sei); av_freep(&frame->mpp_sei_set.datas);
frame->mpp_sei_sz = 0; frame->mpp_sei_set.count = 0;
av_frame_free(&frame->frame); av_frame_free(&frame->frame);
av_freep(&frame); av_freep(&frame);
@@ -577,6 +577,7 @@ static int rkmpp_prepare_udu_sei_data(AVCodecContext *avctx, MPPEncFrame *mpp_en
/* user data unregistered SEI of H26X */ /* user data unregistered SEI of H26X */
for (i = 0; i < mpp_enc_frame->frame->nb_side_data; i++) { for (i = 0; i < mpp_enc_frame->frame->nb_side_data; i++) {
MppEncUserDataSet *mpp_sei_set = &mpp_enc_frame->mpp_sei_set;
AVFrameSideData *sd = mpp_enc_frame->frame->side_data[i]; AVFrameSideData *sd = mpp_enc_frame->frame->side_data[i];
uint8_t *user_data = sd->data; uint8_t *user_data = sd->data;
void *buf = NULL; void *buf = NULL;
@@ -591,37 +592,31 @@ static int rkmpp_prepare_udu_sei_data(AVCodecContext *avctx, MPPEncFrame *mpp_en
continue; continue;
} }
buf = av_fast_realloc(mpp_enc_frame->mpp_sei, buf = av_fast_realloc(mpp_sei_set->datas,
&mpp_enc_frame->mpp_sei_sz, &mpp_sei_set->count,
(sei_count + 1) * sizeof(*(mpp_enc_frame->mpp_sei))); (sei_count + 1) * sizeof(*(mpp_sei_set->datas)));
if (!buf) { if (!buf) {
av_log(avctx, AV_LOG_ERROR, "Failed to realloc UDU SEI buffer\n"); av_log(avctx, AV_LOG_ERROR, "Failed to realloc UDU SEI buffer\n");
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} else { } else {
mpp_enc_frame->mpp_sei = buf; mpp_sei_set->datas = (MppEncUserDataFull *)buf;
mpp_enc_frame->mpp_sei[sei_count].len = sd->size - AV_UUID_LEN; mpp_sei_set->datas[sei_count].len = sd->size - AV_UUID_LEN;
mpp_enc_frame->mpp_sei[sei_count].uuid = (RK_U8 *)user_data; mpp_sei_set->datas[sei_count].uuid = (RK_U8 *)user_data;
mpp_enc_frame->mpp_sei[sei_count].pdata = &user_data[AV_UUID_LEN]; mpp_sei_set->datas[sei_count].pdata = &user_data[AV_UUID_LEN];
++sei_count; mpp_sei_set->count = ++sei_count;
} }
} }
if (sei_count > 0) { if (sei_count > 0) {
MppMeta mpp_meta = NULL; MppMeta mpp_meta = mpp_frame_get_meta(mpp_enc_frame->mpp_frame);
MppEncUserDataSet *mpp_sei_set = &mpp_enc_frame->mpp_sei_set;
mpp_sei_set->datas = mpp_enc_frame->mpp_sei;
mpp_sei_set->count = sei_count;
mpp_meta = mpp_frame_get_meta(mpp_enc_frame->mpp_frame);
if (!mpp_meta) { if (!mpp_meta) {
av_log(avctx, AV_LOG_ERROR, "Failed to get frame meta\n"); av_log(avctx, AV_LOG_ERROR, "Failed to get frame meta\n");
return AVERROR_EXTERNAL; return AVERROR_EXTERNAL;
} }
if ((ret = mpp_meta_set_ptr(mpp_meta, KEY_USER_DATAS, if ((ret = mpp_meta_set_ptr(mpp_meta, KEY_USER_DATAS,
mpp_sei_set)) != MPP_OK) { &mpp_enc_frame->mpp_sei_set)) != MPP_OK) {
av_log(avctx, AV_LOG_ERROR, "Failed to set the UDU SEI datas ptr\n"); av_log(avctx, AV_LOG_ERROR, "Failed to set the UDU SEI datas ptr\n");
return AVERROR_EXTERNAL; return AVERROR_EXTERNAL;
} }

View File

@@ -48,8 +48,6 @@ typedef struct MPPEncFrame {
AVFrame *frame; AVFrame *frame;
MppFrame mpp_frame; MppFrame mpp_frame;
MppEncUserDataSet mpp_sei_set; MppEncUserDataSet mpp_sei_set;
MppEncUserDataFull *mpp_sei;
int mpp_sei_sz;
struct MPPEncFrame *next; struct MPPEncFrame *next;
int queued; int queued;
} MPPEncFrame; } MPPEncFrame;