Skip to content

Commit 0bbeaf5

Browse files
ntocmassiot
authored andcommitted
upipe_avcodec_encode: release frame buffers sooner
Avoid keeping video frame buffers after they have been used, to make sure hardware frames contexts are not kept needlessly.
1 parent e021c90 commit 0bbeaf5

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

lib/upipe-av/upipe_avcodec_encode.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -699,8 +699,9 @@ static int upipe_avcenc_encode_frame(struct upipe *upipe,
699699
upipe_dbg(upipe, "received null frame");
700700

701701
/* encode frame */
702-
int err;
703-
if ((err = avcodec_send_frame(context, frame)) < 0) {
702+
int err = avcodec_send_frame(context, frame);
703+
av_frame_unref(frame);
704+
if (unlikely(err < 0)) {
704705
upipe_err_va(upipe, "avcodec_send_frame: %s", av_err2str(err));
705706
return UBASE_ERR_EXTERNAL;
706707
}
@@ -869,7 +870,6 @@ static void upipe_avcenc_encode_video(struct upipe *upipe,
869870
return;
870871
}
871872

872-
av_frame_unref(frame);
873873
if (!ubase_check(ubuf_av_get_avframe(uref->ubuf, frame))) {
874874
for (int i = 0; i < UPIPE_AV_MAX_PLANES &&
875875
upipe_avcenc->chroma_map[i] != NULL; i++) {
@@ -962,6 +962,7 @@ static void upipe_avcenc_encode_video(struct upipe *upipe,
962962
frame->pts = upipe_avcenc->avcpts++;
963963
if (unlikely(!ubase_check(uref_avcenc_set_priv(uref, frame->pts)))) {
964964
uref_free(uref);
965+
av_frame_unref(frame);
965966
upipe_throw_fatal(upipe, UBASE_ERR_ALLOC);
966967
return;
967968
}

0 commit comments

Comments
 (0)