Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 11/11] avcodec/frame_thread_encoder: Stop serializing unreferencing AVFrames
Date: Sun, 28 Aug 2022 23:19:57 +0200
Message-ID: <AS8P250MB07445111452DAEC61DA4648A8F779@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <AS8P250MB07442EF78806549AFE15D6D98F779@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM>

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>
---
 libavcodec/encode.c               |  8 +++++++-
 libavcodec/encode.h               |  2 +-
 libavcodec/frame_thread_encoder.c | 14 ++++++++++++++
 3 files changed, 22 insertions(+), 2 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)
diff --git a/libavcodec/encode.h b/libavcodec/encode.h
index 296ffd312e..81d18d6ead 100644
--- a/libavcodec/encode.h
+++ b/libavcodec/encode.h
@@ -76,7 +76,7 @@ int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size);
 int ff_encode_preinit(AVCodecContext *avctx);
 
 int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt,
-                        const AVFrame *frame, int *got_packet);
+                        AVFrame *frame, int *got_packet);
 
 /**
  * Rescale from sample rate to AVCodecContext.time_base.
diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c
index 1faaef522e..35775ae823 100644
--- a/libavcodec/frame_thread_encoder.c
+++ b/libavcodec/frame_thread_encoder.c
@@ -48,7 +48,9 @@ typedef struct{
 
 typedef struct{
     AVCodecContext *parent_avctx;
+#if FF_API_THREAD_SAFE_CALLBACKS
     pthread_mutex_t buffer_mutex;
+#endif
 
     pthread_mutex_t task_fifo_mutex; /* Used to guard (next_)task_index */
     pthread_cond_t task_fifo_cond;
@@ -68,9 +70,15 @@ typedef struct{
 } ThreadContext;
 
 #define OFF(member) offsetof(ThreadContext, member)
+#if FF_API_THREAD_SAFE_CALLBACKS
 DEFINE_OFFSET_ARRAY(ThreadContext, thread_ctx, pthread_init_cnt,
                     (OFF(buffer_mutex), OFF(task_fifo_mutex), OFF(finished_task_mutex)),
                     (OFF(task_fifo_cond), OFF(finished_task_cond)));
+#else
+DEFINE_OFFSET_ARRAY(ThreadContext, thread_ctx, pthread_init_cnt,
+                    (OFF(task_fifo_mutex), OFF(finished_task_mutex)),
+                    (OFF(task_fifo_cond),  OFF(finished_task_cond)));
+#endif
 #undef OFF
 
 static void * attribute_align_arg worker(void *v){
@@ -104,9 +112,11 @@ static void * attribute_align_arg worker(void *v){
         pkt   = task->outdata;
 
         ret = ff_encode_encode_cb(avctx, pkt, frame, &task->got_packet);
+#if FF_API_THREAD_SAFE_CALLBACKS
         pthread_mutex_lock(&c->buffer_mutex);
         av_frame_unref(frame);
         pthread_mutex_unlock(&c->buffer_mutex);
+#endif
         pthread_mutex_lock(&c->finished_task_mutex);
         task->return_code = ret;
         task->finished    = 1;
@@ -114,9 +124,13 @@ static void * attribute_align_arg worker(void *v){
         pthread_mutex_unlock(&c->finished_task_mutex);
     }
 end:
+#if FF_API_THREAD_SAFE_CALLBACKS
     pthread_mutex_lock(&c->buffer_mutex);
+#endif
     avcodec_close(avctx);
+#if FF_API_THREAD_SAFE_CALLBACKS
     pthread_mutex_unlock(&c->buffer_mutex);
+#endif
     av_freep(&avctx);
     return NULL;
 }
-- 
2.34.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2022-08-28 21:21 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-28 21:18 [FFmpeg-devel] [PATCH 01/11] avcodec/mpeg4video: Factor non-codec stuff out into a header of its own Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 02/11] avcodec/flac: Remove unnecessary FLACSTREAMINFO define Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 03/11] avcodec/flacdec: Shorten name Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 04/11] avcodec/flacdec: Don't infer max_framesize unnecessarily Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 05/11] avcodec/flac: Move ff_flac_get_max_frame_size() to flacenc.c Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 06/11] avcodec/flac: Remove unused parameter from ff_flac_is_extradata_valid() Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 07/11] avcodec/flac: Remove pointless define Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 08/11] avcodec/flac: Move decoder+parser stuff into a new header, flac_parse.h Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 09/11] avcodec/flac: Don't use bytestream API unnecessarily Andreas Rheinhardt
2022-08-28 21:19 ` [FFmpeg-devel] [PATCH 10/11] avcodec/encode: Avoid unreferencing blank AVFrames Andreas Rheinhardt
2022-09-02 20:16   ` Andreas Rheinhardt
2022-08-28 21:19 ` Andreas Rheinhardt [this message]
2022-08-28 23:34 ` [FFmpeg-devel] [PATCH 12/16] avutil/internal: Remove unused ff_rint64_clip() Andreas Rheinhardt
2022-08-28 23:34 ` [FFmpeg-devel] [PATCH 13/16] avutil/internal: Remove unused FF_SYMVER Andreas Rheinhardt
2022-08-28 23:34 ` [FFmpeg-devel] [PATCH 14/16] avutil/dict: Move avpriv_dict_set_timestamp() to a header of its own Andreas Rheinhardt
2022-08-28 23:34 ` [FFmpeg-devel] [PATCH 15/16] avutil/internal: Move avpriv-file API " Andreas Rheinhardt
2022-08-28 23:34 ` [FFmpeg-devel] [PATCH 16/16] avutil/fifo: Properly deprecate av_tempfile() Andreas Rheinhardt
2022-08-31  3:30   ` Anton Khirnov
2022-08-31  3:34     ` Andreas Rheinhardt
2022-08-29 13:45 ` [FFmpeg-devel] [PATCH 17/18] avcodec/codec_internal: Add macro to set AVCodec.long_name Andreas Rheinhardt
2022-08-29 13:45 ` [FFmpeg-devel] [PATCH 18/18] avcodec/codec_internal: Add macros for update_thread_context(_for_user) Andreas Rheinhardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AS8P250MB07445111452DAEC61DA4648A8F779@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM \
    --to=andreas.rheinhardt@outlook.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git