diff --git a/libs/gst/base/gstbytereader.c b/libs/gst/base/gstbytereader.c
index a037eb6..ba72431 100644
--- a/libs/gst/base/gstbytereader.c
+++ b/libs/gst/base/gstbytereader.c
@@ -775,22 +775,61 @@ gst_byte_reader_dup_data (GstByteReader * reader, guint size, guint8 ** val)
 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++;
+#if (__ARM_ARCH__ >= 7) || defined(__ARM_NEON__)
+  guint8 *pdata = (guint8 *) data;
+  guint8 *pend = (guint8 *) (data + size - 32);
+  guint64 zero_check_map_0;
+  guint64 zero_check_map_1;
+
+  while (pdata <= pend) {
+    asm volatile ("vld2.8  {d16-d19}, [%[PDATA]]     \n"
+        "vceq.i8 q9, q9, #0                \n"
+        "vmov  %Q[RESULT0], %H[RESULT0], d18 \n"
+        "vmov  %Q[RESULT1], %H[RESULT1], d19 \n":[RESULT0]
+        "=r" (zero_check_map_0),[RESULT1] "=r" (zero_check_map_1)
+        :[PDATA] "r" (pdata)
+        :"d16", "d17", "d18", "d19", "q9");
+
+    if (zero_check_map_0 == 0) {
+      if (zero_check_map_1 == 0) {
+        pdata += 32;
+        continue;
+      }
+
+      pdata += 16;
+    }
+
+    if (pdata[2] > 1) {
+      pdata += 3;
+    } else if (pdata[1]) {
+      pdata += 2;
+    } else if (*pdata || pdata[2] != 1) {
+      pdata++;
+    } else {
+      return (pdata - data + offset);
+    }
+  }
+
+  pend = (guint8 *) (data + size - 4);
+#else
+  guint8 *pdata = (guint8 *) data;
+  guint8 *pend = (guint8 *) (data + size - 4);
+#endif
+
+  while (pdata <= pend) {
+    if (pdata[2] > 1) {
+      pdata += 3;
+    } else if (pdata[1]) {
+      pdata += 2;
+    } else if (*pdata || pdata[2] != 1) {
+      pdata++;
     } else {
       break;
     }
   }
 
-  if (i <= (size - 4))
-    return i + offset;
+  if (pdata <= pend)
+    return (pdata - data + offset);
 
   /* nothing found */
   return -1;
