From: Nicolas Dufresne Date: Thu, 8 Aug 2013 10:08:31 +0000 (+0200) Subject: bytereader: Accelerate MPEG/H264 start code scanning X-Git-Tag: 1.1.4~43 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=de75bca9b387c404a29cb057046d0db1d601794c;p=platform%2Fupstream%2Fgstreamer.git bytereader: Accelerate MPEG/H264 start code scanning Accelerate MPEG/H264 start code scanning using Boyer-Moor bad character heuristic. https://bugzilla.gnome.org/show_bug.cgi?id=702357 --- diff --git a/libs/gst/base/gstbytereader.c b/libs/gst/base/gstbytereader.c index 5ca9555..a5f9e40 100644 --- a/libs/gst/base/gstbytereader.c +++ b/libs/gst/base/gstbytereader.c @@ -771,6 +771,31 @@ gst_byte_reader_dup_data (GstByteReader * reader, guint size, guint8 ** val) return _gst_byte_reader_dup_data_inline (reader, size, val); } +/* Special optimized scan for mask 0xffffff00 and pattern 0x00000100 */ +static inline gint +_scan_for_start_code (const guint8 * data, guint offset, guint size) +{ + guint i = 0; + + while (i <= (size - 4)) { + if (data[i + 2] > 1) { + i += 3; + } else if (data[i + 1]) { + i += 2; + } else if (data[i] || data[i + 2] != 1) { + i++; + } else { + break; + } + } + + if (i <= (size - 4)) + return i + offset; + + /* nothing found */ + return -1; +} + /** * gst_byte_reader_masked_scan_uint32: * @reader: a #GstByteReader @@ -831,6 +856,10 @@ gst_byte_reader_masked_scan_uint32 (const GstByteReader * reader, guint32 mask, data = reader->data + reader->byte + offset; + /* Handle special case found in MPEG and H264 */ + if ((pattern == 0x00000100) && (mask == 0xffffff00)) + return _scan_for_start_code (data, offset, size); + /* set the state to something that does not match */ state = ~pattern;