diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2012-03-24 19:10:40 -0700 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2012-03-25 13:35:05 -0700 |
commit | c3bbd0b53b5d105078de5985f54f7623fd5545ce (patch) | |
tree | 02af846e00b84067bb0f4f00452b9a6333f0b5c2 /libavcodec/alac.c | |
parent | 62ce9defb81d0b6bd179131d1502858c8778f411 (diff) | |
download | ffmpeg-c3bbd0b53b5d105078de5985f54f7623fd5545ce.tar.gz |
alac: convert extradata reading to bytestream2.
Diffstat (limited to 'libavcodec/alac.c')
-rw-r--r-- | libavcodec/alac.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 278cc99969..e2ec6a48b4 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -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; } |