From 7dc827b7091b1ca85508b536fa776b49f363b0f4 Mon Sep 17 00:00:00 2001 From: Tim Walker Date: Fri, 29 Nov 2013 18:12:26 +0100 Subject: dcadec: Add some logging before returning on error Based on a patch by Michael Niedermayer. Signed-off-by: Luca Barbato --- libavcodec/dcadec.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'libavcodec/dcadec.c') diff --git a/libavcodec/dcadec.c b/libavcodec/dcadec.c index 50cbf2d116..cf76f3f4a4 100644 --- a/libavcodec/dcadec.c +++ b/libavcodec/dcadec.c @@ -263,6 +263,8 @@ static const int8_t dca_channel_reorder_nolfe_xch[][9] = { #define DCA_BUFFER_PADDING_SIZE 1024 +#define DCA_NSYNCAUX 0x9A1105A0 + /** Bit allocation */ typedef struct { int offset; ///< code values offset @@ -1283,6 +1285,7 @@ static int dca_filter_channels(DCAContext *s, int block_index) static int dca_subframe_footer(DCAContext *s, int base_channel) { int in, out, aux_data_count, aux_data_end, reserved; + uint32_t nsyncaux; /* * Unpack optional information @@ -1301,8 +1304,11 @@ static int dca_subframe_footer(DCAContext *s, int base_channel) aux_data_end = 8 * aux_data_count + get_bits_count(&s->gb); - if (get_bits_long(&s->gb, 32) != 0x9A1105A0) // nSYNCAUX + if ((nsyncaux = get_bits_long(&s->gb, 32)) != DCA_NSYNCAUX) { + av_log(s->avctx, AV_LOG_ERROR, "nSYNCAUX mismatch %#"PRIx32"\n", + nsyncaux); return AVERROR_INVALIDDATA; + } if (get_bits1(&s->gb)) { // bAUXTimeStampFlag avpriv_request_sample(s->avctx, @@ -1314,7 +1320,8 @@ static int dca_subframe_footer(DCAContext *s, int base_channel) } if ((s->core_downmix = get_bits1(&s->gb))) { - switch (get_bits(&s->gb, 3)) { + int am = get_bits(&s->gb, 3); + switch (am) { case 0: s->core_downmix_amode = DCA_MONO; break; @@ -1337,13 +1344,20 @@ static int dca_subframe_footer(DCAContext *s, int base_channel) s->core_downmix_amode = DCA_3F1R; break; default: + av_log(s->avctx, AV_LOG_ERROR, + "Invalid mode %d for embedded downmix coefficients\n", + am); return AVERROR_INVALIDDATA; } for (out = 0; out < dca_channels[s->core_downmix_amode]; out++) { for (in = 0; in < s->prim_channels + !!s->lfe; in++) { uint16_t tmp = get_bits(&s->gb, 9); - if ((tmp & 0xFF) > 241) + if ((tmp & 0xFF) > 241) { + av_log(s->avctx, AV_LOG_ERROR, + "Invalid downmix coefficient code %"PRIu16"\n", + tmp); return AVERROR_INVALIDDATA; + } s->core_downmix_codes[in][out] = tmp; } } @@ -1353,9 +1367,11 @@ static int dca_subframe_footer(DCAContext *s, int base_channel) skip_bits(&s->gb, 16); // nAUXCRC16 // additional data (reserved, cf. ETSI TS 102 114 V1.4.1) - if ((reserved = (aux_data_end - get_bits_count(&s->gb))) < 0) + if ((reserved = (aux_data_end - get_bits_count(&s->gb))) < 0) { + av_log(s->avctx, AV_LOG_ERROR, + "Overread auxiliary data by %d bits\n", -reserved); return AVERROR_INVALIDDATA; - else if (reserved) { + } else if (reserved) { avpriv_request_sample(s->avctx, "Core auxiliary data reserved content"); skip_bits_long(&s->gb, reserved); -- cgit v1.2.3