diff options
author | Paul B Mahol <onemda@gmail.com> | 2017-02-23 22:58:53 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2017-02-23 23:03:27 +0100 |
commit | 20789372da911ab46ce59667380126a87389190a (patch) | |
tree | 6888f96bdf1d4f51e5d471d8e4a77a901976763c /libavcodec | |
parent | f5fa12d6eefe19e4f49b59ae33a41e568e0d5371 (diff) | |
download | ffmpeg-20789372da911ab46ce59667380126a87389190a.tar.gz |
avcodec/shorten: support decoding AIFF-C variant
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/shorten.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/libavcodec/shorten.c b/libavcodec/shorten.c index e4cef61811..ff90d12c5c 100644 --- a/libavcodec/shorten.c +++ b/libavcodec/shorten.c @@ -27,6 +27,7 @@ #include <limits.h> #include "avcodec.h" +#include "bswapdsp.h" #include "bytestream.h" #include "get_bits.h" #include "golomb.h" @@ -109,6 +110,8 @@ typedef struct ShortenContext { int32_t lpcqoffset; int got_header; int got_quit_command; + int swap; + BswapDSPContext bdsp; } ShortenContext; static av_cold int shorten_decode_init(AVCodecContext *avctx) @@ -116,6 +119,8 @@ static av_cold int shorten_decode_init(AVCodecContext *avctx) ShortenContext *s = avctx->priv_data; s->avctx = avctx; + ff_bswapdsp_init(&s->bdsp); + return 0; } @@ -202,6 +207,7 @@ static int init_offset(ShortenContext *s) static int decode_aiff_header(AVCodecContext *avctx, const uint8_t *header, int header_size) { + ShortenContext *s = avctx->priv_data; int len, bps, exp; GetByteContext gb; uint64_t val; @@ -217,7 +223,8 @@ static int decode_aiff_header(AVCodecContext *avctx, const uint8_t *header, bytestream2_skip(&gb, 4); /* chunk size */ tag = bytestream2_get_le32(&gb); - if (tag != MKTAG('A', 'I', 'F', 'F')) { + if (tag != MKTAG('A', 'I', 'F', 'F') && + tag != MKTAG('A', 'I', 'F', 'C')) { av_log(avctx, AV_LOG_ERROR, "missing AIFF tag\n"); return AVERROR_INVALIDDATA; } @@ -241,6 +248,8 @@ static int decode_aiff_header(AVCodecContext *avctx, const uint8_t *header, bps = bytestream2_get_be16(&gb); avctx->bits_per_coded_sample = bps; + s->swap = tag == MKTAG('A', 'I', 'F', 'C'); + if (bps != 16 && bps != 8) { av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample: %d\n", bps); return AVERROR(ENOSYS); @@ -721,6 +730,11 @@ static int shorten_decode_frame(AVCodecContext *avctx, void *data, break; } } + if (s->swap && s->internal_ftype != TYPE_U8) + s->bdsp.bswap16_buf(((uint16_t **)frame->extended_data)[chan], + ((uint16_t **)frame->extended_data)[chan], + s->blocksize); + } *got_frame_ptr = 1; |