alac: convert extradata reading to bytestream2.
authorRonald S. Bultje <rsbultje@gmail.com>
Sun, 25 Mar 2012 02:10:40 +0000 (19:10 -0700)
committerRonald S. Bultje <rsbultje@gmail.com>
Sun, 25 Mar 2012 20:35:05 +0000 (13:35 -0700)
libavcodec/alac.c

index 278cc99..e2ec6a4 100644 (file)
@@ -571,29 +571,30 @@ buf_alloc_fail:
 
 static int alac_set_info(ALACContext *alac)
 {
-    const unsigned char *ptr = alac->avctx->extradata;
+    GetByteContext gb;
 
-    ptr += 4; /* size */
-    ptr += 4; /* alac */
-    ptr += 4; /* version */
+    bytestream2_init(&gb, alac->avctx->extradata,
+                     alac->avctx->extradata_size);
 
-    if(AV_RB32(ptr) >= UINT_MAX/4){
-        av_log(alac->avctx, AV_LOG_ERROR, "setinfo_max_samples_per_frame too large\n");
-        return -1;
-    }
+    bytestream2_skipu(&gb, 12); // size:4, alac:4, version:4
 
     /* buffer size / 2 ? */
-    alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr);
-    ptr++;                          /* compatible version */
-    alac->setinfo_sample_size           = *ptr++;
-    alac->setinfo_rice_historymult      = *ptr++;
-    alac->setinfo_rice_initialhistory   = *ptr++;
-    alac->setinfo_rice_kmodifier        = *ptr++;
-    alac->numchannels                   = *ptr++;
-    bytestream_get_be16(&ptr);      /* maxRun */
-    bytestream_get_be32(&ptr);      /* max coded frame size */
-    bytestream_get_be32(&ptr);      /* average bitrate */
-    bytestream_get_be32(&ptr);      /* samplerate */
+    alac->setinfo_max_samples_per_frame = bytestream2_get_be32u(&gb);
+    if (alac->setinfo_max_samples_per_frame >= UINT_MAX/4){
+        av_log(alac->avctx, AV_LOG_ERROR,
+               "setinfo_max_samples_per_frame too large\n");
+        return AVERROR_INVALIDDATA;
+    }
+    bytestream2_skipu(&gb, 1);  // compatible version
+    alac->setinfo_sample_size           = bytestream2_get_byteu(&gb);
+    alac->setinfo_rice_historymult      = bytestream2_get_byteu(&gb);
+    alac->setinfo_rice_initialhistory   = bytestream2_get_byteu(&gb);
+    alac->setinfo_rice_kmodifier        = bytestream2_get_byteu(&gb);
+    alac->numchannels                   = bytestream2_get_byteu(&gb);
+    bytestream2_get_be16u(&gb); // maxRun
+    bytestream2_get_be32u(&gb); // max coded frame size
+    bytestream2_get_be32u(&gb); // average bitrate
+    bytestream2_get_be32u(&gb); // samplerate
 
     return 0;
 }