mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-29 22:00:58 +02:00
avcodec/videotoolboxenc: Put ExtraSEI inside BufNode directly
Reduce error path and simplify the code. Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
parent
2fca8e400e
commit
635f7c0f6c
@ -227,7 +227,7 @@ typedef struct ExtraSEI {
|
||||
|
||||
typedef struct BufNode {
|
||||
CMSampleBufferRef cm_buffer;
|
||||
ExtraSEI *sei;
|
||||
ExtraSEI sei;
|
||||
AVBufferRef *frame_buf;
|
||||
struct BufNode* next;
|
||||
} BufNode;
|
||||
@ -281,6 +281,18 @@ typedef struct VTEncContext {
|
||||
int max_ref_frames;
|
||||
} VTEncContext;
|
||||
|
||||
static void vtenc_free_buf_node(BufNode *info)
|
||||
{
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
av_free(info->sei.data);
|
||||
if (info->cm_buffer)
|
||||
CFRelease(info->cm_buffer);
|
||||
av_buffer_unref(&info->frame_buf);
|
||||
av_free(info);
|
||||
}
|
||||
|
||||
static int vt_dump_encoder(AVCodecContext *avctx)
|
||||
{
|
||||
VTEncContext *vtctx = avctx->priv_data;
|
||||
@ -388,7 +400,7 @@ static void vtenc_reset(VTEncContext *vtctx)
|
||||
}
|
||||
}
|
||||
|
||||
static int vtenc_q_pop(VTEncContext *vtctx, bool wait, CMSampleBufferRef *buf, ExtraSEI **sei)
|
||||
static int vtenc_q_pop(VTEncContext *vtctx, bool wait, CMSampleBufferRef *buf, ExtraSEI *sei)
|
||||
{
|
||||
BufNode *info;
|
||||
|
||||
@ -426,14 +438,12 @@ static int vtenc_q_pop(VTEncContext *vtctx, bool wait, CMSampleBufferRef *buf, E
|
||||
pthread_mutex_unlock(&vtctx->lock);
|
||||
|
||||
*buf = info->cm_buffer;
|
||||
info->cm_buffer = NULL;
|
||||
if (sei && *buf) {
|
||||
*sei = info->sei;
|
||||
} else if (info->sei) {
|
||||
if (info->sei->data) av_free(info->sei->data);
|
||||
av_free(info->sei);
|
||||
info->sei = (ExtraSEI) {0};
|
||||
}
|
||||
av_free(info);
|
||||
|
||||
vtenc_free_buf_node(info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -715,23 +725,6 @@ static int set_extradata(AVCodecContext *avctx, CMSampleBufferRef sample_buffer)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vtenc_free_buf_node(BufNode *info)
|
||||
{
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
if (info->sei) {
|
||||
av_free(info->sei->data);
|
||||
av_free(info->sei);
|
||||
}
|
||||
|
||||
if (info->cm_buffer)
|
||||
CFRelease(info->cm_buffer);
|
||||
|
||||
av_buffer_unref(&info->frame_buf);
|
||||
av_free(info);
|
||||
}
|
||||
|
||||
static void vtenc_output_callback(
|
||||
void *ctx,
|
||||
void *sourceFrameCtx,
|
||||
@ -2589,7 +2582,6 @@ static int vtenc_send_frame(AVCodecContext *avctx,
|
||||
CVPixelBufferRef cv_img = NULL;
|
||||
AVFrameSideData *side_data = NULL;
|
||||
BufNode *node = av_mallocz(sizeof(*node));
|
||||
ExtraSEI *sei = NULL;
|
||||
int status;
|
||||
|
||||
if (!node)
|
||||
@ -2606,15 +2598,8 @@ static int vtenc_send_frame(AVCodecContext *avctx,
|
||||
#if CONFIG_ATSC_A53
|
||||
side_data = av_frame_get_side_data(frame, AV_FRAME_DATA_A53_CC);
|
||||
if (vtctx->a53_cc && side_data && side_data->size) {
|
||||
sei = av_mallocz(sizeof(*sei));
|
||||
if (!sei) {
|
||||
status = AVERROR(ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
node->sei = sei;
|
||||
status = ff_alloc_a53_sei(frame, 0, &sei->data, &sei->size);
|
||||
status = ff_alloc_a53_sei(frame, 0, &node->sei.data, &node->sei.size);
|
||||
if (status < 0) {
|
||||
av_free(sei);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -2659,7 +2644,7 @@ static av_cold int vtenc_frame(
|
||||
bool get_frame;
|
||||
int status;
|
||||
CMSampleBufferRef buf = NULL;
|
||||
ExtraSEI *sei = NULL;
|
||||
ExtraSEI sei = {0};
|
||||
|
||||
if (frame) {
|
||||
status = vtenc_send_frame(avctx, vtctx, frame);
|
||||
@ -2700,11 +2685,8 @@ static av_cold int vtenc_frame(
|
||||
if (status) goto end_nopkt;
|
||||
if (!buf) goto end_nopkt;
|
||||
|
||||
status = vtenc_cm_to_avpacket(avctx, buf, pkt, sei);
|
||||
if (sei) {
|
||||
if (sei->data) av_free(sei->data);
|
||||
av_free(sei);
|
||||
}
|
||||
status = vtenc_cm_to_avpacket(avctx, buf, pkt, sei.data ? &sei : NULL);
|
||||
av_free(sei.data);
|
||||
CFRelease(buf);
|
||||
if (status) goto end_nopkt;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user