X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fg726.c;h=a4b2099832922fcf94f2d4dbc96f01dd6194aea0;hb=18c31f6ff8eef83cd19ea9e431335a854156dd18;hp=aeb2360d8c6a0c4b218e8514282e9c9b8a5a4ce0;hpb=673a64b89b6fd715bb74c61d9d5e773a3dfef702;p=ffmpeg diff --git a/libavcodec/g726.c b/libavcodec/g726.c index aeb2360d8c6..a4b20998329 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. @@ -63,7 +64,6 @@ static inline int sgn(int value) } typedef struct G726Tables { - int bits; /**< bits per sample */ const int* quant; /**< quantization table */ const int16_t* iquant; /**< inverse quantization table */ const int16_t* W; /**< special table #1 ;-) */ @@ -71,7 +71,7 @@ typedef struct G726Tables { } G726Tables; typedef struct G726Context { - const G726Tables* tbls; /**< static tables needed for computation */ + G726Tables tbls; /**< static tables needed for computation */ Float11 sr[2]; /**< prev. reconstructed samples */ Float11 dq[6]; /**< prev. difference */ @@ -139,10 +139,10 @@ static const uint8_t F_tbl40[] = 6, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; static const G726Tables G726Tables_pool[] = - {{ 2, quant_tbl16, iquant_tbl16, W_tbl16, F_tbl16 }, - { 3, quant_tbl24, iquant_tbl24, W_tbl24, F_tbl24 }, - { 4, quant_tbl32, iquant_tbl32, W_tbl32, F_tbl32 }, - { 5, quant_tbl40, iquant_tbl40, W_tbl40, F_tbl40 }}; + {{ quant_tbl16, iquant_tbl16, W_tbl16, F_tbl16 }, + { quant_tbl24, iquant_tbl24, W_tbl24, F_tbl24 }, + { quant_tbl32, iquant_tbl32, W_tbl32, F_tbl32 }, + { quant_tbl40, iquant_tbl40, W_tbl40, F_tbl40 }}; /** @@ -160,12 +160,12 @@ static inline uint8_t quant(G726Context* c, int d) exp = av_log2_16bit(d); dln = ((exp<<7) + (((d<<7)>>exp)&0x7f)) - (c->y>>2); - while (c->tbls->quant[i] < INT_MAX && c->tbls->quant[i] < dln) + while (c->tbls.quant[i] < INT_MAX && c->tbls.quant[i] < dln) ++i; if (sign) i = ~i; - if (c->tbls->bits != 2 && i == 0) /* I'm not sure this is a good idea */ + if (c->code_size != 2 && i == 0) /* I'm not sure this is a good idea */ i = 0xff; return i; @@ -178,27 +178,29 @@ static inline int16_t inverse_quant(G726Context* c, int i) { int dql, dex, dqt; - dql = c->tbls->iquant[i] + (c->y >> 2); + dql = c->tbls.iquant[i] + (c->y >> 2); dex = (dql>>7) & 0xf; /* 4bit exponent */ dqt = (1<<7) + (dql & 0x7f); /* log2 -> linear */ return (dql < 0) ? 0 : ((dqt<> 7); } -static int16_t g726_decode(G726Context* c, int16_t I) +static int16_t g726_decode(G726Context* c, int I) { int dq, re_signal, pk0, fa1, i, tr, ylint, ylfrac, thr2, al, dq0; Float11 f; + int I_sig= I >> (c->code_size - 1); dq = inverse_quant(c, I); - if (I >> (c->tbls->bits - 1)) /* get the sign */ - dq = -dq; - re_signal = c->se + dq; /* Transition detect */ ylint = (c->yl >> 15); ylfrac = (c->yl >> 10) & 0x1f; thr2 = (ylint > 9) ? 0x1f << 10 : (0x20 + ylfrac) << ylint; - tr= (c->td == 1 && abs(dq) > ((3*thr2)>>2)); + tr= (c->td == 1 && dq > ((3*thr2)>>2)); + + if (I_sig) /* get the sign */ + dq = -dq; + re_signal = c->se + dq; /* Update second order predictor coefficient A2 and A1 */ pk0 = (c->sez + dq) ? sgn(c->sez + dq) : 0; @@ -229,22 +231,23 @@ static int16_t g726_decode(G726Context* c, int16_t I) for (i=5; i>0; i--) c->dq[i] = c->dq[i-1]; i2f(dq, &c->dq[0]); - c->dq[0].sign = I >> (c->tbls->bits - 1); /* Isn't it crazy ?!?! */ + c->dq[0].sign = I_sig; /* Isn't it crazy ?!?! */ 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 if (c->y > 1535 && !c->td && abs((c->dms << 2) - c->dml) < (c->dml >> 3)) + else { c->ap += (-c->ap) >> 4; - else - c->ap += (0x200 - c->ap) >> 4; + if (c->y <= 1535 || c->td || abs((c->dms << 2) - c->dml) >= (c->dml >> 3)) + c->ap += 0x20; + } /* Update Yu and Yl */ - c->yu = av_clip(c->y + (((c->tbls->W[I] << 5) - c->y) >> 5), 544, 5120); + c->yu = av_clip(c->y + c->tbls.W[I] + ((-c->y)>>5), 544, 5120); c->yl += c->yu + ((-c->yl)>>6); /* Next iteration for Y */ @@ -267,7 +270,7 @@ static av_cold int g726_reset(G726Context* c, int index) { int i; - c->tbls = &G726Tables_pool[index]; + c->tbls = G726Tables_pool[index]; for (i=0; i<2; i++) { c->sr[i].mant = 1<<5; c->pk[i] = 1; @@ -283,12 +286,12 @@ 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; - i = quant(c, sig/4 - c->se) & ((1<tbls->bits) - 1); + i = quant(c, sig/4 - c->se) & ((1<code_size) - 1); g726_decode(c, i); return i; } @@ -299,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"); @@ -314,13 +324,16 @@ static av_cold int g726_init(AVCodecContext * avctx) return -1; } g726_reset(c, index); - c->code_size = c->tbls->bits; + c->code_size = index+2; avctx->coded_frame = avcodec_alloc_frame(); if (!avctx->coded_frame) return AVERROR(ENOMEM); avctx->coded_frame->key_frame = 1; + if (avctx->codec->decode) + avctx->sample_fmt = SAMPLE_FMT_S16; + return 0; } @@ -330,7 +343,7 @@ 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) { @@ -351,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; @@ -369,7 +384,7 @@ 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, @@ -379,9 +394,10 @@ AVCodec adpcm_g726_encoder = { 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",