From 68ac392e8fd5dd36aa097b45e36dba79cf599d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 4 May 2013 09:48:02 +0100 Subject: [PATCH] ac3parse, dcaparse: check buffer size before trimming and unref old buffer as soon as possible. --- gst/audioparsers/gstac3parse.c | 19 +++++++++++++------ gst/audioparsers/gstdcaparse.c | 21 ++++++++++++++------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/gst/audioparsers/gstac3parse.c b/gst/audioparsers/gstac3parse.c index 533a675870..23b017f69d 100644 --- a/gst/audioparsers/gstac3parse.c +++ b/gst/audioparsers/gstac3parse.c @@ -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; } diff --git a/gst/audioparsers/gstdcaparse.c b/gst/audioparsers/gstdcaparse.c index 33ea9dbd71..6df74ea62a 100644 --- a/gst/audioparsers/gstdcaparse.c +++ b/gst/audioparsers/gstdcaparse.c @@ -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; }