mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
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>
This commit is contained in:
parent
53ac499f01
commit
e9dd73d30d
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user