Mercurial > libavcodec.hg
comparison alsdec.c @ 12016:ebef2d6d5a8e libavcodec
Add CRC check to the ALS decoder.
| author | thilo.borgmann |
|---|---|
| date | Tue, 29 Jun 2010 16:56:28 +0000 |
| parents | 74c0478534cf |
| children | fdafbcef52f5 |
comparison
equal
deleted
inserted
replaced
| 12015:b9bbf46b3623 | 12016:ebef2d6d5a8e |
|---|---|
| 33 #include "get_bits.h" | 33 #include "get_bits.h" |
| 34 #include "unary.h" | 34 #include "unary.h" |
| 35 #include "mpeg4audio.h" | 35 #include "mpeg4audio.h" |
| 36 #include "bytestream.h" | 36 #include "bytestream.h" |
| 37 #include "bgmc.h" | 37 #include "bgmc.h" |
| 38 #include "dsputil.h" | |
| 39 #include "libavutil/crc.h" | |
| 38 | 40 |
| 39 #include <stdint.h> | 41 #include <stdint.h> |
| 40 | 42 |
| 41 /** Rice parameters and corresponding index offsets for decoding the | 43 /** Rice parameters and corresponding index offsets for decoding the |
| 42 * indices of scaled PARCOR values. The table choosen is set globally | 44 * indices of scaled PARCOR values. The table choosen is set globally |
| 152 | 154 |
| 153 typedef struct { | 155 typedef struct { |
| 154 uint32_t samples; ///< number of samples, 0xFFFFFFFF if unknown | 156 uint32_t samples; ///< number of samples, 0xFFFFFFFF if unknown |
| 155 int resolution; ///< 000 = 8-bit; 001 = 16-bit; 010 = 24-bit; 011 = 32-bit | 157 int resolution; ///< 000 = 8-bit; 001 = 16-bit; 010 = 24-bit; 011 = 32-bit |
| 156 int floating; ///< 1 = IEEE 32-bit floating-point, 0 = integer | 158 int floating; ///< 1 = IEEE 32-bit floating-point, 0 = integer |
| 159 int msb_first; ///< 1 = original CRC calculated on big-endian system, 0 = little-endian | |
| 157 int frame_length; ///< frame length for each frame (last frame may differ) | 160 int frame_length; ///< frame length for each frame (last frame may differ) |
| 158 int ra_distance; ///< distance between RA frames (in frames, 0...255) | 161 int ra_distance; ///< distance between RA frames (in frames, 0...255) |
| 159 enum RA_Flag ra_flag; ///< indicates where the size of ra units is stored | 162 enum RA_Flag ra_flag; ///< indicates where the size of ra units is stored |
| 160 int adapt_order; ///< adaptive order: 1 = on, 0 = off | 163 int adapt_order; ///< adaptive order: 1 = on, 0 = off |
| 161 int coef_table; ///< table index of Rice code parameters | 164 int coef_table; ///< table index of Rice code parameters |
| 169 int chan_config; ///< indicates that a chan_config_info field is present | 172 int chan_config; ///< indicates that a chan_config_info field is present |
| 170 int chan_sort; ///< channel rearrangement: 1 = on, 0 = off | 173 int chan_sort; ///< channel rearrangement: 1 = on, 0 = off |
| 171 int rlslms; ///< use "Recursive Least Square-Least Mean Square" predictor: 1 = on, 0 = off | 174 int rlslms; ///< use "Recursive Least Square-Least Mean Square" predictor: 1 = on, 0 = off |
| 172 int chan_config_info; ///< mapping of channels to loudspeaker locations. Unused until setting channel configuration is implemented. | 175 int chan_config_info; ///< mapping of channels to loudspeaker locations. Unused until setting channel configuration is implemented. |
| 173 int *chan_pos; ///< original channel positions | 176 int *chan_pos; ///< original channel positions |
| 177 int crc_enabled; ///< enable Cyclic Redundancy Checksum | |
| 174 } ALSSpecificConfig; | 178 } ALSSpecificConfig; |
| 175 | 179 |
| 176 | 180 |
| 177 typedef struct { | 181 typedef struct { |
| 178 int stop_flag; | 182 int stop_flag; |
| 186 | 190 |
| 187 typedef struct { | 191 typedef struct { |
| 188 AVCodecContext *avctx; | 192 AVCodecContext *avctx; |
| 189 ALSSpecificConfig sconf; | 193 ALSSpecificConfig sconf; |
| 190 GetBitContext gb; | 194 GetBitContext gb; |
| 195 DSPContext dsp; | |
| 196 const AVCRC *crc_table; | |
| 197 uint32_t crc_org; ///< CRC value of the original input data | |
| 198 uint32_t crc; ///< CRC value calculated from decoded data | |
| 191 unsigned int cur_frame_length; ///< length of the current frame to decode | 199 unsigned int cur_frame_length; ///< length of the current frame to decode |
| 192 unsigned int frame_id; ///< the frame ID / number of the current frame | 200 unsigned int frame_id; ///< the frame ID / number of the current frame |
| 193 unsigned int js_switch; ///< if true, joint-stereo decoding is enforced | 201 unsigned int js_switch; ///< if true, joint-stereo decoding is enforced |
| 194 unsigned int num_blocks; ///< number of blocks used in the current frame | 202 unsigned int num_blocks; ///< number of blocks used in the current frame |
| 195 unsigned int s_max; ///< maximum Rice parameter allowed in entropy coding | 203 unsigned int s_max; ///< maximum Rice parameter allowed in entropy coding |
| 209 ALSChannelData *chan_data_buffer; ///< contains channel data for all channels | 217 ALSChannelData *chan_data_buffer; ///< contains channel data for all channels |
| 210 int *reverted_channels; ///< stores a flag for each reverted channel | 218 int *reverted_channels; ///< stores a flag for each reverted channel |
| 211 int32_t *prev_raw_samples; ///< contains unshifted raw samples from the previous block | 219 int32_t *prev_raw_samples; ///< contains unshifted raw samples from the previous block |
| 212 int32_t **raw_samples; ///< decoded raw samples for each channel | 220 int32_t **raw_samples; ///< decoded raw samples for each channel |
| 213 int32_t *raw_buffer; ///< contains all decoded raw samples including carryover samples | 221 int32_t *raw_buffer; ///< contains all decoded raw samples including carryover samples |
| 222 uint8_t *crc_buffer; ///< buffer of byte order corrected samples used for CRC check | |
| 214 } ALSDecContext; | 223 } ALSDecContext; |
| 215 | 224 |
| 216 | 225 |
| 217 typedef struct { | 226 typedef struct { |
| 218 unsigned int block_length; ///< number of samples within the block | 227 unsigned int block_length; ///< number of samples within the block |
| 266 */ | 275 */ |
| 267 static av_cold int read_specific_config(ALSDecContext *ctx) | 276 static av_cold int read_specific_config(ALSDecContext *ctx) |
| 268 { | 277 { |
| 269 GetBitContext gb; | 278 GetBitContext gb; |
| 270 uint64_t ht_size; | 279 uint64_t ht_size; |
| 271 int i, config_offset, crc_enabled; | 280 int i, config_offset; |
| 272 MPEG4AudioConfig m4ac; | 281 MPEG4AudioConfig m4ac; |
| 273 ALSSpecificConfig *sconf = &ctx->sconf; | 282 ALSSpecificConfig *sconf = &ctx->sconf; |
| 274 AVCodecContext *avctx = ctx->avctx; | 283 AVCodecContext *avctx = ctx->avctx; |
| 275 uint32_t als_id, header_size, trailer_size; | 284 uint32_t als_id, header_size, trailer_size; |
| 276 | 285 |
| 295 avctx->channels = m4ac.channels; | 304 avctx->channels = m4ac.channels; |
| 296 skip_bits(&gb, 16); // number of channels already knwon | 305 skip_bits(&gb, 16); // number of channels already knwon |
| 297 skip_bits(&gb, 3); // skip file_type | 306 skip_bits(&gb, 3); // skip file_type |
| 298 sconf->resolution = get_bits(&gb, 3); | 307 sconf->resolution = get_bits(&gb, 3); |
| 299 sconf->floating = get_bits1(&gb); | 308 sconf->floating = get_bits1(&gb); |
| 300 skip_bits1(&gb); // skip msb_first | 309 sconf->msb_first = get_bits1(&gb); |
| 301 sconf->frame_length = get_bits(&gb, 16) + 1; | 310 sconf->frame_length = get_bits(&gb, 16) + 1; |
| 302 sconf->ra_distance = get_bits(&gb, 8); | 311 sconf->ra_distance = get_bits(&gb, 8); |
| 303 sconf->ra_flag = get_bits(&gb, 2); | 312 sconf->ra_flag = get_bits(&gb, 2); |
| 304 sconf->adapt_order = get_bits1(&gb); | 313 sconf->adapt_order = get_bits1(&gb); |
| 305 sconf->coef_table = get_bits(&gb, 2); | 314 sconf->coef_table = get_bits(&gb, 2); |
| 310 sconf->sb_part = get_bits1(&gb); | 319 sconf->sb_part = get_bits1(&gb); |
| 311 sconf->joint_stereo = get_bits1(&gb); | 320 sconf->joint_stereo = get_bits1(&gb); |
| 312 sconf->mc_coding = get_bits1(&gb); | 321 sconf->mc_coding = get_bits1(&gb); |
| 313 sconf->chan_config = get_bits1(&gb); | 322 sconf->chan_config = get_bits1(&gb); |
| 314 sconf->chan_sort = get_bits1(&gb); | 323 sconf->chan_sort = get_bits1(&gb); |
| 315 crc_enabled = get_bits1(&gb); | 324 sconf->crc_enabled = get_bits1(&gb); |
| 316 sconf->rlslms = get_bits1(&gb); | 325 sconf->rlslms = get_bits1(&gb); |
| 317 skip_bits(&gb, 5); // skip 5 reserved bits | 326 skip_bits(&gb, 5); // skip 5 reserved bits |
| 318 skip_bits1(&gb); // skip aux_data_enabled | 327 skip_bits1(&gb); // skip aux_data_enabled |
| 319 | 328 |
| 320 | 329 |
| 373 return -1; | 382 return -1; |
| 374 | 383 |
| 375 skip_bits_long(&gb, ht_size); | 384 skip_bits_long(&gb, ht_size); |
| 376 | 385 |
| 377 | 386 |
| 378 // skip the crc data | 387 // initialize CRC calculation |
| 379 if (crc_enabled) { | 388 if (sconf->crc_enabled) { |
| 380 if (get_bits_left(&gb) < 32) | 389 if (get_bits_left(&gb) < 32) |
| 381 return -1; | 390 return -1; |
| 382 | 391 |
| 383 skip_bits_long(&gb, 32); | 392 if (avctx->error_recognition >= FF_ER_CAREFUL) { |
| 393 ctx->crc_table = av_crc_get_table(AV_CRC_32_IEEE_LE); | |
| 394 ctx->crc = 0xFFFFFFFF; | |
| 395 ctx->crc_org = ~get_bits_long(&gb, 32); | |
| 396 } else | |
| 397 skip_bits_long(&gb, 32); | |
| 384 } | 398 } |
| 385 | 399 |
| 386 | 400 |
| 387 // no need to read the rest of ALSSpecificConfig (ra_unit_size & aux data) | 401 // no need to read the rest of ALSSpecificConfig (ra_unit_size & aux data) |
| 388 | 402 |
| 1434 if (ctx->avctx->bits_per_raw_sample <= 16) { | 1448 if (ctx->avctx->bits_per_raw_sample <= 16) { |
| 1435 INTERLEAVE_OUTPUT(16) | 1449 INTERLEAVE_OUTPUT(16) |
| 1436 } else { | 1450 } else { |
| 1437 INTERLEAVE_OUTPUT(32) | 1451 INTERLEAVE_OUTPUT(32) |
| 1438 } | 1452 } |
| 1453 | |
| 1454 // update CRC | |
| 1455 if (sconf->crc_enabled && avctx->error_recognition >= FF_ER_CAREFUL) { | |
| 1456 int swap = HAVE_BIGENDIAN != sconf->msb_first; | |
| 1457 | |
| 1458 if (ctx->avctx->bits_per_raw_sample == 24) { | |
| 1459 int32_t *src = data; | |
| 1460 | |
| 1461 for (sample = 0; | |
| 1462 sample < ctx->cur_frame_length * avctx->channels; | |
| 1463 sample++) { | |
| 1464 int32_t v; | |
| 1465 | |
| 1466 if (swap) | |
| 1467 v = bswap_32(src[sample]); | |
| 1468 else | |
| 1469 v = src[sample]; | |
| 1470 if (!HAVE_BIGENDIAN) | |
| 1471 v >>= 8; | |
| 1472 | |
| 1473 ctx->crc = av_crc(ctx->crc_table, ctx->crc, (uint8_t*)(&v), 3); | |
| 1474 } | |
| 1475 } else { | |
| 1476 uint8_t *crc_source; | |
| 1477 | |
| 1478 if (swap) { | |
| 1479 if (ctx->avctx->bits_per_raw_sample <= 16) { | |
| 1480 int16_t *src = (int16_t*) data; | |
| 1481 int16_t *dest = (int16_t*) ctx->crc_buffer; | |
| 1482 for (sample = 0; | |
| 1483 sample < ctx->cur_frame_length * avctx->channels; | |
| 1484 sample++) | |
| 1485 *dest++ = bswap_16(src[sample]); | |
| 1486 } else { | |
| 1487 ctx->dsp.bswap_buf((uint32_t*)ctx->crc_buffer, data, | |
| 1488 ctx->cur_frame_length * avctx->channels); | |
| 1489 } | |
| 1490 crc_source = ctx->crc_buffer; | |
| 1491 } else { | |
| 1492 crc_source = data; | |
| 1493 } | |
| 1494 | |
| 1495 ctx->crc = av_crc(ctx->crc_table, ctx->crc, crc_source, size); | |
| 1496 } | |
| 1497 | |
| 1498 | |
| 1499 // check CRC sums if this is the last frame | |
| 1500 if (ctx->cur_frame_length != sconf->frame_length && | |
| 1501 ctx->crc_org != ctx->crc) { | |
| 1502 av_log(avctx, AV_LOG_ERROR, "CRC error.\n"); | |
| 1503 } | |
| 1504 } | |
| 1505 | |
| 1439 | 1506 |
| 1440 bytes_read = invalid_frame ? buffer_size : | 1507 bytes_read = invalid_frame ? buffer_size : |
| 1441 (get_bits_count(&ctx->gb) + 7) >> 3; | 1508 (get_bits_count(&ctx->gb) + 7) >> 3; |
| 1442 | 1509 |
| 1443 return bytes_read; | 1510 return bytes_read; |
| 1604 // assign raw samples buffers | 1671 // assign raw samples buffers |
| 1605 ctx->raw_samples[0] = ctx->raw_buffer + sconf->max_order; | 1672 ctx->raw_samples[0] = ctx->raw_buffer + sconf->max_order; |
| 1606 for (c = 1; c < avctx->channels; c++) | 1673 for (c = 1; c < avctx->channels; c++) |
| 1607 ctx->raw_samples[c] = ctx->raw_samples[c - 1] + channel_size; | 1674 ctx->raw_samples[c] = ctx->raw_samples[c - 1] + channel_size; |
| 1608 | 1675 |
| 1676 // allocate crc buffer | |
| 1677 if (HAVE_BIGENDIAN != sconf->msb_first && sconf->crc_enabled && | |
| 1678 avctx->error_recognition >= FF_ER_CAREFUL) { | |
| 1679 ctx->crc_buffer = av_malloc(sizeof(*ctx->crc_buffer) * | |
| 1680 ctx->cur_frame_length * | |
| 1681 avctx->channels * | |
| 1682 (av_get_bits_per_sample_format(avctx->sample_fmt) >> 3)); | |
| 1683 if (!ctx->crc_buffer) { | |
| 1684 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n"); | |
| 1685 decode_end(avctx); | |
| 1686 return AVERROR(ENOMEM); | |
| 1687 } | |
| 1688 } | |
| 1689 | |
| 1690 dsputil_init(&ctx->dsp, avctx); | |
| 1691 | |
| 1609 return 0; | 1692 return 0; |
| 1610 } | 1693 } |
| 1611 | 1694 |
| 1612 | 1695 |
| 1613 /** Flushes (resets) the frame ID after seeking. | 1696 /** Flushes (resets) the frame ID after seeking. |
