diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2013-09-07 21:06:22 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2013-11-26 08:31:10 +0100 |
commit | a16577d9857206089fd8bce6a342b31dbd7fb9b0 (patch) | |
tree | 45a4d07e2dddcd076bd0bf04ed2b4c65ed8e5d44 /libavcodec/gsmdec.c | |
parent | 56d061ce9da954560892e3551513d5ecc0439846 (diff) | |
download | ffmpeg-a16577d9857206089fd8bce6a342b31dbd7fb9b0.tar.gz |
MSN Audio support
This is essentially a MS GSM decoder extension that supports more
sampling rates and lower bitrates.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavcodec/gsmdec.c')
-rw-r--r-- | libavcodec/gsmdec.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/libavcodec/gsmdec.c b/libavcodec/gsmdec.c index 642f3b711f..b763ce8a58 100644 --- a/libavcodec/gsmdec.c +++ b/libavcodec/gsmdec.c @@ -36,7 +36,8 @@ static av_cold int gsm_init(AVCodecContext *avctx) { avctx->channels = 1; avctx->channel_layout = AV_CH_LAYOUT_MONO; - avctx->sample_rate = 8000; + if (!avctx->sample_rate) + avctx->sample_rate = 8000; avctx->sample_fmt = AV_SAMPLE_FMT_S16; switch (avctx->codec_id) { @@ -46,7 +47,16 @@ static av_cold int gsm_init(AVCodecContext *avctx) break; case AV_CODEC_ID_GSM_MS: avctx->frame_size = 2 * GSM_FRAME_SIZE; - avctx->block_align = GSM_MS_BLOCK_SIZE; + if (!avctx->block_align) + avctx->block_align = GSM_MS_BLOCK_SIZE; + else + if (avctx->block_align < MSN_MIN_BLOCK_SIZE || + avctx->block_align > GSM_MS_BLOCK_SIZE || + (avctx->block_align - MSN_MIN_BLOCK_SIZE) % 3) { + av_log(avctx, AV_LOG_ERROR, "Invalid block alignment %d\n", + avctx->block_align); + return AVERROR_INVALIDDATA; + } } return 0; @@ -80,12 +90,13 @@ static int gsm_decode_frame(AVCodecContext *avctx, void *data, init_get_bits(&gb, buf, buf_size * 8); if (get_bits(&gb, 4) != 0xd) av_log(avctx, AV_LOG_WARNING, "Missing GSM magic!\n"); - res = gsm_decode_block(avctx, samples, &gb); + res = gsm_decode_block(avctx, samples, &gb, GSM_13000); if (res < 0) return res; break; case AV_CODEC_ID_GSM_MS: - res = ff_msgsm_decode_block(avctx, samples, buf); + res = ff_msgsm_decode_block(avctx, samples, buf, + (GSM_MS_BLOCK_SIZE - avctx->block_align) / 3); if (res < 0) return res; } |