comparison mace.c @ 7807:8c32b5606f83 libavcodec

Do not share context variables between channels and do not zero them at decode_frame(). This makes the output much closer to that of the binary decoder.
author vitor
date Sun, 07 Sep 2008 09:42:57 +0000
parents b90764c4f31a
children 0acafe424d54
comparison
equal deleted inserted replaced
7806:b90764c4f31a 7807:8c32b5606f83
232 { 0x342C, 0x7FFF, 0x8000, 0xCBD3, 0, 0, 0, 0 }, { 0x3681, 0x7FFF, 0x8000, 0xC97E, 0, 0, 0, 0 }, 232 { 0x342C, 0x7FFF, 0x8000, 0xCBD3, 0, 0, 0, 0 }, { 0x3681, 0x7FFF, 0x8000, 0xC97E, 0, 0, 0, 0 },
233 { 0x38F0, 0x7FFF, 0x8000, 0xC70F, 0, 0, 0, 0 }, { 0x3B7A, 0x7FFF, 0x8000, 0xC485, 0, 0, 0, 0 }, 233 { 0x38F0, 0x7FFF, 0x8000, 0xC70F, 0, 0, 0, 0 }, { 0x3B7A, 0x7FFF, 0x8000, 0xC485, 0, 0, 0, 0 },
234 { 0x3E22, 0x7FFF, 0x8000, 0xC1DD, 0, 0, 0, 0 }, { 0x40E7, 0x7FFF, 0x8000, 0xBF18, 0, 0, 0, 0 }, 234 { 0x3E22, 0x7FFF, 0x8000, 0xC1DD, 0, 0, 0, 0 }, { 0x40E7, 0x7FFF, 0x8000, 0xBF18, 0, 0, 0, 0 },
235 }; 235 };
236 236
237 typedef struct ChannelData {
238 short index, lev, factor, prev2, previous, level;
239 } ChannelData;
240
237 typedef struct MACEContext { 241 typedef struct MACEContext {
238 short index, lev, factor, prev2, previous, level; 242 ChannelData chd[2];
239 } MACEContext; 243 } MACEContext;
240 244
241 static void chomp3(MACEContext *ctx, int16_t *output, uint8_t val, 245 static void chomp3(ChannelData *ctx, int16_t *output, uint8_t val,
242 const uint16_t tab1[], 246 const uint16_t tab1[],
243 const uint16_t tab2[][8], uint32_t numChannels) 247 const uint16_t tab2[][8], uint32_t numChannels)
244 { 248 {
245 short current; 249 short current;
246 250
258 *output = current; 262 *output = current;
259 if (( ctx->index += tab1[val]-(ctx->index >> 5) ) < 0) 263 if (( ctx->index += tab1[val]-(ctx->index >> 5) ) < 0)
260 ctx->index = 0; 264 ctx->index = 0;
261 } 265 }
262 266
263 static void chomp6(MACEContext *ctx, int16_t *output, uint8_t val, 267 static void chomp6(ChannelData *ctx, int16_t *output, uint8_t val,
264 const uint16_t tab1[], 268 const uint16_t tab1[],
265 const uint16_t tab2[][8], uint32_t numChannels) 269 const uint16_t tab2[][8], uint32_t numChannels)
266 { 270 {
267 short current; 271 short current;
268 272
317 MACEContext *ctx = avctx->priv_data; 321 MACEContext *ctx = avctx->priv_data;
318 int i, j, k; 322 int i, j, k;
319 323
320 for(i = 0; i < avctx->channels; i++) { 324 for(i = 0; i < avctx->channels; i++) {
321 int16_t *output = samples + i; 325 int16_t *output = samples + i;
322 ctx->index = ctx->lev = 0;
323 326
324 for (j=0; j < buf_size / 2 / avctx->channels; j++) 327 for (j=0; j < buf_size / 2 / avctx->channels; j++)
325 for (k=0; k < 2; k++) { 328 for (k=0; k < 2; k++) {
326 uint8_t pkt = buf[i*2 + j*2*avctx->channels + k]; 329 uint8_t pkt = buf[i*2 + j*2*avctx->channels + k];
327 chomp3(ctx, output, pkt &7, MACEtab1, MACEtab2, avctx->channels); 330 chomp3(&ctx->chd[i], output, pkt &7, MACEtab1, MACEtab2, avctx->channels);
328 output += avctx->channels; 331 output += avctx->channels;
329 chomp3(ctx, output,(pkt >> 3) &3, MACEtab3, MACEtab4, avctx->channels); 332 chomp3(&ctx->chd[i], output,(pkt >> 3) &3, MACEtab3, MACEtab4, avctx->channels);
330 output += avctx->channels; 333 output += avctx->channels;
331 chomp3(ctx, output, pkt >> 5 , MACEtab1, MACEtab2, avctx->channels); 334 chomp3(&ctx->chd[i], output, pkt >> 5 , MACEtab1, MACEtab2, avctx->channels);
332 output += avctx->channels; 335 output += avctx->channels;
333 } 336 }
334 } 337 }
335 338
336 *data_size = 2 * 3 * buf_size; 339 *data_size = 2 * 3 * buf_size;
346 MACEContext *ctx = avctx->priv_data; 349 MACEContext *ctx = avctx->priv_data;
347 int i, j; 350 int i, j;
348 351
349 for(i = 0; i < avctx->channels; i++) { 352 for(i = 0; i < avctx->channels; i++) {
350 int16_t *output = samples + i; 353 int16_t *output = samples + i;
351 ctx->previous = ctx->prev2 = ctx->index = ctx->level = ctx->factor = 0;
352 354
353 for (j = 0; j < buf_size / avctx->channels; j++) { 355 for (j = 0; j < buf_size / avctx->channels; j++) {
354 uint8_t pkt = buf[i + j*avctx->channels]; 356 uint8_t pkt = buf[i + j*avctx->channels];
355 357
356 chomp6(ctx, output, pkt >> 5 , MACEtab1, MACEtab2, avctx->channels); 358 chomp6(&ctx->chd[i], output, pkt >> 5 , MACEtab1, MACEtab2, avctx->channels);
357 output += avctx->channels << 1; 359 output += avctx->channels << 1;
358 chomp6(ctx, output,(pkt >> 3) & 3, MACEtab3, MACEtab4, avctx->channels); 360 chomp6(&ctx->chd[i], output,(pkt >> 3) & 3, MACEtab3, MACEtab4, avctx->channels);
359 output += avctx->channels << 1; 361 output += avctx->channels << 1;
360 chomp6(ctx, output, pkt & 7, MACEtab1, MACEtab2, avctx->channels); 362 chomp6(&ctx->chd[i], output, pkt & 7, MACEtab1, MACEtab2, avctx->channels);
361 output += avctx->channels << 1; 363 output += avctx->channels << 1;
362 } 364 }
363 } 365 }
364 366
365 *data_size = 2 * 6 * buf_size; 367 *data_size = 2 * 6 * buf_size;