[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