[FFmpeg-devel] [PATCH] avcodec/adpcm: consolidate tables into adpcm_data.c

Zane van Iperen zane at zanevaniperen.com
Tue Mar 10 15:10:18 EET 2020


Signed-off-by: Zane van Iperen <zane at zanevaniperen.com>
---
 libavcodec/adpcm.c      | 67 +++++++++++------------------------------
 libavcodec/adpcm_data.c | 29 ++++++++++++++++++
 libavcodec/adpcm_data.h |  4 +++
 3 files changed, 51 insertions(+), 49 deletions(-)

diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index c69cac3379..c27d7103f2 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -60,37 +60,6 @@
  * readstr http://www.geocities.co.jp/Playtown/2004/
  */
 
-/* These are for CD-ROM XA ADPCM */
-static const int8_t xa_adpcm_table[5][2] = {
-    {   0,   0 },
-    {  60,   0 },
-    { 115, -52 },
-    {  98, -55 },
-    { 122, -60 }
-};
-
-static const int16_t ea_adpcm_table[] = {
-    0,  240,  460,  392,
-    0,    0, -208, -220,
-    0,    1,    3,    4,
-    7,    8,   10,   11,
-    0,   -1,   -3,   -4
-};
-
-// padded to zero where table size is less then 16
-static const int8_t swf_index_tables[4][16] = {
-    /*2*/ { -1, 2 },
-    /*3*/ { -1, -1, 2, 4 },
-    /*4*/ { -1, -1, -1, -1, 2, 4, 6, 8 },
-    /*5*/ { -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16 }
-};
-
-static const int8_t zork_index_table[8] = {
-    -1, -1, -1, 1, 4, 7, 10, 12,
-};
-
-/* end of tables */
-
 typedef struct ADPCMDecodeContext {
     ADPCMChannelStatus status[14];
     int vqa_version;                /**< VQA version. Used for ADPCM_IMA_WS */
@@ -483,7 +452,7 @@ static inline int16_t adpcm_zork_expand_nibble(ADPCMChannelStatus *c, uint8_t ni
     sample += c->predictor;
     sample = av_clip_int16(sample);
 
-    index += zork_index_table[(nibble >> 4) & 7];
+    index += ff_adpcm_zork_index_table[(nibble >> 4) & 7];
     index = av_clip(index, 0, 88);
 
     c->predictor = sample;
@@ -510,12 +479,12 @@ static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
     for(i=0;i<4;i++) {
         shift  = 12 - (in[4+i*2] & 15);
         filter = in[4+i*2] >> 4;
-        if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
+        if (filter >= FF_ARRAY_ELEMS(ff_adpcm_xa_table)) {
             avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
             filter=0;
         }
-        f0 = xa_adpcm_table[filter][0];
-        f1 = xa_adpcm_table[filter][1];
+        f0 = ff_adpcm_xa_table[filter][0];
+        f1 = ff_adpcm_xa_table[filter][1];
 
         s_1 = left->sample1;
         s_2 = left->sample2;
@@ -539,13 +508,13 @@ static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
 
         shift  = 12 - (in[5+i*2] & 15);
         filter = in[5+i*2] >> 4;
-        if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
+        if (filter >= FF_ARRAY_ELEMS(ff_adpcm_xa_table)) {
             avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
             filter=0;
         }
 
-        f0 = xa_adpcm_table[filter][0];
-        f1 = xa_adpcm_table[filter][1];
+        f0 = ff_adpcm_xa_table[filter][0];
+        f1 = ff_adpcm_xa_table[filter][1];
 
         for(j=0;j<28;j++) {
             d = in[16+i+j*4];
@@ -585,7 +554,7 @@ static void adpcm_swf_decode(AVCodecContext *avctx, const uint8_t *buf, int buf_
 
     //read bits & initial values
     nb_bits = get_bits(&gb, 2)+2;
-    table = swf_index_tables[nb_bits-2];
+    table = ff_adpcm_swf_index_tables[nb_bits-2];
     k0 = 1 << (nb_bits-2);
     signmask = 1 << (nb_bits-1);
 
@@ -1409,10 +1378,10 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
 
         for (count1 = 0; count1 < nb_samples / 28; count1++) {
             int byte = bytestream2_get_byteu(&gb);
-            coeff1l = ea_adpcm_table[ byte >> 4       ];
-            coeff2l = ea_adpcm_table[(byte >> 4  ) + 4];
-            coeff1r = ea_adpcm_table[ byte & 0x0F];
-            coeff2r = ea_adpcm_table[(byte & 0x0F) + 4];
+            coeff1l = ff_adpcm_ea_table[ byte >> 4       ];
+            coeff2l = ff_adpcm_ea_table[(byte >> 4  ) + 4];
+            coeff1r = ff_adpcm_ea_table[ byte & 0x0F];
+            coeff2r = ff_adpcm_ea_table[(byte & 0x0F) + 4];
 
             byte = bytestream2_get_byteu(&gb);
             shift_left  = 20 - (byte >> 4);
@@ -1450,7 +1419,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
         for(channel = 0; channel < avctx->channels; channel++) {
             int byte = bytestream2_get_byteu(&gb);
             for (i=0; i<2; i++)
-                coeff[channel][i] = ea_adpcm_table[(byte >> 4) + 4*i];
+                coeff[channel][i] = ff_adpcm_ea_table[(byte >> 4) + 4*i];
             shift[channel] = 20 - (byte & 0x0F);
         }
         for (count1 = 0; count1 < nb_samples / 2; count1++) {
@@ -1515,8 +1484,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
                     for (count2=0; count2<28; count2++)
                         *samplesC++ = sign_extend(bytestream2_get_be16(&gb), 16);
                 } else {
-                    coeff1 = ea_adpcm_table[ byte >> 4     ];
-                    coeff2 = ea_adpcm_table[(byte >> 4) + 4];
+                    coeff1 = ff_adpcm_ea_table[ byte >> 4     ];
+                    coeff2 = ff_adpcm_ea_table[(byte >> 4) + 4];
                     shift = 20 - (byte & 0x0F);
 
                     for (count2=0; count2<28; count2++) {
@@ -1561,7 +1530,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
             for (n = 0; n < 4; n++, s += 32) {
                 int val = sign_extend(bytestream2_get_le16u(&gb), 16);
                 for (i=0; i<2; i++)
-                    coeff[i][n] = ea_adpcm_table[(val&0x0F)+4*i];
+                    coeff[i][n] = ff_adpcm_ea_table[(val&0x0F)+4*i];
                 s[0] = val & ~0x0F;
 
                 val = sign_extend(bytestream2_get_le16u(&gb), 16);
@@ -1882,7 +1851,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
                 filter = bytestream2_get_byteu(&gb);
                 shift  = filter & 0xf;
                 filter = filter >> 4;
-                if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table))
+                if (filter >= FF_ARRAY_ELEMS(ff_adpcm_xa_table))
                     return AVERROR_INVALIDDATA;
                 flag   = bytestream2_get_byteu(&gb);
 
@@ -1899,7 +1868,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
                         }
 
                         scale  = scale << 12;
-                        sample = (int)((scale >> shift) + (c->status[channel].sample1 * xa_adpcm_table[filter][0] + c->status[channel].sample2 * xa_adpcm_table[filter][1]) / 64);
+                        sample = (int)((scale >> shift) + (c->status[channel].sample1 * ff_adpcm_xa_table[filter][0] + c->status[channel].sample2 * ff_adpcm_xa_table[filter][1]) / 64);
                     }
                     *samples++ = av_clip_int16(sample);
                     c->status[channel].sample2 = c->status[channel].sample1;
diff --git a/libavcodec/adpcm_data.c b/libavcodec/adpcm_data.c
index 4cce0a5857..d8b488197e 100644
--- a/libavcodec/adpcm_data.c
+++ b/libavcodec/adpcm_data.c
@@ -177,3 +177,32 @@ const int16_t ff_adpcm_mtaf_stepsize[32][16] = {
     {   424,  1273,  2121,  2970,  3819,  4668,  5516,  6365,
        -424, -1273, -2121, -2970, -3819, -4668, -5516, -6365, },
 };
+
+/* These are for CD-ROM XA ADPCM */
+const int8_t ff_adpcm_xa_table[5][2] = {
+    {   0,   0 },
+    {  60,   0 },
+    { 115, -52 },
+    {  98, -55 },
+    { 122, -60 }
+};
+
+const int16_t ff_adpcm_ea_table[20] = {
+    0,  240,  460,  392,
+    0,    0, -208, -220,
+    0,    1,    3,    4,
+    7,    8,   10,   11,
+    0,   -1,   -3,   -4
+};
+
+// padded to zero where table size is less then 16
+const int8_t ff_adpcm_swf_index_tables[4][16] = {
+    /*2*/ { -1, 2 },
+    /*3*/ { -1, -1, 2, 4 },
+    /*4*/ { -1, -1, -1, -1, 2, 4, 6, 8 },
+    /*5*/ { -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16 }
+};
+
+const int8_t ff_adpcm_zork_index_table[8] = {
+    -1, -1, -1, 1, 4, 7, 10, 12,
+};
diff --git a/libavcodec/adpcm_data.h b/libavcodec/adpcm_data.h
index 5a687131d8..601271e48a 100644
--- a/libavcodec/adpcm_data.h
+++ b/libavcodec/adpcm_data.h
@@ -42,5 +42,9 @@ extern const int16_t ff_adpcm_yamaha_indexscale[];
 extern const int8_t  ff_adpcm_yamaha_difflookup[];
 extern const int16_t ff_adpcm_afc_coeffs[2][16];
 extern const int16_t ff_adpcm_mtaf_stepsize[32][16];
+extern const int8_t  ff_adpcm_xa_table[5][2];
+extern const int16_t ff_adpcm_ea_table[20];
+extern const int8_t  ff_adpcm_swf_index_tables[4][16];
+extern const int8_t  ff_adpcm_zork_index_table[8];
 
 #endif /* AVCODEC_ADPCM_DATA_H */
-- 
2.17.1




More information about the ffmpeg-devel mailing list