]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/g726.c
Make avcodec_string() and av_get_bits_per_sample() report the sample size for CODEC_I...
[ffmpeg] / libavcodec / g726.c
index 2881c7b1bc111e0e3d8608a6da167356fee3a7eb..463d993137b428ab3b52530f1a704c11877e77fb 100644 (file)
@@ -63,7 +63,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 ;-) */
@@ -139,10 +138,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 }};
 
 
 /**
@@ -165,7 +164,7 @@ static inline uint8_t quant(G726Context* c, int d)
 
     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;
@@ -188,7 +187,7 @@ 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->tbls.bits - 1);
+    int I_sig= I >> (c->code_size - 1);
 
     dq = inverse_quant(c, I);
 
@@ -236,14 +235,15 @@ 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 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] + ((-c->y)>>5), 544, 5120);
@@ -290,7 +290,7 @@ static int16_t g726_encode(G726Context* c, int16_t sig)
 {
     uint8_t i;
 
-    i = quant(c, sig/4 - c->se) & ((1<<c->tbls.bits) - 1);
+    i = quant(c, sig/4 - c->se) & ((1<<c->code_size) - 1);
     g726_decode(c, i);
     return i;
 }
@@ -316,13 +316,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;
 }
 
@@ -381,6 +384,7 @@ AVCodec adpcm_g726_encoder = {
     g726_encode_frame,
     g726_close,
     NULL,
+    .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
     .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"),
 };
 #endif //CONFIG_ENCODERS