mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +00:00
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
This commit is contained in:
parent
d97aa274c2
commit
de75bca9b3
1 changed files with 29 additions and 0 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue