Commit 7dc827b7 authored by Tim Walker's avatar Tim Walker Committed by Luca Barbato

dcadec: Add some logging before returning on error

Based on a patch by Michael Niedermayer.
Signed-off-by: 's avatarLuca Barbato <lu_zero@gentoo.org>
parent f058f384
...@@ -263,6 +263,8 @@ static const int8_t dca_channel_reorder_nolfe_xch[][9] = { ...@@ -263,6 +263,8 @@ static const int8_t dca_channel_reorder_nolfe_xch[][9] = {
#define DCA_BUFFER_PADDING_SIZE 1024 #define DCA_BUFFER_PADDING_SIZE 1024
#define DCA_NSYNCAUX 0x9A1105A0
/** Bit allocation */ /** Bit allocation */
typedef struct { typedef struct {
int offset; ///< code values offset int offset; ///< code values offset
...@@ -1283,6 +1285,7 @@ static int dca_filter_channels(DCAContext *s, int block_index) ...@@ -1283,6 +1285,7 @@ static int dca_filter_channels(DCAContext *s, int block_index)
static int dca_subframe_footer(DCAContext *s, int base_channel) static int dca_subframe_footer(DCAContext *s, int base_channel)
{ {
int in, out, aux_data_count, aux_data_end, reserved; int in, out, aux_data_count, aux_data_end, reserved;
uint32_t nsyncaux;
/* /*
* Unpack optional information * Unpack optional information
...@@ -1301,8 +1304,11 @@ static int dca_subframe_footer(DCAContext *s, int base_channel) ...@@ -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); 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; return AVERROR_INVALIDDATA;
}
if (get_bits1(&s->gb)) { // bAUXTimeStampFlag if (get_bits1(&s->gb)) { // bAUXTimeStampFlag
avpriv_request_sample(s->avctx, avpriv_request_sample(s->avctx,
...@@ -1314,7 +1320,8 @@ static int dca_subframe_footer(DCAContext *s, int base_channel) ...@@ -1314,7 +1320,8 @@ static int dca_subframe_footer(DCAContext *s, int base_channel)
} }
if ((s->core_downmix = get_bits1(&s->gb))) { 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: case 0:
s->core_downmix_amode = DCA_MONO; s->core_downmix_amode = DCA_MONO;
break; break;
...@@ -1337,13 +1344,20 @@ static int dca_subframe_footer(DCAContext *s, int base_channel) ...@@ -1337,13 +1344,20 @@ static int dca_subframe_footer(DCAContext *s, int base_channel)
s->core_downmix_amode = DCA_3F1R; s->core_downmix_amode = DCA_3F1R;
break; break;
default: default:
av_log(s->avctx, AV_LOG_ERROR,
"Invalid mode %d for embedded downmix coefficients\n",
am);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
for (out = 0; out < dca_channels[s->core_downmix_amode]; out++) { for (out = 0; out < dca_channels[s->core_downmix_amode]; out++) {
for (in = 0; in < s->prim_channels + !!s->lfe; in++) { for (in = 0; in < s->prim_channels + !!s->lfe; in++) {
uint16_t tmp = get_bits(&s->gb, 9); 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; return AVERROR_INVALIDDATA;
}
s->core_downmix_codes[in][out] = tmp; s->core_downmix_codes[in][out] = tmp;
} }
} }
...@@ -1353,9 +1367,11 @@ static int dca_subframe_footer(DCAContext *s, int base_channel) ...@@ -1353,9 +1367,11 @@ static int dca_subframe_footer(DCAContext *s, int base_channel)
skip_bits(&s->gb, 16); // nAUXCRC16 skip_bits(&s->gb, 16); // nAUXCRC16
// additional data (reserved, cf. ETSI TS 102 114 V1.4.1) // 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; return AVERROR_INVALIDDATA;
else if (reserved) { } else if (reserved) {
avpriv_request_sample(s->avctx, avpriv_request_sample(s->avctx,
"Core auxiliary data reserved content"); "Core auxiliary data reserved content");
skip_bits_long(&s->gb, reserved); skip_bits_long(&s->gb, reserved);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment