Mercurial > mplayer.hg
annotate libfaad2/mp4.c @ 29214:a1abd8d51b81
Change VOFW for x86 to 5120, it allows larger images to be scaled and was
not slower. Other archs are not changed as the larger VOFW was slower on PPC.
author | michael |
---|---|
date | Tue, 05 May 2009 01:34:16 +0000 |
parents | 645cbba10a57 |
children | e83eef58b30a |
rev | line source |
---|---|
10725 | 1 /* |
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding | |
12527 | 3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com |
10725 | 4 ** |
5 ** This program is free software; you can redistribute it and/or modify | |
6 ** it under the terms of the GNU General Public License as published by | |
7 ** the Free Software Foundation; either version 2 of the License, or | |
8 ** (at your option) any later version. | |
9 ** | |
10 ** This program is distributed in the hope that it will be useful, | |
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 ** GNU General Public License for more details. | |
14 ** | |
15 ** You should have received a copy of the GNU General Public License | |
16 ** along with this program; if not, write to the Free Software | |
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
18 ** | |
19 ** Any non-GPL usage of this software or parts of this software is strictly | |
20 ** forbidden. | |
21 ** | |
22 ** Commercial non-GPL licensing of this software is possible. | |
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. | |
24 ** | |
18141 | 25 ** $Id: mp4.c,v 1.32 2004/09/04 14:56:28 menno Exp $ |
10725 | 26 **/ |
27 | |
28 #include "common.h" | |
29 #include "structs.h" | |
30 | |
31 #include <stdlib.h> | |
32 | |
33 #include "bits.h" | |
34 #include "mp4.h" | |
35 #include "syntax.h" | |
36 | |
37 /* defines if an object type can be decoded by this library or not */ | |
38 static uint8_t ObjectTypesTable[32] = { | |
39 0, /* 0 NULL */ | |
40 #ifdef MAIN_DEC | |
41 1, /* 1 AAC Main */ | |
42 #else | |
43 0, /* 1 AAC Main */ | |
44 #endif | |
45 1, /* 2 AAC LC */ | |
46 #ifdef SSR_DEC | |
47 1, /* 3 AAC SSR */ | |
48 #else | |
49 0, /* 3 AAC SSR */ | |
50 #endif | |
51 #ifdef LTP_DEC | |
52 1, /* 4 AAC LTP */ | |
53 #else | |
54 0, /* 4 AAC LTP */ | |
55 #endif | |
56 #ifdef SBR_DEC | |
57 1, /* 5 SBR */ | |
58 #else | |
59 0, /* 5 SBR */ | |
60 #endif | |
12527 | 61 #ifdef SCALABLE_DEC |
62 1, /* 6 AAC Scalable */ | |
63 #else | |
10725 | 64 0, /* 6 AAC Scalable */ |
12527 | 65 #endif |
10725 | 66 0, /* 7 TwinVQ */ |
67 0, /* 8 CELP */ | |
68 0, /* 9 HVXC */ | |
69 0, /* 10 Reserved */ | |
70 0, /* 11 Reserved */ | |
71 0, /* 12 TTSI */ | |
72 0, /* 13 Main synthetic */ | |
73 0, /* 14 Wavetable synthesis */ | |
74 0, /* 15 General MIDI */ | |
75 0, /* 16 Algorithmic Synthesis and Audio FX */ | |
76 | |
77 /* MPEG-4 Version 2 */ | |
78 #ifdef ERROR_RESILIENCE | |
79 1, /* 17 ER AAC LC */ | |
80 0, /* 18 (Reserved) */ | |
81 #ifdef LTP_DEC | |
82 1, /* 19 ER AAC LTP */ | |
83 #else | |
84 0, /* 19 ER AAC LTP */ | |
85 #endif | |
12527 | 86 #ifdef SCALABLE_DEC |
87 1, /* 20 ER AAC scalable */ | |
88 #else | |
10725 | 89 0, /* 20 ER AAC scalable */ |
12527 | 90 #endif |
10725 | 91 0, /* 21 ER TwinVQ */ |
92 0, /* 22 ER BSAC */ | |
93 #ifdef LD_DEC | |
94 1, /* 23 ER AAC LD */ | |
95 #else | |
96 0, /* 23 ER AAC LD */ | |
97 #endif | |
98 0, /* 24 ER CELP */ | |
99 0, /* 25 ER HVXC */ | |
100 0, /* 26 ER HILN */ | |
101 0, /* 27 ER Parametric */ | |
102 #else /* No ER defined */ | |
103 0, /* 17 ER AAC LC */ | |
104 0, /* 18 (Reserved) */ | |
105 0, /* 19 ER AAC LTP */ | |
106 0, /* 20 ER AAC scalable */ | |
107 0, /* 21 ER TwinVQ */ | |
108 0, /* 22 ER BSAC */ | |
109 0, /* 23 ER AAC LD */ | |
110 0, /* 24 ER CELP */ | |
111 0, /* 25 ER HVXC */ | |
112 0, /* 26 ER HILN */ | |
113 0, /* 27 ER Parametric */ | |
114 #endif | |
115 0, /* 28 (Reserved) */ | |
116 0, /* 29 (Reserved) */ | |
117 0, /* 30 (Reserved) */ | |
118 0 /* 31 (Reserved) */ | |
119 }; | |
120 | |
121 /* Table 1.6.1 */ | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
122 int8_t NEAACDECAPI NeAACDecAudioSpecificConfig(uint8_t *pBuffer, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
123 uint32_t buffer_size, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
124 mp4AudioSpecificConfig *mp4ASC) |
10725 | 125 { |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
126 return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL, 0); |
10725 | 127 } |
128 | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
129 int8_t AudioSpecificConfigFromBitfile(bitfile *ld, |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
130 mp4AudioSpecificConfig *mp4ASC, |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
131 program_config *pce, uint32_t buffer_size, uint8_t short_form) |
10725 | 132 { |
133 int8_t result = 0; | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
134 uint32_t startpos = faad_get_processed_bits(ld); |
10725 | 135 #ifdef SBR_DEC |
136 int8_t bits_to_decode = 0; | |
137 #endif | |
138 | |
139 if (mp4ASC == NULL) | |
140 return -8; | |
141 | |
142 memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig)); | |
143 | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
144 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 |
10725 | 145 DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); |
146 | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
147 mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(ld, 4 |
10725 | 148 DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex")); |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
149 if(mp4ASC->samplingFrequencyIndex==0x0f) |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
150 faad_getbits(ld, 24); |
10725 | 151 |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
152 mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(ld, 4 |
10725 | 153 DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration")); |
154 | |
10989 | 155 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
10725 | 156 |
157 if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1) | |
158 { | |
159 return -1; | |
160 } | |
161 | |
162 if (mp4ASC->samplingFrequency == 0) | |
163 { | |
164 return -2; | |
165 } | |
166 | |
167 if (mp4ASC->channelsConfiguration > 7) | |
168 { | |
169 return -3; | |
170 } | |
171 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
172 #if (defined(PS_DEC) || defined(DRM_PS)) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
173 /* check if we have a mono file */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
174 if (mp4ASC->channelsConfiguration == 1) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
175 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
176 /* upMatrix to 2 channels for implicit signalling of PS */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
177 mp4ASC->channelsConfiguration = 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
178 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
179 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
180 |
10725 | 181 #ifdef SBR_DEC |
182 mp4ASC->sbr_present_flag = -1; | |
183 if (mp4ASC->objectTypeIndex == 5) | |
184 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
185 uint8_t tmp; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
186 |
10725 | 187 mp4ASC->sbr_present_flag = 1; |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
188 tmp = (uint8_t)faad_getbits(ld, 4 |
10725 | 189 DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
190 /* check for downsampled SBR */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
191 if (tmp == mp4ASC->samplingFrequencyIndex) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
192 mp4ASC->downSampledSBR = 1; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
193 mp4ASC->samplingFrequencyIndex = tmp; |
10725 | 194 if (mp4ASC->samplingFrequencyIndex == 15) |
195 { | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
196 mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 |
10725 | 197 DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
198 } else { | |
10989 | 199 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
10725 | 200 } |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
201 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 |
10725 | 202 DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); |
203 } | |
204 #endif | |
205 | |
206 /* get GASpecificConfig */ | |
207 if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 || | |
208 mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 || | |
209 mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7) | |
210 { | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
211 result = GASpecificConfig(ld, mp4ASC, pce); |
10725 | 212 |
213 #ifdef ERROR_RESILIENCE | |
214 } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */ | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
215 result = GASpecificConfig(ld, mp4ASC, pce); |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
216 mp4ASC->epConfig = (uint8_t)faad_getbits(ld, 2 |
10725 | 217 DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig")); |
218 | |
219 if (mp4ASC->epConfig != 0) | |
220 result = -5; | |
221 #endif | |
222 | |
223 } else { | |
224 result = -4; | |
225 } | |
226 | |
227 #ifdef SSR_DEC | |
228 /* shorter frames not allowed for SSR */ | |
229 if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag) | |
230 return -6; | |
231 #endif | |
232 | |
233 | |
234 #ifdef SBR_DEC | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
235 if(short_form) |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
236 bits_to_decode = 0; |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
237 else |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
238 bits_to_decode = (int8_t)(buffer_size*8 - (startpos-faad_get_processed_bits(ld))); |
10725 | 239 if ((mp4ASC->objectTypeIndex != 5) && (bits_to_decode >= 16)) |
240 { | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
241 int16_t syncExtensionType = (int16_t)faad_getbits(ld, 11 |
10725 | 242 DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType")); |
243 | |
244 if (syncExtensionType == 0x2b7) | |
245 { | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
246 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 |
10725 | 247 DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType")); |
248 | |
249 if (mp4ASC->objectTypeIndex == 5) | |
250 { | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
251 mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(ld |
10725 | 252 DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag")); |
253 | |
254 if (mp4ASC->sbr_present_flag) | |
255 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
256 uint8_t tmp; |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
257 tmp = (uint8_t)faad_getbits(ld, 4 |
10725 | 258 DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
259 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
260 /* check for downsampled SBR */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
261 if (tmp == mp4ASC->samplingFrequencyIndex) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
262 mp4ASC->downSampledSBR = 1; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
263 mp4ASC->samplingFrequencyIndex = tmp; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
264 |
10725 | 265 if (mp4ASC->samplingFrequencyIndex == 15) |
266 { | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
267 mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 |
10725 | 268 DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
269 } else { | |
10989 | 270 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
10725 | 271 } |
272 } | |
273 } | |
274 } | |
275 } | |
10989 | 276 |
277 /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */ | |
278 /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */ | |
279 if (mp4ASC->sbr_present_flag == -1) | |
280 { | |
281 if (mp4ASC->samplingFrequency <= 24000) | |
282 { | |
283 mp4ASC->samplingFrequency *= 2; | |
284 mp4ASC->forceUpSampling = 1; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
285 } else /* > 24000*/ { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
286 mp4ASC->downSampledSBR = 1; |
10989 | 287 } |
288 } | |
10725 | 289 #endif |
290 | |
291 return result; | |
292 } | |
25835
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
293 |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
294 int8_t AudioSpecificConfig2(uint8_t *pBuffer, |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
295 uint32_t buffer_size, |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
296 mp4AudioSpecificConfig *mp4ASC, |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
297 program_config *pce, |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
298 uint8_t short_form) |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
299 { |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
300 uint8_t ret = 0; |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
301 bitfile ld; |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
302 faad_initbits(&ld, pBuffer, buffer_size); |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
303 faad_byte_align(&ld); |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
304 ret = AudioSpecificConfigFromBitfile(&ld, mp4ASC, pce, buffer_size, short_form); |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
305 faad_endbits(&ld); |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
306 return ret; |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
307 } |
645cbba10a57
added AudioSpecificConfigFromBitfile() -that reads from an initizialized
nicodvb
parents:
18141
diff
changeset
|
308 |