From 83f02e8bc834fc6de48169fb77346cd112297574 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Fri, 18 Dec 2009 21:05:11 +0100 Subject: [PATCH] flacparse: locate next sync code more efficiently --- gst/audioparsers/gstflacparse.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/gst/audioparsers/gstflacparse.c b/gst/audioparsers/gstflacparse.c index 362463a954..741ad8f49a 100644 --- a/gst/audioparsers/gstflacparse.c +++ b/gst/audioparsers/gstflacparse.c @@ -633,6 +633,9 @@ gst_flac_parse_check_valid_frame (GstBaseParse * parse, GstBuffer * buffer, GstFlacParse *flacparse = GST_FLAC_PARSE (parse); const guint8 *data = GST_BUFFER_DATA (buffer); + if (G_UNLIKELY (GST_BUFFER_SIZE (buffer) < 4)) + return FALSE; + if (flacparse->state == GST_FLAC_PARSE_STATE_INIT) { if (memcmp (GST_BUFFER_DATA (buffer), "fLaC", 4) == 0) { GST_DEBUG_OBJECT (flacparse, "fLaC marker found"); @@ -682,8 +685,21 @@ gst_flac_parse_check_valid_frame (GstBaseParse * parse, GstBuffer * buffer, return FALSE; } } else { - GST_DEBUG_OBJECT (flacparse, "Sync code not found"); - return FALSE; + GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer); + gint off; + + off = gst_byte_reader_masked_scan_uint32 (&reader, 0xfffc0000, 0xfff80000, + 0, GST_BUFFER_SIZE (buffer)); + + if (off > 0) { + GST_DEBUG_OBJECT (parse, "Possible sync at buffer offset %d", off); + *skipsize = off; + return FALSE; + } else { + GST_DEBUG_OBJECT (flacparse, "Sync code not found"); + *skipsize = GST_BUFFER_SIZE (buffer) - 3; + return FALSE; + } } }