X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fgsmdec.c;h=b763ce8a584545313ff90320df30c91562b2e768;hb=e1a57cbb1c2752feb9315f748836dc44e58d2dc6;hp=a5e0d7d73a93aa0f690cd1cbc2b7886ce295547f;hpb=36ef5369ee9b336febc2c270f8718cec4476cb85;p=ffmpeg diff --git a/libavcodec/gsmdec.c b/libavcodec/gsmdec.c index a5e0d7d73a9..b763ce8a584 100644 --- a/libavcodec/gsmdec.c +++ b/libavcodec/gsmdec.c @@ -24,20 +24,21 @@ * GSM decoder */ +#include "libavutil/channel_layout.h" #include "avcodec.h" #include "get_bits.h" +#include "internal.h" #include "msgsmdec.h" #include "gsmdec_template.c" static av_cold int gsm_init(AVCodecContext *avctx) { - GSMContext *s = avctx->priv_data; - - avctx->channels = 1; + avctx->channels = 1; + avctx->channel_layout = AV_CH_LAYOUT_MONO; if (!avctx->sample_rate) avctx->sample_rate = 8000; - avctx->sample_fmt = AV_SAMPLE_FMT_S16; + avctx->sample_fmt = AV_SAMPLE_FMT_S16; switch (avctx->codec_id) { case AV_CODEC_ID_GSM: @@ -46,19 +47,25 @@ 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; + } } - avcodec_get_frame_defaults(&s->frame); - avctx->coded_frame = &s->frame; - return 0; } static int gsm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { - GSMContext *s = avctx->priv_data; + AVFrame *frame = data; int res; GetBitContext gb; const uint8_t *buf = avpkt->data; @@ -71,30 +78,30 @@ static int gsm_decode_frame(AVCodecContext *avctx, void *data, } /* get output buffer */ - s->frame.nb_samples = avctx->frame_size; - if ((res = avctx->get_buffer(avctx, &s->frame)) < 0) { + frame->nb_samples = avctx->frame_size; + if ((res = ff_get_buffer(avctx, frame, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return res; } - samples = (int16_t *)s->frame.data[0]; + samples = (int16_t *)frame->data[0]; switch (avctx->codec_id) { case AV_CODEC_ID_GSM: 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; } - *got_frame_ptr = 1; - *(AVFrame *)data = s->frame; + *got_frame_ptr = 1; return avctx->block_align; } @@ -107,6 +114,7 @@ static void gsm_flush(AVCodecContext *avctx) AVCodec ff_gsm_decoder = { .name = "gsm", + .long_name = NULL_IF_CONFIG_SMALL("GSM"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_GSM, .priv_data_size = sizeof(GSMContext), @@ -114,11 +122,11 @@ AVCodec ff_gsm_decoder = { .decode = gsm_decode_frame, .flush = gsm_flush, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("GSM"), }; AVCodec ff_gsm_ms_decoder = { .name = "gsm_ms", + .long_name = NULL_IF_CONFIG_SMALL("GSM Microsoft variant"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_GSM_MS, .priv_data_size = sizeof(GSMContext), @@ -126,5 +134,4 @@ AVCodec ff_gsm_ms_decoder = { .decode = gsm_decode_frame, .flush = gsm_flush, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("GSM Microsoft variant"), };