Mercurial > libavcodec.hg
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; |