diff options
author | Tim-Philipp Müller <tim@centricular.com> | 2021-10-28 17:41:54 +0100 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2021-10-31 12:51:26 +0000 |
commit | 14647d63b18b7039a8b281c02c952281655b4c7e (patch) | |
tree | 71447fb0984c9b944a31fb942089c789ceb6a9c2 | |
parent | 7391ff719c7e7ce3d70c265feb69c9bd5d808f57 (diff) | |
download | gstreamer-plugins-bad-14647d63b18b7039a8b281c02c952281655b4c7e.tar.gz |
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2558>
-rw-r--r-- | gst/videoparsers/gstmpeg4videoparse.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/gst/videoparsers/gstmpeg4videoparse.c b/gst/videoparsers/gstmpeg4videoparse.c index 53dddd4ae..50413d0e0 100644 --- a/gst/videoparsers/gstmpeg4videoparse.c +++ b/gst/videoparsers/gstmpeg4videoparse.c @@ -793,26 +793,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)) { |