Mercurial > libavcodec.hg
annotate mace.c @ 9077:ad7fd7a40717 libavcodec
Do not read uninitialized buffer, no matter if it will be multiplied by
zero later. This should fix some valgrind warnings and hopefully FATE
ra144 test on ARM.
author | vitor |
---|---|
date | Sun, 01 Mar 2009 11:14:21 +0000 |
parents | e9d9d946f213 |
children | 54bc8a2727b0 |
rev | line source |
---|---|
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
1 /* |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
2 * MACE decoder |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
3 * Copyright (c) 2002 Laszlo Torok <torokl@alpha.dfmk.hu> |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3682
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3682
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3682
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3682
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3682
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
16 * |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3682
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
20 */ |
1106 | 21 |
22 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8002
diff
changeset
|
23 * @file libavcodec/mace.c |
1106 | 24 * MACE decoder. |
25 */ | |
2967 | 26 |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
27 #include "avcodec.h" |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
28 |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
29 /* |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
30 * Adapted to ffmpeg by Francois Revol <revol@free.fr> |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
31 * (removed 68k REG stuff, changed types, added some statics and consts, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
32 * libavcodec api, context stuff, interlaced stereo out). |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
33 */ |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
34 |
7842 | 35 static const int16_t MACEtab1[] = {-13, 8, 76, 222, 222, 76, 8, -13}; |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
36 |
7842 | 37 static const int16_t MACEtab3[] = {-18, 140, 140, -18}; |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
38 |
7817 | 39 static const int16_t MACEtab2[][4] = { |
40 { 37, 116, 206, 330}, { 39, 121, 216, 346}, | |
41 { 41, 127, 225, 361}, { 42, 132, 235, 377}, | |
42 { 44, 137, 245, 392}, { 46, 144, 256, 410}, | |
43 { 48, 150, 267, 428}, { 51, 157, 280, 449}, | |
44 { 53, 165, 293, 470}, { 55, 172, 306, 490}, | |
45 { 58, 179, 319, 511}, { 60, 187, 333, 534}, | |
46 { 63, 195, 348, 557}, { 66, 205, 364, 583}, | |
47 { 69, 214, 380, 609}, { 72, 223, 396, 635}, | |
48 { 75, 233, 414, 663}, { 79, 244, 433, 694}, | |
49 { 82, 254, 453, 725}, { 86, 265, 472, 756}, | |
50 { 90, 278, 495, 792}, { 94, 290, 516, 826}, | |
51 { 98, 303, 538, 862}, { 102, 316, 562, 901}, | |
52 { 107, 331, 588, 942}, { 112, 345, 614, 983}, | |
53 { 117, 361, 641, 1027}, { 122, 377, 670, 1074}, | |
54 { 127, 394, 701, 1123}, { 133, 411, 732, 1172}, | |
55 { 139, 430, 764, 1224}, { 145, 449, 799, 1280}, | |
56 { 152, 469, 835, 1337}, { 159, 490, 872, 1397}, | |
57 { 166, 512, 911, 1459}, { 173, 535, 951, 1523}, | |
58 { 181, 558, 993, 1590}, { 189, 584, 1038, 1663}, | |
59 { 197, 610, 1085, 1738}, { 206, 637, 1133, 1815}, | |
60 { 215, 665, 1183, 1895}, { 225, 695, 1237, 1980}, | |
61 { 235, 726, 1291, 2068}, { 246, 759, 1349, 2161}, | |
62 { 257, 792, 1409, 2257}, { 268, 828, 1472, 2357}, | |
63 { 280, 865, 1538, 2463}, { 293, 903, 1606, 2572}, | |
64 { 306, 944, 1678, 2688}, { 319, 986, 1753, 2807}, | |
65 { 334, 1030, 1832, 2933}, { 349, 1076, 1914, 3065}, | |
66 { 364, 1124, 1999, 3202}, { 380, 1174, 2088, 3344}, | |
67 { 398, 1227, 2182, 3494}, { 415, 1281, 2278, 3649}, | |
68 { 434, 1339, 2380, 3811}, { 453, 1398, 2486, 3982}, | |
69 { 473, 1461, 2598, 4160}, { 495, 1526, 2714, 4346}, | |
70 { 517, 1594, 2835, 4540}, { 540, 1665, 2961, 4741}, | |
71 { 564, 1740, 3093, 4953}, { 589, 1818, 3232, 5175}, | |
72 { 615, 1898, 3375, 5405}, { 643, 1984, 3527, 5647}, | |
73 { 671, 2072, 3683, 5898}, { 701, 2164, 3848, 6161}, | |
74 { 733, 2261, 4020, 6438}, { 766, 2362, 4199, 6724}, | |
75 { 800, 2467, 4386, 7024}, { 836, 2578, 4583, 7339}, | |
76 { 873, 2692, 4786, 7664}, { 912, 2813, 5001, 8008}, | |
77 { 952, 2938, 5223, 8364}, { 995, 3070, 5457, 8739}, | |
78 { 1039, 3207, 5701, 9129}, { 1086, 3350, 5956, 9537}, | |
79 { 1134, 3499, 6220, 9960}, { 1185, 3655, 6497, 10404}, | |
80 { 1238, 3818, 6788, 10869}, { 1293, 3989, 7091, 11355}, | |
81 { 1351, 4166, 7407, 11861}, { 1411, 4352, 7738, 12390}, | |
82 { 1474, 4547, 8084, 12946}, { 1540, 4750, 8444, 13522}, | |
83 { 1609, 4962, 8821, 14126}, { 1680, 5183, 9215, 14756}, | |
84 { 1756, 5415, 9626, 15415}, { 1834, 5657, 10057, 16104}, | |
85 { 1916, 5909, 10505, 16822}, { 2001, 6173, 10975, 17574}, | |
86 { 2091, 6448, 11463, 18356}, { 2184, 6736, 11974, 19175}, | |
87 { 2282, 7037, 12510, 20032}, { 2383, 7351, 13068, 20926}, | |
88 { 2490, 7679, 13652, 21861}, { 2601, 8021, 14260, 22834}, | |
89 { 2717, 8380, 14897, 23854}, { 2838, 8753, 15561, 24918}, | |
90 { 2965, 9144, 16256, 26031}, { 3097, 9553, 16982, 27193}, | |
91 { 3236, 9979, 17740, 28407}, { 3380, 10424, 18532, 29675}, | |
92 { 3531, 10890, 19359, 31000}, { 3688, 11375, 20222, 32382}, | |
93 { 3853, 11883, 21125, 32767}, { 4025, 12414, 22069, 32767}, | |
94 { 4205, 12967, 23053, 32767}, { 4392, 13546, 24082, 32767}, | |
95 { 4589, 14151, 25157, 32767}, { 4793, 14783, 26280, 32767}, | |
96 { 5007, 15442, 27452, 32767}, { 5231, 16132, 28678, 32767}, | |
97 { 5464, 16851, 29957, 32767}, { 5708, 17603, 31294, 32767}, | |
98 { 5963, 18389, 32691, 32767}, { 6229, 19210, 32767, 32767}, | |
99 { 6507, 20067, 32767, 32767}, { 6797, 20963, 32767, 32767}, | |
100 { 7101, 21899, 32767, 32767}, { 7418, 22876, 32767, 32767}, | |
101 { 7749, 23897, 32767, 32767}, { 8095, 24964, 32767, 32767}, | |
102 { 8456, 26078, 32767, 32767}, { 8833, 27242, 32767, 32767}, | |
103 { 9228, 28457, 32767, 32767}, { 9639, 29727, 32767, 32767} | |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
104 }; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
105 |
7817 | 106 static const int16_t MACEtab4[][2] = { |
107 { 64, 216}, { 67, 226}, { 70, 236}, { 74, 246}, | |
108 { 77, 257}, { 80, 268}, { 84, 280}, { 88, 294}, | |
109 { 92, 307}, { 96, 321}, { 100, 334}, { 104, 350}, | |
110 { 109, 365}, { 114, 382}, { 119, 399}, { 124, 416}, | |
111 { 130, 434}, { 136, 454}, { 142, 475}, { 148, 495}, | |
112 { 155, 519}, { 162, 541}, { 169, 564}, { 176, 590}, | |
113 { 185, 617}, { 193, 644}, { 201, 673}, { 210, 703}, | |
114 { 220, 735}, { 230, 767}, { 240, 801}, { 251, 838}, | |
115 { 262, 876}, { 274, 914}, { 286, 955}, { 299, 997}, | |
116 { 312, 1041}, { 326, 1089}, { 341, 1138}, { 356, 1188}, | |
117 { 372, 1241}, { 388, 1297}, { 406, 1354}, { 424, 1415}, | |
118 { 443, 1478}, { 462, 1544}, { 483, 1613}, { 505, 1684}, | |
119 { 527, 1760}, { 551, 1838}, { 576, 1921}, { 601, 2007}, | |
120 { 628, 2097}, { 656, 2190}, { 686, 2288}, { 716, 2389}, | |
121 { 748, 2496}, { 781, 2607}, { 816, 2724}, { 853, 2846}, | |
122 { 891, 2973}, { 930, 3104}, { 972, 3243}, { 1016, 3389}, | |
123 { 1061, 3539}, { 1108, 3698}, { 1158, 3862}, { 1209, 4035}, | |
124 { 1264, 4216}, { 1320, 4403}, { 1379, 4599}, { 1441, 4806}, | |
125 { 1505, 5019}, { 1572, 5244}, { 1642, 5477}, { 1715, 5722}, | |
126 { 1792, 5978}, { 1872, 6245}, { 1955, 6522}, { 2043, 6813}, | |
127 { 2134, 7118}, { 2229, 7436}, { 2329, 7767}, { 2432, 8114}, | |
128 { 2541, 8477}, { 2655, 8854}, { 2773, 9250}, { 2897, 9663}, | |
129 { 3026, 10094}, { 3162, 10546}, { 3303, 11016}, { 3450, 11508}, | |
130 { 3604, 12020}, { 3765, 12556}, { 3933, 13118}, { 4108, 13703}, | |
131 { 4292, 14315}, { 4483, 14953}, { 4683, 15621}, { 4892, 16318}, | |
132 { 5111, 17046}, { 5339, 17807}, { 5577, 18602}, { 5826, 19433}, | |
133 { 6086, 20300}, { 6358, 21205}, { 6642, 22152}, { 6938, 23141}, | |
134 { 7248, 24173}, { 7571, 25252}, { 7909, 26380}, { 8262, 27557}, | |
135 { 8631, 28786}, { 9016, 30072}, { 9419, 31413}, { 9839, 32767}, | |
136 { 10278, 32767}, { 10737, 32767}, { 11216, 32767}, { 11717, 32767}, | |
137 { 12240, 32767}, { 12786, 32767}, { 13356, 32767}, { 13953, 32767}, | |
138 { 14576, 32767}, { 15226, 32767}, { 15906, 32767}, { 16615, 32767} | |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
139 }; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
140 |
8000 | 141 static const struct { |
142 const int16_t *tab1; const int16_t *tab2; int stride; | |
143 } tabs[] = { | |
144 {MACEtab1, &MACEtab2[0][0], 4}, | |
145 {MACEtab3, &MACEtab4[0][0], 2}, | |
146 {MACEtab1, &MACEtab2[0][0], 4} | |
147 }; | |
148 | |
7808
0acafe424d54
Use the same 8 bit -> 16 bit conversion as QuickTime.
vitor
parents:
7807
diff
changeset
|
149 #define QT_8S_2_16S(x) (((x) & 0xFF00) | (((x) >> 8) & 0xFF)) |
0acafe424d54
Use the same 8 bit -> 16 bit conversion as QuickTime.
vitor
parents:
7807
diff
changeset
|
150 |
7807
8c32b5606f83
Do not share context variables between channels and do not zero them at
vitor
parents:
7806
diff
changeset
|
151 typedef struct ChannelData { |
7840
38dd4fd9f107
Remove ChannelData.lev var and use ChannelData.level instead
vitor
parents:
7819
diff
changeset
|
152 int16_t index, factor, prev2, previous, level; |
7807
8c32b5606f83
Do not share context variables between channels and do not zero them at
vitor
parents:
7806
diff
changeset
|
153 } ChannelData; |
8c32b5606f83
Do not share context variables between channels and do not zero them at
vitor
parents:
7806
diff
changeset
|
154 |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
155 typedef struct MACEContext { |
7807
8c32b5606f83
Do not share context variables between channels and do not zero them at
vitor
parents:
7806
diff
changeset
|
156 ChannelData chd[2]; |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
157 } MACEContext; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
158 |
7810
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
159 /** |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
160 * MACE version of av_clip_int16(). We have to do this to keep binary |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
161 * identical output to the binary decoder. |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
162 */ |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
163 static inline int16_t mace_broken_clip_int16(int n) |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
164 { |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
165 if (n > 32767) |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
166 return 32767; |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
167 else if (n < -32768) |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
168 return -32767; |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
169 else |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
170 return n; |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
171 } |
06d3f6968b90
Factorize broken clipping in its own function and document it.
vitor
parents:
7809
diff
changeset
|
172 |
8000 | 173 static int16_t read_table(ChannelData *chd, uint8_t val, int tab_idx) |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
174 { |
7816 | 175 int16_t current; |
7792
c372b8d5abfb
Reindent mace.c, its indentation was completly inconsistent with the coding rules.
vitor
parents:
7451
diff
changeset
|
176 |
8000 | 177 if (val < tabs[tab_idx].stride) |
178 current = tabs[tab_idx].tab2[((chd->index & 0x7f0) >> 4) * tabs[tab_idx].stride + val]; | |
7817 | 179 else |
8000 | 180 current = - 1 - tabs[tab_idx].tab2[((chd->index & 0x7f0) >> 4)*tabs[tab_idx].stride + 2*tabs[tab_idx].stride-val-1]; |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
181 |
8000 | 182 if (( chd->index += tabs[tab_idx].tab1[val]-(chd->index >> 5) ) < 0) |
7998 | 183 chd->index = 0; |
184 | |
185 return current; | |
186 } | |
187 | |
188 static void chomp3(ChannelData *chd, int16_t *output, uint8_t val, | |
8000 | 189 int tab_idx, |
7998 | 190 uint32_t numChannels) |
191 { | |
192 | |
8000 | 193 int16_t current = read_table(chd, val, tab_idx); |
7998 | 194 |
7840
38dd4fd9f107
Remove ChannelData.lev var and use ChannelData.level instead
vitor
parents:
7819
diff
changeset
|
195 current = mace_broken_clip_int16(current + chd->level); |
7792
c372b8d5abfb
Reindent mace.c, its indentation was completly inconsistent with the coding rules.
vitor
parents:
7451
diff
changeset
|
196 |
7840
38dd4fd9f107
Remove ChannelData.lev var and use ChannelData.level instead
vitor
parents:
7819
diff
changeset
|
197 chd->level = current - (current >> 3); |
7808
0acafe424d54
Use the same 8 bit -> 16 bit conversion as QuickTime.
vitor
parents:
7807
diff
changeset
|
198 *output = QT_8S_2_16S(current); |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
199 } |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
200 |
7818 | 201 static void chomp6(ChannelData *chd, int16_t *output, uint8_t val, |
8000 | 202 int tab_idx, |
7813 | 203 uint32_t numChannels) |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
204 { |
8000 | 205 int16_t current = read_table(chd, val, tab_idx); |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
206 |
7818 | 207 if ((chd->previous ^ current) >= 0) { |
208 chd->factor = FFMIN(chd->factor + 506, 32767); | |
7792
c372b8d5abfb
Reindent mace.c, its indentation was completly inconsistent with the coding rules.
vitor
parents:
7451
diff
changeset
|
209 } else { |
7818 | 210 if (chd->factor - 314 < -32768) |
211 chd->factor = -32767; | |
7792
c372b8d5abfb
Reindent mace.c, its indentation was completly inconsistent with the coding rules.
vitor
parents:
7451
diff
changeset
|
212 else |
7818 | 213 chd->factor -= 314; |
7792
c372b8d5abfb
Reindent mace.c, its indentation was completly inconsistent with the coding rules.
vitor
parents:
7451
diff
changeset
|
214 } |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
215 |
7818 | 216 current = mace_broken_clip_int16(current + chd->level); |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
217 |
7841 | 218 chd->level = (current*chd->factor) >> 15; |
7792
c372b8d5abfb
Reindent mace.c, its indentation was completly inconsistent with the coding rules.
vitor
parents:
7451
diff
changeset
|
219 current >>= 1; |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
220 |
7818 | 221 output[0] = QT_8S_2_16S(chd->previous + chd->prev2 - |
222 ((chd->prev2-current) >> 2)); | |
223 output[numChannels] = QT_8S_2_16S(chd->previous + current + | |
224 ((chd->prev2-current) >> 2)); | |
225 chd->prev2 = chd->previous; | |
226 chd->previous = current; | |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
227 } |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
228 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6217
diff
changeset
|
229 static av_cold int mace_decode_init(AVCodecContext * avctx) |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
230 { |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
231 if (avctx->channels > 2) |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
232 return -1; |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7040
diff
changeset
|
233 avctx->sample_fmt = SAMPLE_FMT_S16; |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
234 return 0; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
235 } |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
236 |
8002
f94fb6a31d5c
Cosmetics: rename mace3_decode_frame() to mace_decode_frame()
vitor
parents:
8001
diff
changeset
|
237 static int mace_decode_frame(AVCodecContext *avctx, |
7809 | 238 void *data, int *data_size, |
239 const uint8_t *buf, int buf_size) | |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
240 { |
7816 | 241 int16_t *samples = data; |
7796
a7caaa2b56e9
Functions mace{3,6}_decode_frame() are just wrappers to Exp1to{3,6}(). This commit
vitor
parents:
7795
diff
changeset
|
242 MACEContext *ctx = avctx->priv_data; |
8000 | 243 int i, j, k, l; |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
244 int is_mace3 = (avctx->codec_id == CODEC_ID_MACE3); |
7796
a7caaa2b56e9
Functions mace{3,6}_decode_frame() are just wrappers to Exp1to{3,6}(). This commit
vitor
parents:
7795
diff
changeset
|
245 |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
246 if (*data_size < (3 * buf_size << (2-is_mace3))) { |
7819 | 247 av_log(avctx, AV_LOG_ERROR, "Output buffer too small!\n"); |
248 return -1; | |
249 } | |
250 | |
7796
a7caaa2b56e9
Functions mace{3,6}_decode_frame() are just wrappers to Exp1to{3,6}(). This commit
vitor
parents:
7795
diff
changeset
|
251 for(i = 0; i < avctx->channels; i++) { |
7806 | 252 int16_t *output = samples + i; |
7796
a7caaa2b56e9
Functions mace{3,6}_decode_frame() are just wrappers to Exp1to{3,6}(). This commit
vitor
parents:
7795
diff
changeset
|
253 |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
254 for (j=0; j < buf_size / (avctx->channels << is_mace3); j++) |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
255 for (k=0; k < (1 << is_mace3); k++) { |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
256 uint8_t pkt = buf[(i << is_mace3) + |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
257 (j*avctx->channels << is_mace3) + k]; |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
258 |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
259 uint8_t val[2][3] = {{pkt >> 5, (pkt >> 3) & 3, pkt & 7 }, |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
260 {pkt & 7 , (pkt >> 3) & 3, pkt >> 5}}; |
8000 | 261 |
262 for (l=0; l < 3; l++) { | |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
263 if (is_mace3) |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
264 chomp3(&ctx->chd[i], output, val[1][l], l, |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
265 avctx->channels); |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
266 else |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
267 chomp6(&ctx->chd[i], output, val[0][l], l, |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
268 avctx->channels); |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
269 |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
270 output += avctx->channels << (1-is_mace3); |
8000 | 271 } |
7797 | 272 } |
7796
a7caaa2b56e9
Functions mace{3,6}_decode_frame() are just wrappers to Exp1to{3,6}(). This commit
vitor
parents:
7795
diff
changeset
|
273 } |
7795
7f81fb0dd829
Simplify: use two distinct functions to decode MACE3 and MACE6, since the
vitor
parents:
7794
diff
changeset
|
274 |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
275 *data_size = 3 * buf_size << (2-is_mace3); |
7795
7f81fb0dd829
Simplify: use two distinct functions to decode MACE3 and MACE6, since the
vitor
parents:
7794
diff
changeset
|
276 |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
277 return buf_size; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
278 } |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
279 |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
280 AVCodec mace3_decoder = { |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
281 "mace3", |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
282 CODEC_TYPE_AUDIO, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
283 CODEC_ID_MACE3, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
284 sizeof(MACEContext), |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
285 mace_decode_init, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
286 NULL, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
287 NULL, |
8002
f94fb6a31d5c
Cosmetics: rename mace3_decode_frame() to mace_decode_frame()
vitor
parents:
8001
diff
changeset
|
288 mace_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6710
diff
changeset
|
289 .long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 3:1"), |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
290 }; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
291 |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
292 AVCodec mace6_decoder = { |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
293 "mace6", |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
294 CODEC_TYPE_AUDIO, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
295 CODEC_ID_MACE6, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
296 sizeof(MACEContext), |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
297 mace_decode_init, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
298 NULL, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
299 NULL, |
8002
f94fb6a31d5c
Cosmetics: rename mace3_decode_frame() to mace_decode_frame()
vitor
parents:
8001
diff
changeset
|
300 mace_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6710
diff
changeset
|
301 .long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 6:1"), |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
302 }; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
303 |