From 75bcdc456410b5491a76afe29d648f970880dfe8 Mon Sep 17 00:00:00 2001 From: Ruben Gonzalez Date: Fri, 12 Jul 2024 17:09:15 +0200 Subject: [PATCH] avmux: Fix crash when muxer doesn't get codecid gst_ffmpeg_formatid_get_codecids from gst_ffmpegmux_base_init to gst_ffmpegmux_base_init FFmpeg 7.0 included new muxer rcwt for Raw Captions with Time (RCWT). Commit [1]. GStreamer couldn't get sink caps for muxer it. Calling gst_ffmpeg_formatid_get_codecids in gst_ffmpegmux_register to avoid create muxer without pad templates. [1] https://github.com/FFmpeg/FFmpeg/commit/3525544e48 Part-of: --- subprojects/gst-libav/ext/libav/gstavcodecmap.c | 2 +- subprojects/gst-libav/ext/libav/gstavcodecmap.h | 2 +- subprojects/gst-libav/ext/libav/gstavmux.c | 13 ++++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/subprojects/gst-libav/ext/libav/gstavcodecmap.c b/subprojects/gst-libav/ext/libav/gstavcodecmap.c index 9176bb1952..f8735bc512 100644 --- a/subprojects/gst-libav/ext/libav/gstavcodecmap.c +++ b/subprojects/gst-libav/ext/libav/gstavcodecmap.c @@ -3884,7 +3884,7 @@ gst_ffmpeg_formatid_to_caps (const gchar * format_name) gboolean gst_ffmpeg_formatid_get_codecids (const gchar * format_name, enum AVCodecID **video_codec_list, enum AVCodecID **audio_codec_list, - AVOutputFormat * plugin) + const AVOutputFormat * plugin) { static enum AVCodecID tmp_vlist[] = { AV_CODEC_ID_NONE, diff --git a/subprojects/gst-libav/ext/libav/gstavcodecmap.h b/subprojects/gst-libav/ext/libav/gstavcodecmap.h index 1c49932391..d0bb2031f0 100644 --- a/subprojects/gst-libav/ext/libav/gstavcodecmap.h +++ b/subprojects/gst-libav/ext/libav/gstavcodecmap.h @@ -123,7 +123,7 @@ gboolean gst_ffmpeg_formatid_get_codecids (const gchar *format_name, enum AVCodecID ** video_codec_list, enum AVCodecID ** audio_codec_list, - AVOutputFormat * plugin); + const AVOutputFormat * plugin); #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100) gboolean diff --git a/subprojects/gst-libav/ext/libav/gstavmux.c b/subprojects/gst-libav/ext/libav/gstavmux.c index 389a873cf7..c22ca78983 100644 --- a/subprojects/gst-libav/ext/libav/gstavmux.c +++ b/subprojects/gst-libav/ext/libav/gstavmux.c @@ -69,7 +69,7 @@ struct _GstFFMpegMuxClass { GstElementClass parent_class; - AVOutputFormat *in_plugin; + const AVOutputFormat *in_plugin; }; #define GST_TYPE_FFMPEGMUX \ @@ -192,7 +192,7 @@ gst_ffmpegmux_base_init (gpointer g_class) GstFFMpegMuxClass *klass = (GstFFMpegMuxClass *) g_class; GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstPadTemplate *videosinktempl, *audiosinktempl, *srctempl; - AVOutputFormat *in_plugin; + const AVOutputFormat *in_plugin; GstCaps *srccaps, *audiosinkcaps, *videosinkcaps; enum AVCodecID *video_ids = NULL, *audio_ids = NULL; gchar *longname, *description, *name; @@ -332,7 +332,7 @@ gst_ffmpegmux_init (GstFFMpegMux * ffmpegmux, GstFFMpegMuxClass * g_class) (GstCollectPadsFunction) gst_ffmpegmux_collected, ffmpegmux); ffmpegmux->context = avformat_alloc_context (); - ffmpegmux->context->oformat = oclass->in_plugin; + ffmpegmux->context->oformat = (struct AVOutputFormat *) oclass->in_plugin; ffmpegmux->context->nb_streams = 0; ffmpegmux->opened = FALSE; @@ -872,6 +872,7 @@ gst_ffmpegmux_register (GstPlugin * plugin) GType type; const AVOutputFormat *in_plugin; void *i = 0; + enum AVCodecID *video_ids = NULL, *audio_ids = NULL; GST_LOG ("Registering muxers"); @@ -925,6 +926,12 @@ gst_ffmpegmux_register (GstPlugin * plugin) } } + if (!gst_ffmpeg_formatid_get_codecids (in_plugin->name, &video_ids, + &audio_ids, in_plugin)) { + GST_LOG ("Ignoring muxer %s because no sink caps", in_plugin->name); + continue; + } + if (gst_ffmpegmux_get_replacement (in_plugin->name)) rank = GST_RANK_NONE;