Mercurial > libavcodec.hg
annotate mace.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | 7dd2a45249a9 |
children |
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 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
23 * @file |
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, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
239 AVPacket *avpkt) |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
240 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
241 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
242 int buf_size = avpkt->size; |
7816 | 243 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
|
244 MACEContext *ctx = avctx->priv_data; |
8000 | 245 int i, j, k, l; |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
246 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
|
247 |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
248 if (*data_size < (3 * buf_size << (2-is_mace3))) { |
7819 | 249 av_log(avctx, AV_LOG_ERROR, "Output buffer too small!\n"); |
250 return -1; | |
251 } | |
252 | |
7796
a7caaa2b56e9
Functions mace{3,6}_decode_frame() are just wrappers to Exp1to{3,6}(). This commit
vitor
parents:
7795
diff
changeset
|
253 for(i = 0; i < avctx->channels; i++) { |
7806 | 254 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
|
255 |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
256 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
|
257 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
|
258 uint8_t pkt = buf[(i << is_mace3) + |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
259 (j*avctx->channels << is_mace3) + k]; |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
260 |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
261 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
|
262 {pkt & 7 , (pkt >> 3) & 3, pkt >> 5}}; |
8000 | 263 |
264 for (l=0; l < 3; l++) { | |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
265 if (is_mace3) |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
266 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
|
267 avctx->channels); |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
268 else |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
269 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
|
270 avctx->channels); |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
271 |
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
272 output += avctx->channels << (1-is_mace3); |
8000 | 273 } |
7797 | 274 } |
7796
a7caaa2b56e9
Functions mace{3,6}_decode_frame() are just wrappers to Exp1to{3,6}(). This commit
vitor
parents:
7795
diff
changeset
|
275 } |
7795
7f81fb0dd829
Simplify: use two distinct functions to decode MACE3 and MACE6, since the
vitor
parents:
7794
diff
changeset
|
276 |
8001
038bb3b45b34
Avoid code duplication between mace3_decode_frame() and mace6_decode_frame()
vitor
parents:
8000
diff
changeset
|
277 *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
|
278 |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
279 return buf_size; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
280 } |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
281 |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
282 AVCodec mace3_decoder = { |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
283 "mace3", |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
9355
diff
changeset
|
284 AVMEDIA_TYPE_AUDIO, |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
285 CODEC_ID_MACE3, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
286 sizeof(MACEContext), |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
287 mace_decode_init, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
288 NULL, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
289 NULL, |
8002
f94fb6a31d5c
Cosmetics: rename mace3_decode_frame() to mace_decode_frame()
vitor
parents:
8001
diff
changeset
|
290 mace_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6710
diff
changeset
|
291 .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
|
292 }; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
293 |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
294 AVCodec mace6_decoder = { |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
295 "mace6", |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
9355
diff
changeset
|
296 AVMEDIA_TYPE_AUDIO, |
827
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
297 CODEC_ID_MACE6, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
298 sizeof(MACEContext), |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
299 mace_decode_init, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
300 NULL, |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
301 NULL, |
8002
f94fb6a31d5c
Cosmetics: rename mace3_decode_frame() to mace_decode_frame()
vitor
parents:
8001
diff
changeset
|
302 mace_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6710
diff
changeset
|
303 .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
|
304 }; |
770578c6c300
added MACE (Macintosh Audio Compression/Expansion) 3:1 & 6:1 support
michaelni
parents:
diff
changeset
|
305 |