diff mbox series

[FFmpeg-devel,26/30] avcodec/mpc7, mpc7data: Avoid gaps in array

Message ID 20200915074000.102622-26-andreas.rheinhardt@gmail.com
State Accepted
Headers show
Series [FFmpeg-devel,01/30] avcodec/flashsvenc: Avoid allocation of buffer, fix memleak
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Andreas Rheinhardt Sept. 15, 2020, 7:39 a.m. UTC
The Musepack decoder uses static VLC tables to parse the bitstream.
There are 14 different quant tables VLCs and each of them has a varying
number of codes. The maximum number is 63, the average number is 25.3.
Up until now, the array containing the raw data was of type
uint16_t [7][2][64 * 2] (the 14 tables come in pairs of two, hence [7][2]
instead of [14]) and from this it follows that there were large gaps in
said array. This commit changes this by making it a continuous array
instead. Doing so saves about 2KB.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavcodec/mpc7.c     | 17 ++++++----
 libavcodec/mpc7data.h | 76 +++++++++++++------------------------------
 2 files changed, 32 insertions(+), 61 deletions(-)

Comments

Paul B Mahol Sept. 15, 2020, 4:49 p.m. UTC | #1
On Tue, Sep 15, 2020 at 09:39:56AM +0200, Andreas Rheinhardt wrote:
> The Musepack decoder uses static VLC tables to parse the bitstream.
> There are 14 different quant tables VLCs and each of them has a varying
> number of codes. The maximum number is 63, the average number is 25.3.
> Up until now, the array containing the raw data was of type
> uint16_t [7][2][64 * 2] (the 14 tables come in pairs of two, hence [7][2]
> instead of [14]) and from this it follows that there were large gaps in
> said array. This commit changes this by making it a continuous array
> instead. Doing so saves about 2KB.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
>  libavcodec/mpc7.c     | 17 ++++++----
>  libavcodec/mpc7data.h | 76 +++++++++++++------------------------------
>  2 files changed, 32 insertions(+), 61 deletions(-)

Should be fine if there is full coverage of code with samples covering those vlcs.
Andreas Rheinhardt Sept. 15, 2020, 8:34 p.m. UTC | #2
Paul B Mahol:
> On Tue, Sep 15, 2020 at 09:39:56AM +0200, Andreas Rheinhardt wrote:
>> The Musepack decoder uses static VLC tables to parse the bitstream.
>> There are 14 different quant tables VLCs and each of them has a varying
>> number of codes. The maximum number is 63, the average number is 25.3.
>> Up until now, the array containing the raw data was of type
>> uint16_t [7][2][64 * 2] (the 14 tables come in pairs of two, hence [7][2]
>> instead of [14]) and from this it follows that there were large gaps in
>> said array. This commit changes this by making it a continuous array
>> instead. Doing so saves about 2KB.
>>
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
>> ---
>>  libavcodec/mpc7.c     | 17 ++++++----
>>  libavcodec/mpc7data.h | 76 +++++++++++++------------------------------
>>  2 files changed, 32 insertions(+), 61 deletions(-)
> 
> Should be fine if there is full coverage of code with samples covering those vlcs.
> 
This code is covered by the musepack7 FATE-test. I just added a few
counters to it in order to check whether all VLC tables are used. They
indeed are:
Counter for quant[0][0]: 1478
Counter for quant[0][1]: 2021
Counter for quant[1][0]: 2628
Counter for quant[1][1]: 3500
Counter for quant[2][0]: 1061
Counter for quant[2][1]: 2355
Counter for quant[3][0]: 367
Counter for quant[3][1]: 1048
Counter for quant[4][0]: 598
Counter for quant[4][1]: 1000
Counter for quant[5][0]: 274
Counter for quant[5][1]: 771
Counter for quant[6][0]: 229
Counter for quant[6][1]: 232

Just to be sure I have also calculated the CRCs (AV_CRC_32_IEEE) of the
tables. They are unchanged:
CRC for quant table 0 0 3BDAC345
CRC for quant table 0 1 F97ACD5D
CRC for quant table 1 0 2EBC08F1
CRC for quant table 1 1 FA19B798
CRC for quant table 2 0 16C9A42B
CRC for quant table 2 1 B3DF7046
CRC for quant table 3 0 D4162F07
CRC for quant table 3 1 DA23BC68
CRC for quant table 4 0 16D7D50F
CRC for quant table 4 1 433F7CB
CRC for quant table 5 0 2511392D
CRC for quant table 5 1 60C43D91
CRC for quant table 6 0 31C9B671
CRC for quant table 6 1 563EFA5D

I have therefore pushed this and the other musepack patch; I have also
incorporated a fix for 1e40dc920a838e35f1483b20bfcd417437e68741 in the
latter (the topic fits).

- Andreas
diff mbox series

Patch

diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c
index 8518bc2f8a..4a4f8cf616 100644
--- a/libavcodec/mpc7.c
+++ b/libavcodec/mpc7.c
@@ -38,10 +38,9 @@ 
 
 static VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2];
 
-static const uint16_t quant_offsets[MPC7_QUANT_VLC_TABLES*2 + 1] =
+static const uint16_t quant_sizes[MPC7_QUANT_VLC_TABLES*2] =
 {
-       0, 512, 1024, 1536, 2052, 2564, 3076, 3588, 4100, 4612, 5124,
-       5636, 6164, 6676, 7224
+    512, 512, 512, 516, 512, 512, 512, 512, 512, 512, 512, 528, 512, 548
 };
 
 
@@ -54,6 +53,8 @@  static av_cold int mpc7_decode_init(AVCodecContext * avctx)
     static int vlc_initialized = 0;
 
     static VLC_TYPE quant_tables[7224][2];
+    VLC_TYPE (*quant_table)[2] = quant_tables;
+    const uint16_t *raw_quant_table = mpc7_quant_vlcs;
 
     /* Musepack SV7 is always stereo */
     if (avctx->channels != 2) {
@@ -103,11 +104,13 @@  static av_cold int mpc7_decode_init(AVCodecContext * avctx)
                     &mpc7_hdr[0], 2, 1, 1 << MPC7_HDR_SIZE);
     for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){
         for(j = 0; j < 2; j++){
-            quant_vlc[i][j].table = &quant_tables[quant_offsets[i*2 + j]];
-            quant_vlc[i][j].table_allocated = quant_offsets[i*2 + j + 1] - quant_offsets[i*2 + j];
+            quant_vlc[i][j].table = quant_table;
+            quant_vlc[i][j].table_allocated = quant_sizes[i * 2 + j];
+            quant_table += quant_sizes[i * 2 + j];
             init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i],
-                        &mpc7_quant_vlc[i][j][1], 4, 2,
-                     &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_NEW_STATIC);
+                     raw_quant_table + 1, 4, 2,
+                     raw_quant_table, 4, 2, INIT_VLC_USE_NEW_STATIC);
+            raw_quant_table += 2 * mpc7_quant_vlc_sizes[i];
         }
     }
     vlc_initialized = 1;
diff --git a/libavcodec/mpc7data.h b/libavcodec/mpc7data.h
index 90ab75fe65..b9c5f208a4 100644
--- a/libavcodec/mpc7data.h
+++ b/libavcodec/mpc7data.h
@@ -59,87 +59,59 @@  static const uint8_t mpc7_quant_vlc_off[MPC7_QUANT_VLC_TABLES] = {
     0, 0, 3, 4, 7, 15, 31
 };
 
