Unified · Split
| @@ -571,29 +571,30 @@ buf_alloc_fail: · 570 unmodified lines | ||
| 571 | 571 | |
| 572 | 572 | static int alac_set_info(ALACContext *alac) |
| 573 | 573 | { |
| 574 | − const unsigned char *ptr = alac->avctx->extradata; | |
| 574 | + GetByteContext gb; | |
| 575 | 575 | |
| 576 | − ptr += 4; /* size */ | |
| 577 | − ptr += 4; /* alac */ | |
| 578 | − ptr += 4; /* version */ | |
| 576 | + bytestream2_init(&gb, alac->avctx->extradata, | |
| 577 | + alac->avctx->extradata_size); | |
| 579 | 578 | |
| 580 | − if(AV_RB32(ptr) >= UINT_MAX/4){ | |
| 581 | − av_log(alac->avctx, AV_LOG_ERROR, "setinfo_max_samples_per_frame too large\n"); | |
| 582 | − return -1; | |
| 583 | − } | |
| 579 | + bytestream2_skipu(&gb, 12); // size:4, alac:4, version:4 | |
| 584 | 580 | |
| 585 | 581 | /* buffer size / 2 ? */ |
| 586 | − alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr); | |
| 587 | − ptr++; /* compatible version */ | |
| 588 | − alac->setinfo_sample_size = *ptr++; | |
| 589 | − alac->setinfo_rice_historymult = *ptr++; | |
| 590 | − alac->setinfo_rice_initialhistory = *ptr++; | |
| 591 | − alac->setinfo_rice_kmodifier = *ptr++; | |
| 592 | − alac->numchannels = *ptr++; | |
| 593 | − bytestream_get_be16(&ptr); /* maxRun */ | |
| 594 | − bytestream_get_be32(&ptr); /* max coded frame size */ | |
| 595 | − bytestream_get_be32(&ptr); /* average bitrate */ | |
| 596 | − bytestream_get_be32(&ptr); /* samplerate */ | |
| 582 | + alac->setinfo_max_samples_per_frame = bytestream2_get_be32u(&gb); | |
| 583 | + if (alac->setinfo_max_samples_per_frame >= UINT_MAX/4){ | |
| 584 | + av_log(alac->avctx, AV_LOG_ERROR, | |
| 585 | + "setinfo_max_samples_per_frame too large\n"); | |
| 586 | + return AVERROR_INVALIDDATA; | |
| 587 | + } | |
| 588 | + bytestream2_skipu(&gb, 1); // compatible version | |
| 589 | + alac->setinfo_sample_size = bytestream2_get_byteu(&gb); | |
| 590 | + alac->setinfo_rice_historymult = bytestream2_get_byteu(&gb); | |
| 591 | + alac->setinfo_rice_initialhistory = bytestream2_get_byteu(&gb); | |
| 592 | + alac->setinfo_rice_kmodifier = bytestream2_get_byteu(&gb); | |
| 593 | + alac->numchannels = bytestream2_get_byteu(&gb); | |
| 594 | + bytestream2_get_be16u(&gb); // maxRun | |
| 595 | + bytestream2_get_be32u(&gb); // max coded frame size | |
| 596 | + bytestream2_get_be32u(&gb); // average bitrate | |
| 597 | + bytestream2_get_be32u(&gb); // samplerate | |
| 597 | 598 | |
| 598 | 599 | return 0; |
| 599 | 600 | } |