[FFmpeg-soc] [soc]: r2599 - mlp/mlpdec.c

ramiro subversion at mplayerhq.hu
Tue Jul 1 00:52:18 CEST 2008


Author: ramiro
Date: Tue Jul  1 00:52:17 2008
New Revision: 2599

Log:
Use calculate_parity() instead of a macro.

Modified:
   mlp/mlpdec.c

Modified: mlp/mlpdec.c
==============================================================================
--- mlp/mlpdec.c	(original)
+++ mlp/mlpdec.c	Tue Jul  1 00:52:17 2008
@@ -965,12 +965,6 @@ static uint8_t calculate_parity(const ui
     return scratch;
 }
 
-#define PARITY_2BYTES do { \
-        parity_bits ^= *buf++; \
-        parity_bits ^= *buf++; \
-        header_size += 2; \
-    } while(0)
-
 /**
  * Read an access unit from the stream.
  * Returns -1 on error, 0 if not enough data is present in the input stream
@@ -984,10 +978,11 @@ static int read_access_unit(AVCodecConte
     GetBitContext gb;
     unsigned int length, substr;
     unsigned int substream_start;
-    unsigned int header_size = 0;
+    unsigned int header_size = 4;
+    unsigned int substr_header_size = 0;
     uint8_t substream_parity_present[MAX_SUBSTREAMS];
     uint16_t substream_data_len[MAX_SUBSTREAMS];
-    uint8_t parity_bits = 0;
+    uint8_t parity_bits;
 
     if (buf_size < 4)
         return 0;
@@ -997,17 +992,13 @@ static int read_access_unit(AVCodecConte
     if (length > buf_size)
         return -1;
 
-    PARITY_2BYTES;
-    PARITY_2BYTES;
-
-    init_get_bits(&gb, buf, (length - 4) * 8);
+    init_get_bits(&gb, (buf + 4), (length - 4) * 8);
 
     if (show_bits_long(&gb, 31) == (0xf8726fba >> 1)) {
         dprintf(m->avctx, "Found major sync\n");
         if (read_major_sync(m, &gb) < 0)
             goto error;
         header_size += 28;
-        buf += 28;
     }
 
     if (!m->params_valid) {
@@ -1029,18 +1020,18 @@ static int read_access_unit(AVCodecConte
 
         end = get_bits(&gb, 12) * 2;
 
-        PARITY_2BYTES;
+        substr_header_size += 2;
 
         if (extraword_present) {
             skip_bits(&gb, 16);
-            PARITY_2BYTES;
+            substr_header_size += 2;
         }
 
-        if (end + header_size > length) {
+        if (end + header_size + substr_header_size > length) {
             av_log(m->avctx, AV_LOG_ERROR,
                    "Substream %d data indicated length goes off end of packet.\n",
                    substr);
-            end = length - header_size;
+            end = length - header_size - substr_header_size;
         }
 
         if (end < substream_start) {
@@ -1059,11 +1050,16 @@ static int read_access_unit(AVCodecConte
         substream_start = end;
     }
 
+    parity_bits  = calculate_parity(buf, 4);
+    parity_bits ^= calculate_parity(buf + header_size, substr_header_size);
+
     if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
         av_log(avctx, AV_LOG_ERROR, "Parity check failed.\n");
         goto error;
     }
 
+    buf += header_size + substr_header_size;
+
     for (substr = 0; substr <= m->max_decoded_substream; substr++) {
         init_get_bits(&gb, buf, substream_data_len[substr] * 8);
 



More information about the FFmpeg-soc mailing list