From 9d5b23ff588dfa2b3545bdf88a164bd4b3d47a02 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 28 Oct 2021 17:41:54 +0100 Subject: [PATCH] mpeg4videoparse: fix criticals trying to insert configs that don't exist yet With mpeg4videoparse drop=false config-interval=N|-1 we might be trying to insert a config before we have actually received one, in which case we'll try to map a NULL buffer which will generate lots of criticals. Fixes #855 Part-of: --- .../gst/videoparsers/gstmpeg4videoparse.c | 42 ++++++++++++---------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst/videoparsers/gstmpeg4videoparse.c b/subprojects/gst-plugins-bad/gst/videoparsers/gstmpeg4videoparse.c index e54f480..1214a26 100644 --- a/subprojects/gst-plugins-bad/gst/videoparsers/gstmpeg4videoparse.c +++ b/subprojects/gst-plugins-bad/gst/videoparsers/gstmpeg4videoparse.c @@ -797,26 +797,30 @@ gst_mpeg4vparse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) /* we need to send config now first */ GST_INFO_OBJECT (parse, "inserting config in stream"); - gst_buffer_map (mp4vparse->config, &cmap, GST_MAP_READ); - diffconf = (gst_buffer_get_size (buffer) < cmap.size) - || gst_buffer_memcmp (buffer, 0, cmap.data, cmap.size); - csize = cmap.size; - gst_buffer_unmap (mp4vparse->config, &cmap); - - /* avoid inserting duplicate config */ - if (diffconf) { - GstBuffer *superbuf; - - /* insert header */ - superbuf = - gst_buffer_append (gst_buffer_ref (mp4vparse->config), - gst_buffer_ref (buffer)); - gst_buffer_copy_into (superbuf, buffer, GST_BUFFER_COPY_METADATA, 0, - csize); - gst_buffer_replace (&frame->out_buffer, superbuf); - gst_buffer_unref (superbuf); + if (mp4vparse->config != NULL + && gst_buffer_map (mp4vparse->config, &cmap, GST_MAP_READ)) { + diffconf = (gst_buffer_get_size (buffer) < cmap.size) + || gst_buffer_memcmp (buffer, 0, cmap.data, cmap.size); + csize = cmap.size; + gst_buffer_unmap (mp4vparse->config, &cmap); + + /* avoid inserting duplicate config */ + if (diffconf) { + GstBuffer *superbuf; + + /* insert header */ + superbuf = + gst_buffer_append (gst_buffer_ref (mp4vparse->config), + gst_buffer_ref (buffer)); + gst_buffer_copy_into (superbuf, buffer, GST_BUFFER_COPY_METADATA, 0, + csize); + gst_buffer_replace (&frame->out_buffer, superbuf); + gst_buffer_unref (superbuf); + } else { + GST_INFO_OBJECT (parse, "... but avoiding duplication"); + } } else { - GST_INFO_OBJECT (parse, "... but avoiding duplication"); + GST_WARNING_OBJECT (parse, "No config received yet"); } if (G_UNLIKELY (timestamp != -1)) { -- 2.7.4