h264: fix scan for bit offset to macroblock.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Fri, 2 Mar 2012 14:32:02 +0000 (15:32 +0100)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Wed, 14 Mar 2012 15:11:42 +0000 (16:11 +0100)
Handle two indices in parallel, one relative to the bitstream with
EPB, and the other without EPB.

Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
src/i965_decoder_utils.c

index cd99539..e962f84 100644 (file)
@@ -67,12 +67,13 @@ avc_get_first_mb_bit_offset_with_epb(
 {
     unsigned int in_slice_data_bit_offset = slice_param->slice_data_bit_offset;
     unsigned int out_slice_data_bit_offset;
-    unsigned int i, n, buf_size, data_size;
+    unsigned int i, j, buf_size, data_size, header_size;
     uint8_t *buf;
     int ret;
 
-    buf_size  = slice_param->slice_data_bit_offset / 8;
-    data_size = slice_param->slice_data_size - slice_param->slice_data_offset;
+    header_size = slice_param->slice_data_bit_offset / 8;
+    data_size   = slice_param->slice_data_size - slice_param->slice_data_offset;
+    buf_size    = (header_size * 4 + 2) / 3; /* max possible header size */
     if (buf_size > data_size)
         buf_size = data_size;
 
@@ -83,11 +84,11 @@ avc_get_first_mb_bit_offset_with_epb(
     );
     assert(ret == 0);
 
-    for (i = 2, n = 0; i < buf_size; i++) {
-        if (!buf[i - 2] && !buf[i - 1] && buf[i] == 3)
-            i += 2, n++;
+    for (i = 2, j = 2; i < buf_size && j < header_size; i++, j++) {
+        if (buf[i] == 0x03 && buf[i - 1] == 0x00 && buf[i - 2] == 0x00)
+            i += 2, j++;
     }
-    out_slice_data_bit_offset = in_slice_data_bit_offset + n * 8;
+    out_slice_data_bit_offset = in_slice_data_bit_offset % 8 + i * 8;
 
     if (mode_flag == ENTROPY_CABAC)
         out_slice_data_bit_offset = ALIGN(out_slice_data_bit_offset, 0x8);