95b995e59e92984a2ca29f3a8edd33dbbc3e25cd
[ffmpeg.git] / libavcodec / mace.c
1 /*
2  * MACE decoder
3  * Copyright (c) 2002 Laszlo Torok <torokl@alpha.dfmk.hu>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file mace.c
24  * MACE decoder.
25  */
26
27 #include "avcodec.h"
28
29 /*
30  * Adapted to ffmpeg by Francois Revol <revol@free.fr>
31  * (removed 68k REG stuff, changed types, added some statics and consts,
32  * libavcodec api, context stuff, interlaced stereo out).
33  */
34
35 static const uint16_t MACEtab1[] = { 0xfff3, 0x0008, 0x004c, 0x00de, 0x00de, 0x004c, 0x0008, 0xfff3 };
36
37 static const uint16_t MACEtab3[] = { 0xffee, 0x008c, 0x008c, 0xffee };
38
39 static const int16_t MACEtab2[][8] = {
40     {    37,    116,    206,    330,   -331,   -207,   -117,    -38},
41     {    39,    121,    216,    346,   -347,   -217,   -122,    -40},
42     {    41,    127,    225,    361,   -362,   -226,   -128,    -42},
43     {    42,    132,    235,    377,   -378,   -236,   -133,    -43},
44     {    44,    137,    245,    392,   -393,   -246,   -138,    -45},
45     {    46,    144,    256,    410,   -411,   -257,   -145,    -47},
46     {    48,    150,    267,    428,   -429,   -268,   -151,    -49},
47     {    51,    157,    280,    449,   -450,   -281,   -158,    -52},
48     {    53,    165,    293,    470,   -471,   -294,   -166,    -54},
49     {    55,    172,    306,    490,   -491,   -307,   -173,    -56},
50     {    58,    179,    319,    511,   -512,   -320,   -180,    -59},
51     {    60,    187,    333,    534,   -535,   -334,   -188,    -61},
52     {    63,    195,    348,    557,   -558,   -349,   -196,    -64},
53     {    66,    205,    364,    583,   -584,   -365,   -206,    -67},
54     {    69,    214,    380,    609,   -610,   -381,   -215,    -70},
55     {    72,    223,    396,    635,   -636,   -397,   -224,    -73},
56     {    75,    233,    414,    663,   -664,   -415,   -234,    -76},
57     {    79,    244,    433,    694,   -695,   -434,   -245,    -80},
58     {    82,    254,    453,    725,   -726,   -454,   -255,    -83},
59     {    86,    265,    472,    756,   -757,   -473,   -266,    -87},
60     {    90,    278,    495,    792,   -793,   -496,   -279,    -91},
61     {    94,    290,    516,    826,   -827,   -517,   -291,    -95},
62     {    98,    303,    538,    862,   -863,   -539,   -304,    -99},
63     {   102,    316,    562,    901,   -902,   -563,   -317,   -103},
64     {   107,    331,    588,    942,   -943,   -589,   -332,   -108},
65     {   112,    345,    614,    983,   -984,   -615,   -346,   -113},
66     {   117,    361,    641,   1027,  -1028,   -642,   -362,   -118},
67     {   122,    377,    670,   1074,  -1075,   -671,   -378,   -123},
68     {   127,    394,    701,   1123,  -1124,   -702,   -395,   -128},
69     {   133,    411,    732,   1172,  -1173,   -733,   -412,   -134},
70     {   139,    430,    764,   1224,  -1225,   -765,   -431,   -140},
71     {   145,    449,    799,   1280,  -1281,   -800,   -450,   -146},
72     {   152,    469,    835,   1337,  -1338,   -836,   -470,   -153},
73     {   159,    490,    872,   1397,  -1398,   -873,   -491,   -160},
74     {   166,    512,    911,   1459,  -1460,   -912,   -513,   -167},
75     {   173,    535,    951,   1523,  -1524,   -952,   -536,   -174},
76     {   181,    558,    993,   1590,  -1591,   -994,   -559,   -182},
77     {   189,    584,   1038,   1663,  -1664,  -1039,   -585,   -190},
78     {   197,    610,   1085,   1738,  -1739,  -1086,   -611,   -198},
79     {   206,    637,   1133,   1815,  -1816,  -1134,   -638,   -207},
80     {   215,    665,   1183,   1895,  -1896,  -1184,   -666,   -216},
81     {   225,    695,   1237,   1980,  -1981,  -1238,   -696,   -226},
82     {   235,    726,   1291,   2068,  -2069,  -1292,   -727,   -236},
83     {   246,    759,   1349,   2161,  -2162,  -1350,   -760,   -247},
84     {   257,    792,   1409,   2257,  -2258,  -1410,   -793,   -258},
85     {   268,    828,   1472,   2357,  -2358,  -1473,   -829,   -269},
86     {   280,    865,   1538,   2463,  -2464,  -1539,   -866,   -281},
87     {   293,    903,   1606,   2572,  -2573,  -1607,   -904,   -294},
88     {   306,    944,   1678,   2688,  -2689,  -1679,   -945,   -307},
89     {   319,    986,   1753,   2807,  -2808,  -1754,   -987,   -320},
90     {   334,   1030,   1832,   2933,  -2934,  -1833,  -1031,   -335},
91     {   349,   1076,   1914,   3065,  -3066,  -1915,  -1077,   -350},
92     {   364,   1124,   1999,   3202,  -3203,  -2000,  -1125,   -365},
93     {   380,   1174,   2088,   3344,  -3345,  -2089,  -1175,   -381},
94     {   398,   1227,   2182,   3494,  -3495,  -2183,  -1228,   -399},
95     {   415,   1281,   2278,   3649,  -3650,  -2279,  -1282,   -416},
96     {   434,   1339,   2380,   3811,  -3812,  -2381,  -1340,   -435},
97     {   453,   1398,   2486,   3982,  -3983,  -2487,  -1399,   -454},
98     {   473,   1461,   2598,   4160,  -4161,  -2599,  -1462,   -474},
99     {   495,   1526,   2714,   4346,  -4347,  -2715,  -1527,   -496},
100     {   517,   1594,   2835,   4540,  -4541,  -2836,  -1595,   -518},
101     {   540,   1665,   2961,   4741,  -4742,  -2962,  -1666,   -541},
102     {   564,   1740,   3093,   4953,  -4954,  -3094,  -1741,   -565},
103     {   589,   1818,   3232,   5175,  -5176,  -3233,  -1819,   -590},
104     {   615,   1898,   3375,   5405,  -5406,  -3376,  -1899,   -616},
105     {   643,   1984,   3527,   5647,  -5648,  -3528,  -1985,   -644},
106     {   671,   2072,   3683,   5898,  -5899,  -3684,  -2073,   -672},
107     {   701,   2164,   3848,   6161,  -6162,  -3849,  -2165,   -702},
108     {   733,   2261,   4020,   6438,  -6439,  -4021,  -2262,   -734},
109     {   766,   2362,   4199,   6724,  -6725,  -4200,  -2363,   -767},
110     {   800,   2467,   4386,   7024,  -7025,  -4387,  -2468,   -801},
111     {   836,   2578,   4583,   7339,  -7340,  -4584,  -2579,   -837},
112     {   873,   2692,   4786,   7664,  -7665,  -4787,  -2693,   -874},
113     {   912,   2813,   5001,   8008,  -8009,  -5002,  -2814,   -913},
114     {   952,   2938,   5223,   8364,  -8365,  -5224,  -2939,   -953},
115     {   995,   3070,   5457,   8739,  -8740,  -5458,  -3071,   -996},
116     {  1039,   3207,   5701,   9129,  -9130,  -5702,  -3208,  -1040},
117     {  1086,   3350,   5956,   9537,  -9538,  -5957,  -3351,  -1087},
118     {  1134,   3499,   6220,   9960,  -9961,  -6221,  -3500,  -1135},
119     {  1185,   3655,   6497,  10404, -10405,  -6498,  -3656,  -1186},
120     {  1238,   3818,   6788,  10869, -10870,  -6789,  -3819,  -1239},
121     {  1293,   3989,   7091,  11355, -11356,  -7092,  -3990,  -1294},
122     {  1351,   4166,   7407,  11861, -11862,  -7408,  -4167,  -1352},
123     {  1411,   4352,   7738,  12390, -12391,  -7739,  -4353,  -1412},
124     {  1474,   4547,   8084,  12946, -12947,  -8085,  -4548,  -1475},
125     {  1540,   4750,   8444,  13522, -13523,  -8445,  -4751,  -1541},
126     {  1609,   4962,   8821,  14126, -14127,  -8822,  -4963,  -1610},
127     {  1680,   5183,   9215,  14756, -14757,  -9216,  -5184,  -1681},
128     {  1756,   5415,   9626,  15415, -15416,  -9627,  -5416,  -1757},
129     {  1834,   5657,  10057,  16104, -16105, -10058,  -5658,  -1835},
130     {  1916,   5909,  10505,  16822, -16823, -10506,  -5910,  -1917},
131     {  2001,   6173,  10975,  17574, -17575, -10976,  -6174,  -2002},
132     {  2091,   6448,  11463,  18356, -18357, -11464,  -6449,  -2092},
133     {  2184,   6736,  11974,  19175, -19176, -11975,  -6737,  -2185},
134     {  2282,   7037,  12510,  20032, -20033, -12511,  -7038,  -2283},
135     {  2383,   7351,  13068,  20926, -20927, -13069,  -7352,  -2384},
136     {  2490,   7679,  13652,  21861, -21862, -13653,  -7680,  -2491},
137     {  2601,   8021,  14260,  22834, -22835, -14261,  -8022,  -2602},
138     {  2717,   8380,  14897,  23854, -23855, -14898,  -8381,  -2718},
139     {  2838,   8753,  15561,  24918, -24919, -15562,  -8754,  -2839},
140     {  2965,   9144,  16256,  26031, -26032, -16257,  -9145,  -2966},
141     {  3097,   9553,  16982,  27193, -27194, -16983,  -9554,  -3098},
142     {  3236,   9979,  17740,  28407, -28408, -17741,  -9980,  -3237},
143     {  3380,  10424,  18532,  29675, -29676, -18533, -10425,  -3381},
144     {  3531,  10890,  19359,  31000, -31001, -19360, -10891,  -3532},
145     {  3688,  11375,  20222,  32382, -32383, -20223, -11376,  -3689},
146     {  3853,  11883,  21125,  32767, -32768, -21126, -11884,  -3854},
147     {  4025,  12414,  22069,  32767, -32768, -22070, -12415,  -4026},
148     {  4205,  12967,  23053,  32767, -32768, -23054, -12968,  -4206},
149     {  4392,  13546,  24082,  32767, -32768, -24083, -13547,  -4393},
150     {  4589,  14151,  25157,  32767, -32768, -25158, -14152,  -4590},
151     {  4793,  14783,  26280,  32767, -32768, -26281, -14784,  -4794},
152     {  5007,  15442,  27452,  32767, -32768, -27453, -15443,  -5008},
153     {  5231,  16132,  28678,  32767, -32768, -28679, -16133,  -5232},
154     {  5464,  16851,  29957,  32767, -32768, -29958, -16852,  -5465},
155     {  5708,  17603,  31294,  32767, -32768, -31295, -17604,  -5709},
156     {  5963,  18389,  32691,  32767, -32768, -32692, -18390,  -5964},
157     {  6229,  19210,  32767,  32767, -32768, -32768, -19211,  -6230},
158     {  6507,  20067,  32767,  32767, -32768, -32768, -20068,  -6508},
159     {  6797,  20963,  32767,  32767, -32768, -32768, -20964,  -6798},
160     {  7101,  21899,  32767,  32767, -32768, -32768, -21900,  -7102},
161     {  7418,  22876,  32767,  32767, -32768, -32768, -22877,  -7419},
162     {  7749,  23897,  32767,  32767, -32768, -32768, -23898,  -7750},
163     {  8095,  24964,  32767,  32767, -32768, -32768, -24965,  -8096},
164     {  8456,  26078,  32767,  32767, -32768, -32768, -26079,  -8457},
165     {  8833,  27242,  32767,  32767, -32768, -32768, -27243,  -8834},
166     {  9228,  28457,  32767,  32767, -32768, -32768, -28458,  -9229},
167     {  9639,  29727,  32767,  32767, -32768, -32768, -29728,  -9640}
168 };
169
170 static const int16_t MACEtab4[][4] = {
171     {    64,    216,   -217,    -65}, {    67,    226,   -227,    -68},
172     {    70,    236,   -237,    -71}, {    74,    246,   -247,    -75},
173     {    77,    257,   -258,    -78}, {    80,    268,   -269,    -81},
174     {    84,    280,   -281,    -85}, {    88,    294,   -295,    -89},
175     {    92,    307,   -308,    -93}, {    96,    321,   -322,    -97},
176     {   100,    334,   -335,   -101}, {   104,    350,   -351,   -105},
177     {   109,    365,   -366,   -110}, {   114,    382,   -383,   -115},
178     {   119,    399,   -400,   -120}, {   124,    416,   -417,   -125},
179     {   130,    434,   -435,   -131}, {   136,    454,   -455,   -137},
180     {   142,    475,   -476,   -143}, {   148,    495,   -496,   -149},
181     {   155,    519,   -520,   -156}, {   162,    541,   -542,   -163},
182     {   169,    564,   -565,   -170}, {   176,    590,   -591,   -177},
183     {   185,    617,   -618,   -186}, {   193,    644,   -645,   -194},
184     {   201,    673,   -674,   -202}, {   210,    703,   -704,   -211},
185     {   220,    735,   -736,   -221}, {   230,    767,   -768,   -231},
186     {   240,    801,   -802,   -241}, {   251,    838,   -839,   -252},
187     {   262,    876,   -877,   -263}, {   274,    914,   -915,   -275},
188     {   286,    955,   -956,   -287}, {   299,    997,   -998,   -300},
189     {   312,   1041,  -1042,   -313}, {   326,   1089,  -1090,   -327},
190     {   341,   1138,  -1139,   -342}, {   356,   1188,  -1189,   -357},
191     {   372,   1241,  -1242,   -373}, {   388,   1297,  -1298,   -389},
192     {   406,   1354,  -1355,   -407}, {   424,   1415,  -1416,   -425},
193     {   443,   1478,  -1479,   -444}, {   462,   1544,  -1545,   -463},
194     {   483,   1613,  -1614,   -484}, {   505,   1684,  -1685,   -506},
195     {   527,   1760,  -1761,   -528}, {   551,   1838,  -1839,   -552},
196     {   576,   1921,  -1922,   -577}, {   601,   2007,  -2008,   -602},
197     {   628,   2097,  -2098,   -629}, {   656,   2190,  -2191,   -657},
198     {   686,   2288,  -2289,   -687}, {   716,   2389,  -2390,   -717},
199     {   748,   2496,  -2497,   -749}, {   781,   2607,  -2608,   -782},
200     {   816,   2724,  -2725,   -817}, {   853,   2846,  -2847,   -854},
201     {   891,   2973,  -2974,   -892}, {   930,   3104,  -3105,   -931},
202     {   972,   3243,  -3244,   -973}, {  1016,   3389,  -3390,  -1017},
203     {  1061,   3539,  -3540,  -1062}, {  1108,   3698,  -3699,  -1109},
204     {  1158,   3862,  -3863,  -1159}, {  1209,   4035,  -4036,  -1210},
205     {  1264,   4216,  -4217,  -1265}, {  1320,   4403,  -4404,  -1321},
206     {  1379,   4599,  -4600,  -1380}, {  1441,   4806,  -4807,  -1442},
207     {  1505,   5019,  -5020,  -1506}, {  1572,   5244,  -5245,  -1573},
208     {  1642,   5477,  -5478,  -1643}, {  1715,   5722,  -5723,  -1716},
209     {  1792,   5978,  -5979,  -1793}, {  1872,   6245,  -6246,  -1873},
210     {  1955,   6522,  -6523,  -1956}, {  2043,   6813,  -6814,  -2044},
211     {  2134,   7118,  -7119,  -2135}, {  2229,   7436,  -7437,  -2230},
212     {  2329,   7767,  -7768,  -2330}, {  2432,   8114,  -8115,  -2433},
213     {  2541,   8477,  -8478,  -2542}, {  2655,   8854,  -8855,  -2656},
214     {  2773,   9250,  -9251,  -2774}, {  2897,   9663,  -9664,  -2898},
215     {  3026,  10094, -10095,  -3027}, {  3162,  10546, -10547,  -3163},
216     {  3303,  11016, -11017,  -3304}, {  3450,  11508, -11509,  -3451},
217     {  3604,  12020, -12021,  -3605}, {  3765,  12556, -12557,  -3766},
218     {  3933,  13118, -13119,  -3934}, {  4108,  13703, -13704,  -4109},
219     {  4292,  14315, -14316,  -4293}, {  4483,  14953, -14954,  -4484},
220     {  4683,  15621, -15622,  -4684}, {  4892,  16318, -16319,  -4893},
221     {  5111,  17046, -17047,  -5112}, {  5339,  17807, -17808,  -5340},
222     {  5577,  18602, -18603,  -5578}, {  5826,  19433, -19434,  -5827},
223     {  6086,  20300, -20301,  -6087}, {  6358,  21205, -21206,  -6359},
224     {  6642,  22152, -22153,  -6643}, {  6938,  23141, -23142,  -6939},
225     {  7248,  24173, -24174,  -7249}, {  7571,  25252, -25253,  -7572},
226     {  7909,  26380, -26381,  -7910}, {  8262,  27557, -27558,  -8263},
227     {  8631,  28786, -28787,  -8632}, {  9016,  30072, -30073,  -9017},
228     {  9419,  31413, -31414,  -9420}, {  9839,  32767, -32768,  -9840},
229     { 10278,  32767, -32768, -10279}, { 10737,  32767, -32768, -10738},
230     { 11216,  32767, -32768, -11217}, { 11717,  32767, -32768, -11718},
231     { 12240,  32767, -32768, -12241}, { 12786,  32767, -32768, -12787},
232     { 13356,  32767, -32768, -13357}, { 13953,  32767, -32768, -13954},
233     { 14576,  32767, -32768, -14577}, { 15226,  32767, -32768, -15227},
234     { 15906,  32767, -32768, -15907}, { 16615,  32767, -32768, -16616}
235 };
236
237 #define QT_8S_2_16S(x) (((x) & 0xFF00) | (((x) >> 8) & 0xFF))
238
239 typedef struct ChannelData {
240     short index, lev, factor, prev2, previous, level;
241 } ChannelData;
242
243 typedef struct MACEContext {
244     ChannelData chd[2];
245 } MACEContext;
246
247 /**
248  * MACE version of av_clip_int16(). We have to do this to keep binary
249  * identical output to the binary decoder.
250  */
251 static inline int16_t mace_broken_clip_int16(int n)
252 {
253     if (n > 32767)
254         return 32767;
255     else if (n < -32768)
256         return -32767;
257     else
258         return n;
259 }
260
261 static void chomp3(ChannelData *ctx, int16_t *output, uint8_t val,
262                    const uint16_t tab1[],
263                    const int16_t *tab2, int tab2_stride,
264                    uint32_t numChannels)
265 {
266     short current;
267
268     current = tab2[((ctx->index & 0x7f0) >> 4)*tab2_stride + val];
269
270     current = mace_broken_clip_int16(current + ctx->lev);
271
272     ctx->lev = current - (current >> 3);
273     *output = QT_8S_2_16S(current);
274     if (( ctx->index += tab1[val]-(ctx->index >> 5) ) < 0)
275         ctx->index = 0;
276 }
277
278 static void chomp6(ChannelData *ctx, int16_t *output, uint8_t val,
279                    const uint16_t tab1[],
280                    const int16_t *tab2, int tab2_stride,
281                    uint32_t numChannels)
282 {
283     short current;
284
285     current = tab2[((ctx->index & 0x7f0) >> 4)*tab2_stride + val];
286
287     if ((ctx->previous ^ current) >= 0) {
288         ctx->factor = FFMIN(ctx->factor + 506, 32767);
289     } else {
290         if (ctx->factor - 314 < -32768)
291             ctx->factor = -32767;
292         else
293             ctx->factor -= 314;
294     }
295
296     current = mace_broken_clip_int16(current + ctx->level);
297
298     ctx->level = ((current*ctx->factor) >> 15);
299     current >>= 1;
300
301     output[0] = QT_8S_2_16S(ctx->previous + ctx->prev2 -
302                             ((ctx->prev2-current) >> 2));
303     output[numChannels] = QT_8S_2_16S(ctx->previous + current +
304                                       ((ctx->prev2-current) >> 2));
305     ctx->prev2 = ctx->previous;
306     ctx->previous = current;
307
308     if ((ctx->index += tab1[val] - (ctx->index >> 5)) < 0)
309         ctx->index = 0;
310 }
311
312 static av_cold int mace_decode_init(AVCodecContext * avctx)
313 {
314     if (avctx->channels > 2)
315         return -1;
316     avctx->sample_fmt = SAMPLE_FMT_S16;
317     return 0;
318 }
319
320 static int mace3_decode_frame(AVCodecContext *avctx,
321                               void *data, int *data_size,
322                               const uint8_t *buf, int buf_size)
323 {
324     short *samples = data;
325     MACEContext *ctx = avctx->priv_data;
326     int i, j, k;
327
328     for(i = 0; i < avctx->channels; i++) {
329         int16_t *output = samples + i;
330
331         for (j=0; j < buf_size / 2 / avctx->channels; j++)
332             for (k=0; k < 2; k++) {
333                 uint8_t pkt = buf[i*2 + j*2*avctx->channels + k];
334                 chomp3(&ctx->chd[i], output, pkt       &7, MACEtab1, MACEtab2,
335                        8, avctx->channels);
336                 output += avctx->channels;
337                 chomp3(&ctx->chd[i], output,(pkt >> 3) &3, MACEtab3, MACEtab4,
338                        4, avctx->channels);
339                 output += avctx->channels;
340                 chomp3(&ctx->chd[i], output, pkt >> 5    , MACEtab1, MACEtab2,
341                        8, avctx->channels);
342                 output += avctx->channels;
343             }
344     }
345
346     *data_size = 2 * 3 * buf_size;
347
348     return buf_size;
349 }
350
351 static int mace6_decode_frame(AVCodecContext *avctx,
352                               void *data, int *data_size,
353                               const uint8_t *buf, int buf_size)
354 {
355     short *samples = data;
356     MACEContext *ctx = avctx->priv_data;
357     int i, j;
358
359     for(i = 0; i < avctx->channels; i++) {
360         int16_t *output = samples + i;
361
362         for (j = 0; j < buf_size / avctx->channels; j++) {
363             uint8_t pkt = buf[i + j*avctx->channels];
364
365             chomp6(&ctx->chd[i], output, pkt >> 5     , MACEtab1, MACEtab2,
366                    8, avctx->channels);
367             output += avctx->channels << 1;
368             chomp6(&ctx->chd[i], output,(pkt >> 3) & 3, MACEtab3, MACEtab4,
369                    4, avctx->channels);
370             output += avctx->channels << 1;
371             chomp6(&ctx->chd[i], output, pkt       & 7, MACEtab1, MACEtab2,
372                    8, avctx->channels);
373             output += avctx->channels << 1;
374         }
375     }
376
377     *data_size = 2 * 6 * buf_size;
378
379     return buf_size;
380 }
381
382 AVCodec mace3_decoder = {
383     "mace3",
384     CODEC_TYPE_AUDIO,
385     CODEC_ID_MACE3,
386     sizeof(MACEContext),
387     mace_decode_init,
388     NULL,
389     NULL,
390     mace3_decode_frame,
391     .long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 3:1"),
392 };
393
394 AVCodec mace6_decoder = {
395     "mace6",
396     CODEC_TYPE_AUDIO,
397     CODEC_ID_MACE6,
398     sizeof(MACEContext),
399     mace_decode_init,
400     NULL,
401     NULL,
402     mace6_decode_frame,
403     .long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 6:1"),
404 };
405