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".
next prev 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