Mercurial > libavcodec.hg
annotate dtsdec.c @ 5016:3674582fb4e7 libavcodec
Remove lots of unused commented code. (Cleanup)
| author | banan |
|---|---|
| date | Thu, 17 May 2007 07:50:08 +0000 |
| parents | 03aa103464d4 |
| children |
| rev | line source |
|---|---|
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
1 /* |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
2 * dtsdec.c : free DTS Coherent Acoustics stream decoder. |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
3 * Copyright (C) 2004 Benjamin Zores <ben@geexbox.org> |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
4 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3267
diff
changeset
|
5 * This file is part of FFmpeg. |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
6 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3267
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or modify |
| 2126 | 8 * it under the terms of the GNU General Public License as published by |
| 3965 | 9 * the Free Software Foundation; either version 2 of the License, or |
| 2126 | 10 * (at your option) any later version. |
| 2967 | 11 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3267
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 2126 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 * GNU General Public License for more details. | |
| 2967 | 16 * |
| 2126 | 17 * You should have received a copy of the GNU General Public License |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3267
diff
changeset
|
18 * along with FFmpeg; if not, write to the Free Software |
| 4385 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
20 */ |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
21 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
22 #include "avcodec.h" |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
23 #include <dts.h> |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
24 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
25 #include <stdlib.h> |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
26 #include <string.h> |
| 2186 | 27 |
|
3267
8072ed8993f6
dtsdec.c copies one input packet at a time to a (static) buffer of size
rtognimp
parents:
2979
diff
changeset
|
28 #define BUFFER_SIZE 18726 |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
29 #define HEADER_SIZE 14 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
30 |
| 4482 | 31 #define CONVERT_LEVEL 1 |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
32 #define CONVERT_BIAS 0 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
33 |
| 4481 | 34 typedef struct DTSContext { |
| 35 dts_state_t *state; | |
| 36 uint8_t buf[BUFFER_SIZE]; | |
| 37 uint8_t *bufptr; | |
| 38 uint8_t *bufpos; | |
| 39 } DTSContext; | |
| 40 | |
| 4478 | 41 static inline int16_t |
| 4482 | 42 convert(sample_t s) |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
43 { |
| 4482 | 44 return s * 0x7fff; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
45 } |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
46 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
47 static void |
| 4482 | 48 convert2s16_multi(sample_t *f, int16_t *s16, int flags) |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
49 { |
| 4478 | 50 int i; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
51 |
| 4482 | 52 switch(flags & (DTS_CHANNEL_MASK | DTS_LFE)){ |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
53 case DTS_MONO: |
| 4482 | 54 for(i = 0; i < 256; i++){ |
| 55 s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0; | |
| 56 s16[5*i+4] = convert(f[i]); | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
57 } |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
58 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
59 case DTS_CHANNEL: |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
60 case DTS_STEREO: |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
61 case DTS_DOLBY: |
| 4482 | 62 for(i = 0; i < 256; i++){ |
| 63 s16[2*i] = convert(f[i]); | |
| 64 s16[2*i+1] = convert(f[i+256]); | |
| 65 } | |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
66 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
67 case DTS_3F: |
| 4482 | 68 for(i = 0; i < 256; i++){ |
| 69 s16[5*i] = convert(f[i+256]); | |
| 70 s16[5*i+1] = convert(f[i+512]); | |
| 71 s16[5*i+2] = s16[5*i+3] = 0; | |
| 72 s16[5*i+4] = convert(f[i]); | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
73 } |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
74 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
75 case DTS_2F2R: |
| 4482 | 76 for(i = 0; i < 256; i++){ |
| 77 s16[4*i] = convert(f[i]); | |
| 78 s16[4*i+1] = convert(f[i+256]); | |
| 79 s16[4*i+2] = convert(f[i+512]); | |
| 80 s16[4*i+3] = convert(f[i+768]); | |
| 81 } | |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
82 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
83 case DTS_3F2R: |
| 4482 | 84 for(i = 0; i < 256; i++){ |
| 85 s16[5*i] = convert(f[i+256]); | |
| 86 s16[5*i+1] = convert(f[i+512]); | |
| 87 s16[5*i+2] = convert(f[i+768]); | |
| 88 s16[5*i+3] = convert(f[i+1024]); | |
| 89 s16[5*i+4] = convert(f[i]); | |
| 90 } | |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
91 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
92 case DTS_MONO | DTS_LFE: |
| 4482 | 93 for(i = 0; i < 256; i++){ |
| 94 s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0; | |
| 95 s16[6*i+4] = convert(f[i]); | |
| 96 s16[6*i+5] = convert(f[i+256]); | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
97 } |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
98 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
99 case DTS_CHANNEL | DTS_LFE: |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
100 case DTS_STEREO | DTS_LFE: |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
101 case DTS_DOLBY | DTS_LFE: |
| 4482 | 102 for(i = 0; i < 256; i++){ |
| 103 s16[6*i] = convert(f[i]); | |
| 104 s16[6*i+1] = convert(f[i+256]); | |
| 105 s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0; | |
| 106 s16[6*i+5] = convert(f[i+512]); | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
107 } |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
108 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
109 case DTS_3F | DTS_LFE: |
| 4482 | 110 for(i = 0; i < 256; i++){ |
| 111 s16[6*i] = convert(f[i+256]); | |
| 112 s16[6*i+1] = convert(f[i+512]); | |
| 113 s16[6*i+2] = s16[6*i+3] = 0; | |
| 114 s16[6*i+4] = convert(f[i]); | |
| 115 s16[6*i+5] = convert(f[i+768]); | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
116 } |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
117 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
118 case DTS_2F2R | DTS_LFE: |
| 4482 | 119 for(i = 0; i < 256; i++){ |
| 120 s16[6*i] = convert(f[i]); | |
| 121 s16[6*i+1] = convert(f[i+256]); | |
| 122 s16[6*i+2] = convert(f[i+512]); | |
| 123 s16[6*i+3] = convert(f[i+768]); | |
| 124 s16[6*i+4] = 0; | |
| 125 s16[6*i+5] = convert(f[i+1024]); | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
126 } |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
127 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
128 case DTS_3F2R | DTS_LFE: |
| 4482 | 129 for(i = 0; i < 256; i++){ |
| 130 s16[6*i] = convert(f[i+256]); | |
| 131 s16[6*i+1] = convert(f[i+512]); | |
| 132 s16[6*i+2] = convert(f[i+768]); | |
| 133 s16[6*i+3] = convert(f[i+1024]); | |
| 134 s16[6*i+4] = convert(f[i]); | |
| 135 s16[6*i+5] = convert(f[i+1280]); | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
136 } |
|
5011
03aa103464d4
DTS decoding was broken for every speaker configuration except 5.1.
diego
parents:
4897
diff
changeset
|
137 break; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
138 } |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
139 } |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
140 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
141 static int |
| 4478 | 142 channels_multi(int flags) |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
143 { |
| 4482 | 144 switch(flags & (DTS_CHANNEL_MASK | DTS_LFE)){ |
| 145 case DTS_CHANNEL: | |
| 146 case DTS_STEREO: | |
| 147 case DTS_DOLBY: | |
| 148 return 2; | |
| 149 case DTS_2F2R: | |
| 150 return 4; | |
| 151 case DTS_MONO: | |
| 152 case DTS_3F: | |
| 153 case DTS_3F2R: | |
| 4478 | 154 return 5; |
| 4482 | 155 case DTS_MONO | DTS_LFE: |
| 156 case DTS_CHANNEL | DTS_LFE: | |
| 157 case DTS_STEREO | DTS_LFE: | |
| 158 case DTS_DOLBY | DTS_LFE: | |
| 159 case DTS_3F | DTS_LFE: | |
| 160 case DTS_2F2R | DTS_LFE: | |
| 161 case DTS_3F2R | DTS_LFE: | |
| 162 return 6; | |
| 163 } | |
| 164 | |
| 165 return -1; | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
166 } |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
167 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
168 static int |
| 4478 | 169 dts_decode_frame(AVCodecContext * avctx, void *data, int *data_size, |
| 170 uint8_t * buff, int buff_size) | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
171 { |
| 4481 | 172 DTSContext *s = avctx->priv_data; |
| 4478 | 173 uint8_t *start = buff; |
| 174 uint8_t *end = buff + buff_size; | |
| 175 int16_t *out_samples = data; | |
| 4481 | 176 int sample_rate; |
| 177 int frame_length; | |
| 178 int flags; | |
| 4478 | 179 int bit_rate; |
| 180 int len; | |
| 4479 | 181 level_t level; |
| 182 sample_t bias; | |
| 4482 | 183 int nblocks; |
| 4479 | 184 int i; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
185 |
| 4478 | 186 *data_size = 0; |
| 2222 | 187 |
| 4478 | 188 while(1) { |
| 4479 | 189 int length; |
| 190 | |
| 4478 | 191 len = end - start; |
| 192 if(!len) | |
| 193 break; | |
| 4481 | 194 if(len > s->bufpos - s->bufptr) |
| 195 len = s->bufpos - s->bufptr; | |
| 196 memcpy(s->bufptr, start, len); | |
| 197 s->bufptr += len; | |
| 4478 | 198 start += len; |
| 4481 | 199 if(s->bufptr != s->bufpos) |
| 4478 | 200 return start - buff; |
| 4481 | 201 if(s->bufpos != s->buf + HEADER_SIZE) |
| 4478 | 202 break; |
|
3267
8072ed8993f6
dtsdec.c copies one input packet at a time to a (static) buffer of size
rtognimp
parents:
2979
diff
changeset
|
203 |
| 4481 | 204 length = dts_syncinfo(s->state, s->buf, &flags, &sample_rate, |
| 205 &bit_rate, &frame_length); | |
| 4479 | 206 if(!length) { |
| 207 av_log(NULL, AV_LOG_INFO, "skip\n"); | |
| 4481 | 208 for(s->bufptr = s->buf; s->bufptr < s->buf + HEADER_SIZE - 1; s->bufptr++) |
| 209 s->bufptr[0] = s->bufptr[1]; | |
| 4479 | 210 continue; |
| 211 } | |
| 4481 | 212 s->bufpos = s->buf + length; |
| 4479 | 213 } |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
214 |
| 4479 | 215 level = CONVERT_LEVEL; |
| 216 bias = CONVERT_BIAS; | |
| 217 | |
| 218 flags |= DTS_ADJUST_LEVEL; | |
| 4481 | 219 if(dts_frame(s->state, s->buf, &flags, &level, bias)) { |
| 4479 | 220 av_log(avctx, AV_LOG_ERROR, "dts_frame() failed\n"); |
| 221 goto end; | |
|
3267
8072ed8993f6
dtsdec.c copies one input packet at a time to a (static) buffer of size
rtognimp
parents:
2979
diff
changeset
|
222 } |
|
8072ed8993f6
dtsdec.c copies one input packet at a time to a (static) buffer of size
rtognimp
parents:
2979
diff
changeset
|
223 |
| 4479 | 224 avctx->sample_rate = sample_rate; |
| 225 avctx->channels = channels_multi(flags); | |
| 226 avctx->bit_rate = bit_rate; | |
| 4478 | 227 |
| 4482 | 228 nblocks = dts_blocks_num(s->state); |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
229 |
| 4482 | 230 for(i = 0; i < nblocks; i++) { |
| 4481 | 231 if(dts_block(s->state)) { |
| 4479 | 232 av_log(avctx, AV_LOG_ERROR, "dts_block() failed\n"); |
| 233 goto end; | |
| 234 } | |
| 4478 | 235 |
| 4482 | 236 convert2s16_multi(dts_samples(s->state), out_samples, flags); |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
237 |
| 4482 | 238 out_samples += 256 * avctx->channels; |
| 239 *data_size += 256 * sizeof(int16_t) * avctx->channels; | |
| 4478 | 240 } |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
241 |
| 4479 | 242 end: |
| 4481 | 243 s->bufptr = s->buf; |
| 244 s->bufpos = s->buf + HEADER_SIZE; | |
| 4478 | 245 return start - buff; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
246 } |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
247 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
248 static int |
| 4478 | 249 dts_decode_init(AVCodecContext * avctx) |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
250 { |
| 4481 | 251 DTSContext *s = avctx->priv_data; |
| 252 s->bufptr = s->buf; | |
| 253 s->bufpos = s->buf + HEADER_SIZE; | |
| 254 s->state = dts_init(0); | |
| 255 if(s->state == NULL) | |
| 4478 | 256 return -1; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
257 |
| 4478 | 258 return 0; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
259 } |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
260 |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
261 static int |
| 4481 | 262 dts_decode_end(AVCodecContext * avctx) |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
263 { |
| 4481 | 264 DTSContext *s = avctx->priv_data; |
| 265 dts_free(s->state); | |
| 4478 | 266 return 0; |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
267 } |
|
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
268 |
| 4897 | 269 AVCodec libdts_decoder = { |
| 270 "libdts", | |
| 4478 | 271 CODEC_TYPE_AUDIO, |
| 272 CODEC_ID_DTS, | |
| 4481 | 273 sizeof(DTSContext), |
| 4478 | 274 dts_decode_init, |
| 275 NULL, | |
| 276 dts_decode_end, | |
| 277 dts_decode_frame, | |
|
2123
ef54decf5624
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff
changeset
|
278 }; |
