summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorNicolas Dufresne <nicolas.dufresne@collabora.com>2012-05-08 16:51:11 -0400
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-05-22 14:00:48 +0200
commit920053dae6957ded976b18ff8e111a242a077617 (patch)
tree19dea469be2bb87b7eb12872b02933574ed36c03 /gst-libs
parent332f715208d23f233309aa1f84619a887bbe0ed6 (diff)
downloadgstreamer-plugins-bad-920053dae6957ded976b18ff8e111a242a077617.tar.gz
mpegvideoparser: Optimize scanning for start code
https://bugzilla.gnome.org/show_bug.cgi?id=672701
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/codecparsers/gstmpegvideoparser.c40
1 files changed, 13 insertions, 27 deletions
diff --git a/gst-libs/gst/codecparsers/gstmpegvideoparser.c b/gst-libs/gst/codecparsers/gstmpegvideoparser.c
index 5c8426868..e9cddd2f8 100644
--- a/gst-libs/gst/codecparsers/gstmpegvideoparser.c
+++ b/gst-libs/gst/codecparsers/gstmpegvideoparser.c
@@ -233,8 +233,7 @@ static inline guint
scan_for_start_codes (const GstByteReader * reader, guint offset, guint size)
{
const guint8 *data;
- guint32 state;
- guint i;
+ guint i = 0;
g_return_val_if_fail (size > 0, -1);
g_return_val_if_fail ((guint64) offset + size <= reader->size - reader->byte,
@@ -246,34 +245,21 @@ scan_for_start_codes (const GstByteReader * reader, guint offset, guint size)
data = reader->data + reader->byte + offset;
- /* set the state to something that does not match */
- state = 0xffffffff;
-
- /* now find data */
- for (i = 0; i < size; i++) {
- /* throw away one byte and move in the next byte */
- state = ((state << 8) | data[i]);
- if (G_UNLIKELY ((state & 0xffffff00) == 0x00000100)) {
- /* we have a match but we need to have skipped at
- * least 4 bytes to fill the state. */
- if (G_LIKELY (i >= 3))
- return offset + i - 3;
+ 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;
}
-
- /* TODO: reimplement making 010001 not detected as a sc
- * Accelerate search for start code
- * if (data[i] > 1) {
- * while (i < (size - 4) && data[i] > 1) {
- * if (data[i + 3] > 1)
- * i += 4;
- * else
- * i += 1;
- * }
- * state = 0x00000100;
- *}
- */
}
+ if (i < (size - 4))
+ return offset + i;
+
/* nothing found */
return -1;
}