ac3parse, dcaparse: check buffer size before trimming
authorTim-Philipp Müller <tim@centricular.net>
Sat, 4 May 2013 08:48:02 +0000 (09:48 +0100)
committerTim-Philipp Müller <tim@centricular.net>
Sat, 4 May 2013 09:08:47 +0000 (10:08 +0100)
and unref old buffer as soon as possible.

gst/audioparsers/gstac3parse.c
gst/audioparsers/gstdcaparse.c

index 533a675870671fabd6bbc9971bd8cb07e2556f45..23b017f69d3efbd0fad41f42858a034cdfac3ea4 100644 (file)
@@ -692,14 +692,21 @@ cleanup:
 static GstFlowReturn
 gst_ac3_parse_chain_priv (GstPad * pad, GstObject * parent, GstBuffer * buffer)
 {
-  GstBuffer *newbuf;
-  GstFlowReturn ret;
   GstAc3Parse *ac3parse = GST_AC3_PARSE (parent);
+  GstFlowReturn ret;
+  GstBuffer *newbuf;
+  gsize size;
+
+  size = gst_buffer_get_size (buffer);
+  if (size >= 2) {
+    newbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 2, size - 2);
+    gst_buffer_unref (buffer);
+    ret = ac3parse->baseparse_chainfunc (pad, parent, newbuf);
+  } else {
+    gst_buffer_unref (buffer);
+    ret = GST_FLOW_OK;
+  }
 
-  newbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL,
-      2, gst_buffer_get_size (buffer) - 2);
-  ret = ac3parse->baseparse_chainfunc (pad, parent, newbuf);
-  gst_buffer_unref (buffer);
   return ret;
 }
 
index 33ea9dbd71a1747afc7efb796267729091e31bbc..6df74ea62a54d69e26fcba22d1590f31085915db 100644 (file)
@@ -454,16 +454,23 @@ cleanup:
  * */
 
 static GstFlowReturn
-gst_dca_parse_chain_priv (GstPad * pad, GstObject *parent, GstBuffer * buffer)
+gst_dca_parse_chain_priv (GstPad * pad, GstObject * parent, GstBuffer * buffer)
 {
-  GstBuffer *newbuf;
-  GstFlowReturn ret;
   GstDcaParse *dcaparse = GST_DCA_PARSE (parent);
+  GstFlowReturn ret;
+  GstBuffer *newbuf;
+  gsize size;
+
+  size = gst_buffer_get_size (buffer);
+  if (size >= 2) {
+    newbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 2, size - 2);
+    gst_buffer_unref (buffer);
+    ret = dcaparse->baseparse_chainfunc (pad, parent, newbuf);
+  } else {
+    gst_buffer_unref (buffer);
+    ret = GST_FLOW_OK;
+  }
 
-  newbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL,
-      2, gst_buffer_get_size (buffer) - 2);
-  ret = dcaparse->baseparse_chainfunc (pad, parent, newbuf);
-  gst_buffer_unref (buffer);
   return ret;
 }