aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/encode.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-08-25 18:59:58 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-09-03 15:41:19 +0200
commit65f68514486fade5c6ab973c90047a422198ce07 (patch)
tree3d1f4a0c33c3ac8a119be7fb42660ca60c7e1382 /libavcodec/encode.c
parent25ea90b733883d0cbfdb76014b619a1b37489fca (diff)
downloadffmpeg-65f68514486fade5c6ab973c90047a422198ce07.tar.gz
avcodec/frame_thread_encoder: Stop serializing unreferencing AVFrames
Currently, the frame-threaded decoding API still supports thread-unsafe callbacks. If one uses a thread-unsafe get_buffer2() callback, calls to av_frame_unref() by the decoder are serialized, because it is presumed that the underlying deallocator is thread-unsafe. The frame-threaded encoder seems to have been written with this restriction in mind: It always serializes unreferencing its AVFrames, although no documentation forces it to do so. This commit schedules to change this behaviour as soon as thread-unsafe callbacks are removed. For this reason, the FF_API_THREAD_SAFE_CALLBACKS define is reused. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavcodec/encode.c')
-rw-r--r--libavcodec/encode.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/libavcodec/encode.c b/libavcodec/encode.c
index 8c6d81286c..ade4d458e7 100644
--- a/libavcodec/encode.c
+++ b/libavcodec/encode.c
@@ -190,7 +190,7 @@ int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame)
}
int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt,
- const AVFrame *frame, int *got_packet)
+ AVFrame *frame, int *got_packet)
{
const FFCodec *const codec = ffcodec(avctx->codec);
int ret;
@@ -227,6 +227,10 @@ int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt,
unref:
av_packet_unref(avpkt);
}
+#if !FF_API_THREAD_SAFE_CALLBACKS
+ if (frame)
+ av_frame_unref(frame);
+#endif
return ret;
}
@@ -267,8 +271,10 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt)
ret = ff_thread_video_encode_frame(avctx, avpkt, frame, &got_packet);
else {
ret = ff_encode_encode_cb(avctx, avpkt, frame, &got_packet);
+#if FF_API_THREAD_SAFE_CALLBACKS
if (frame)
av_frame_unref(frame);
+#endif
}
if (avci->draining && !got_packet)