diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2023-08-25 00:24:21 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2023-08-26 00:20:09 +0200 |
commit | 696e161919f18f13be0f82f41715b445d31022d7 (patch) | |
tree | 5ee7ba3eea4e965bac2e0155521f46ef289eff8f | |
parent | 9f66286f0bdd42fe388a7366909c11954fd330a6 (diff) | |
download | ffmpeg-696e161919f18f13be0f82f41715b445d31022d7.tar.gz |
avcodec/apedec: Fix CRC for 24bps and bigendian
Fixes CRC for vlc.ape and APE_48K_24bit_2CH_02_01.ape
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavcodec/apedec.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 613c76df0b..7bad8500e1 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -1625,13 +1625,24 @@ static int ape_decode_frame(AVCodecContext *avctx, AVFrame *frame, s->samples -= blockstodecode; if (avctx->err_recognition & AV_EF_CRCCHECK && - s->fileversion >= 3900 && s->bps < 24) { + s->fileversion >= 3900) { uint32_t crc = s->CRC_state; const AVCRC *crc_tab = av_crc_get_table(AV_CRC_32_IEEE_LE); + int stride = s->bps == 24 ? 4 : (s->bps>>3); + int offset = s->bps == 24; + int bytes = s->bps >> 3; + for (i = 0; i < blockstodecode; i++) { for (ch = 0; ch < s->channels; ch++) { - uint8_t *smp = frame->data[ch] + (i*(s->bps >> 3)); - crc = av_crc(crc_tab, crc, smp, s->bps >> 3); +#if HAVE_BIGENDIAN + uint8_t *smp_native = frame->data[ch] + i*stride; + uint8_t smp[4]; + for(int j = 0; j<stride; j++) + smp[j] = smp_native[stride-j-1]; +#else + uint8_t *smp = frame->data[ch] + i*stride; +#endif + crc = av_crc(crc_tab, crc, smp+offset, bytes); } } |