summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2021-10-28 17:41:54 +0100
committerTim-Philipp Müller <tim@centricular.com>2021-10-31 12:51:26 +0000
commit14647d63b18b7039a8b281c02c952281655b4c7e (patch)
tree71447fb0984c9b944a31fb942089c789ceb6a9c2
parent7391ff719c7e7ce3d70c265feb69c9bd5d808f57 (diff)
downloadgstreamer-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.c42
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)) {