summaryrefslogtreecommitdiff
path: root/libavcodec/adpcm.c
diff options
context:
space:
mode:
authorZane van Iperen <zane@zanevaniperen.com>2020-10-16 13:14:25 +1000
committerZane van Iperen <zane@zanevaniperen.com>2020-10-21 11:23:26 +1000
commite9dd73d30d09043446ac6dd7b8ad31e557873852 (patch)
tree9286c9467bc6023a7426290b8b2e2f28f0fc99ff /libavcodec/adpcm.c
parent53ac499f0132b924315ce26c2683d6eb1717ce29 (diff)
avcodec/adpcm_swf: support decoding multiple fixed-sized blocks at once
For incoming packets from WAV. Signed-off-by: Zane van Iperen <zane@zanevaniperen.com>
Diffstat (limited to 'libavcodec/adpcm.c')
-rw-r--r--libavcodec/adpcm.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index d018c1f91b..701b125c47 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -880,7 +880,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
}
case AV_CODEC_ID_ADPCM_SWF:
{
- int buf_bits = buf_size * 8 - 2;
+ int buf_bits = (avctx->block_align ? avctx->block_align : buf_size) * 8 - 2;
int nbits = (bytestream2_get_byte(gb) >> 6) + 2;
int block_hdr_size = 22 * ch;
int block_size = block_hdr_size + nbits * ch * 4095;
@@ -889,6 +889,9 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
nb_samples = nblocks * 4096;
if (bits_left >= block_hdr_size)
nb_samples += 1 + (bits_left - block_hdr_size) / (nbits * ch);
+
+ if (avctx->block_align)
+ nb_samples *= buf_size / avctx->block_align;
break;
}
case AV_CODEC_ID_ADPCM_THP:
@@ -1767,9 +1770,17 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
}
break;
case AV_CODEC_ID_ADPCM_SWF:
- adpcm_swf_decode(avctx, buf, buf_size, samples);
+ {
+ const int nb_blocks = avctx->block_align ? avpkt->size / avctx->block_align : 1;
+ const int block_size = avctx->block_align ? avctx->block_align : avpkt->size;
+
+ for (int block = 0; block < nb_blocks; block++) {
+ adpcm_swf_decode(avctx, buf + block * block_size, block_size, samples);
+ samples += nb_samples / nb_blocks;
+ }
bytestream2_seek(&gb, 0, SEEK_END);
break;
+ }
case AV_CODEC_ID_ADPCM_YAMAHA:
for (n = nb_samples >> (1 - st); n > 0; n--) {
int v = bytestream2_get_byteu(&gb);