X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fg726.c;h=6192b2b18c876d34831c3f03e5b3ac14706a3131;hb=dd5f3238c13e2a6a2caf4d550113219d73122fde;hp=9d4c87d66b3e37827620f15c174290b4f71cc586;hpb=50c52d22502d649db0fdecde6de64532e20c5dda;p=ffmpeg diff --git a/libavcodec/g726.c b/libavcodec/g726.c index 9d4c87d66b3..6192b2b18c8 100644 --- a/libavcodec/g726.c +++ b/libavcodec/g726.c @@ -1,6 +1,6 @@ /* * G.726 ADPCM audio codec - * Copyright (c) 2004 Roman Shaposhnik. + * Copyright (c) 2004 Roman Shaposhnik * * This is a very straightforward rendition of the G.726 * Section 4 "Computational Details". @@ -23,7 +23,8 @@ */ #include #include "avcodec.h" -#include "bitstream.h" +#include "get_bits.h" +#include "put_bits.h" /** * G.726 11bit float. @@ -235,8 +236,8 @@ static int16_t g726_decode(G726Context* c, int I) c->td = c->a[1] < -11776; /* Update Ap */ - c->dms += ((c->tbls.F[I]<<9) - c->dms) >> 5; - c->dml += ((c->tbls.F[I]<<11) - c->dml) >> 7; + c->dms += (c->tbls.F[I]<<4) + ((- c->dms) >> 5); + c->dml += (c->tbls.F[I]<<4) + ((- c->dml) >> 7); if (tr) c->ap = 256; else { @@ -285,7 +286,7 @@ static av_cold int g726_reset(G726Context* c, int index) return 0; } -#ifdef CONFIG_ENCODERS +#if CONFIG_ADPCM_G726_ENCODER static int16_t g726_encode(G726Context* c, int16_t sig) { uint8_t i; @@ -301,7 +302,14 @@ static int16_t g726_encode(G726Context* c, int16_t sig) static av_cold int g726_init(AVCodecContext * avctx) { G726Context* c = avctx->priv_data; - unsigned int index= (avctx->bit_rate + avctx->sample_rate/2) / avctx->sample_rate - 2; + unsigned int index; + + if (avctx->sample_rate <= 0) { + av_log(avctx, AV_LOG_ERROR, "Samplerate is invalid\n"); + return -1; + } + + index = (avctx->bit_rate + avctx->sample_rate/2) / avctx->sample_rate - 2; if (avctx->bit_rate % avctx->sample_rate && avctx->codec->encode) { av_log(avctx, AV_LOG_ERROR, "Bitrate - Samplerate combination is invalid\n"); @@ -323,6 +331,9 @@ static av_cold int g726_init(AVCodecContext * avctx) return AVERROR(ENOMEM); avctx->coded_frame->key_frame = 1; + if (avctx->codec->decode) + avctx->sample_fmt = SAMPLE_FMT_S16; + return 0; } @@ -332,12 +343,12 @@ static av_cold int g726_close(AVCodecContext *avctx) return 0; } -#ifdef CONFIG_ENCODERS +#if CONFIG_ADPCM_G726_ENCODER static int g726_encode_frame(AVCodecContext *avctx, uint8_t *dst, int buf_size, void *data) { G726Context *c = avctx->priv_data; - short *samples = data; + const short *samples = data; PutBitContext pb; init_put_bits(&pb, dst, 1024*1024); @@ -353,8 +364,10 @@ static int g726_encode_frame(AVCodecContext *avctx, static int g726_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - const uint8_t *buf, int buf_size) + AVPacket *avpkt) { + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; G726Context *c = avctx->priv_data; short *samples = data; GetBitContext gb; @@ -371,23 +384,24 @@ static int g726_decode_frame(AVCodecContext *avctx, return buf_size; } -#ifdef CONFIG_ENCODERS +#if CONFIG_ADPCM_G726_ENCODER AVCodec adpcm_g726_encoder = { "g726", - CODEC_TYPE_AUDIO, + AVMEDIA_TYPE_AUDIO, CODEC_ID_ADPCM_G726, sizeof(G726Context), g726_init, g726_encode_frame, g726_close, NULL, + .sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"), }; -#endif //CONFIG_ENCODERS +#endif AVCodec adpcm_g726_decoder = { "g726", - CODEC_TYPE_AUDIO, + AVMEDIA_TYPE_AUDIO, CODEC_ID_ADPCM_G726, sizeof(G726Context), g726_init,