-static const uint16_t mpc7_quant_vlc[MPC7_QUANT_VLC_TABLES][2][64 * 2] = {
-{
-    {
+static const uint16_t mpc7_quant_vlcs[177 * 2 * 2] = {
         0x0036,  6, 0x0009,  5, 0x0020,  6, 0x0005,  5, 0x000A,  4, 0x0007,  5,
         0x0034,  6, 0x0000,  5, 0x0023,  6, 0x000A,  5, 0x0006,  4, 0x0004,  5,
         0x000B,  4, 0x0007,  3, 0x000C,  4, 0x0003,  5, 0x0007,  4, 0x000B,  5,
         0x0022,  6, 0x0001,  5, 0x0035,  6, 0x0006,  5, 0x0009,  4, 0x0002,  5,
-        0x0021,  6, 0x0008,  5, 0x0037,  6
-    },
-    {
+        0x0021,  6, 0x0008,  5, 0x0037,  6,
         0x0067,  8, 0x003E,  7, 0x00E1,  9, 0x0037,  7, 0x0003,  4, 0x0034,  7,
         0x0065,  8, 0x003C,  7, 0x00E3,  9, 0x0018,  6, 0x0000,  4, 0x003D,  7,
         0x0004,  4, 0x0001,  1, 0x0005,  4, 0x003F,  7, 0x0001,  4, 0x003B,  7,
         0x00E2,  9, 0x0039,  7, 0x0064,  8, 0x0035,  7, 0x0002,  4, 0x0036,  7,
-        0x00E0,  9, 0x003A,  7, 0x0066,  8
-    }
-},
-{
-    {
+        0x00E0,  9, 0x003A,  7, 0x0066,  8,
+
         0x0059,  7, 0x002F,  6, 0x000F,  5, 0x0000,  5, 0x005B,  7, 0x0004,  5,
         0x0006,  4, 0x000D,  4, 0x0004,  4, 0x0005,  5, 0x0014,  5, 0x000C,  4,
         0x0004,  3, 0x000F,  4, 0x000E,  5, 0x0003,  5, 0x0003,  4, 0x000E,  4,
         0x0005,  4, 0x0001,  5, 0x005A,  7, 0x0002,  5, 0x0015,  5, 0x002E,  6,
-        0x0058,  7
-    },
-    {
+        0x0058,  7,
         0x0399, 10, 0x0071,  7, 0x0033,  6, 0x00E7,  8, 0x039A, 10, 0x0068,  7,
         0x001E,  5, 0x0000,  3, 0x001D,  5, 0x0069,  7, 0x0032,  6, 0x0001,  3,
         0x0002,  2, 0x0003,  3, 0x0031,  6, 0x006B,  7, 0x001B,  5, 0x0002,  3,
         0x001F,  5, 0x0070,  7, 0x0398, 10, 0x006A,  7, 0x0030,  6, 0x0072,  7,
-        0x039B, 10
-    }
-},
-{
-    {
-        0x000C,  4, 0x0004,  3, 0x0000,  2, 0x0001,  2, 0x0007,  3, 0x0005,  3, 0x000D,  4
-    },
-    {
-        0x0004,  5, 0x0003,  4, 0x0002,  2, 0x0003,  2, 0x0001,  2, 0x0000,  3, 0x0005,  5
-    }
-},
-{
-    {
-        0x0005,  4, 0x0000,  3, 0x0004,  3, 0x0006,  3, 0x0007,  3, 0x0005,  3, 0x0003,  3, 0x0001,  3, 0x0004,  4
-    },
-    {
-        0x0009,  5, 0x000C,  4, 0x0003,  3, 0x0000,  2, 0x0002,  2, 0x0007,  3, 0x000D,  4, 0x0005,  4, 0x0008,  5
-    }
-},
-{
-    {
+        0x039B, 10,
+
+        0x000C,  4, 0x0004,  3, 0x0000,  2, 0x0001,  2, 0x0007,  3, 0x0005,  3,
+        0x000D,  4,
+        0x0004,  5, 0x0003,  4, 0x0002,  2, 0x0003,  2, 0x0001,  2, 0x0000,  3,
+        0x0005,  5,
+
+        0x0005,  4, 0x0000,  3, 0x0004,  3, 0x0006,  3, 0x0007,  3, 0x0005,  3,
+        0x0003,  3, 0x0001,  3, 0x0004,  4,
+        0x0009,  5, 0x000C,  4, 0x0003,  3, 0x0000,  2, 0x0002,  2, 0x0007,  3,
+        0x000D,  4, 0x0005,  4, 0x0008,  5,
+
         0x0039,  6, 0x0017,  5, 0x0008,  4, 0x000A,  4, 0x000D,  4, 0x0000,  3,
         0x0002,  3, 0x0003,  3, 0x0001,  3, 0x000F,  4, 0x000C,  4, 0x0009,  4,
         0x001D,  5, 0x0016,  5, 0x0038,  6,
-    },
-    {
         0x00E5,  8, 0x0038,  6, 0x0007,  5, 0x0002,  4, 0x0000,  3, 0x0003,  3,
         0x0005,  3, 0x0006,  3, 0x0004,  3, 0x0002,  3, 0x000F,  4, 0x001D,  5,
         0x0006,  5, 0x0073,  7, 0x00E4,  8,
-    },
-},
-{
-    {
+
         0x0041,  7, 0x0006,  6, 0x002C,  6, 0x002D,  6, 0x003B,  6, 0x000D,  5,
         0x0011,  5, 0x0013,  5, 0x0017,  5, 0x0015,  5, 0x001A,  5, 0x001E,  5,
         0x0000,  4, 0x0002,  4, 0x0005,  4, 0x0007,  4, 0x0003,  4, 0x0004,  4,
         0x001F,  5, 0x001C,  5, 0x0019,  5, 0x001B,  5, 0x0018,  5, 0x0014,  5,
         0x0012,  5, 0x000C,  5, 0x0002,  5, 0x003A,  6, 0x0021,  6, 0x0007,  6,
-        0x0040,  7
-    },
-    {
+        0x0040,  7,
         0x1948, 13, 0x194A, 13, 0x0328, 10, 0x0195,  9, 0x00CB,  8, 0x0066,  7,
         0x0031,  6, 0x0009,  5, 0x000F,  5, 0x001F,  5, 0x0002,  4, 0x0006,  4,
         0x0008,  4, 0x000B,  4, 0x000D,  4, 0x0000,  3, 0x000E,  4, 0x000A,  4,
         0x0009,  4, 0x0005,  4, 0x0003,  4, 0x001E,  5, 0x000E,  5, 0x0008,  5,
         0x0030,  6, 0x0067,  7, 0x00C9,  8, 0x00C8,  8, 0x0653, 11, 0x1949, 13,
-        0x194B, 13
-    }
-},
-{
-    {
+        0x194B, 13,
+
         0x0067,  8, 0x0099,  8, 0x00B5,  8, 0x00E9,  8, 0x0040,  7, 0x0041,  7,
         0x004D,  7, 0x0051,  7, 0x005B,  7, 0x0071,  7, 0x0070,  7, 0x0018,  6,
         0x001D,  6, 0x0023,  6, 0x0025,  6, 0x0029,  6, 0x002C,  6, 0x002E,  6,
@@ -150,9 +122,7 @@  static const uint16_t mpc7_quant_vlc[MPC7_QUANT_VLC_TABLES][2][64 * 2] = {
         0x003B,  6, 0x0034,  6, 0x0030,  6, 0x002F,  6, 0x002B,  6, 0x002A,  6,
         0x0027,  6, 0x0024,  6, 0x0021,  6, 0x001C,  6, 0x0075,  7, 0x0065,  7,
         0x0064,  7, 0x0050,  7, 0x0045,  7, 0x0044,  7, 0x0032,  7, 0x00E8,  8,
-        0x00B4,  8, 0x0098,  8, 0x0066,  8
-    },
-    {
+        0x00B4,  8, 0x0098,  8, 0x0066,  8,
         0x37A4, 14, 0x37AD, 14, 0x37A6, 14, 0x37AE, 14, 0x0DEA, 12, 0x02F0, 10,
         0x02F1, 10, 0x00A0,  9, 0x00A2,  9, 0x01BC,  9, 0x007A,  8, 0x00DF,  8,
         0x003C,  7, 0x0049,  7, 0x006E,  7, 0x000E,  6, 0x0018,  6, 0x0019,  6,
@@ -164,8 +134,6 @@  static const uint16_t mpc7_quant_vlc[MPC7_QUANT_VLC_TABLES][2][64 * 2] = {
         0x005F,  7, 0x0048,  7, 0x0029,  7, 0x00BD,  8, 0x007B,  8, 0x0179,  9,
         0x00A1,  9, 0x037B, 10, 0x0147, 10, 0x0146, 10, 0x0DE8, 12, 0x37AF, 14,
         0x37A7, 14, 0x37AC, 14, 0x37A5, 14
-    }
-}
 };
 
 #endif /* AVCODEC_MPC7DATA_H */