OSDN Git Service

dcadec: Add some logging before returning on error
authorTim Walker <tdskywalker@gmail.com>
Fri, 29 Nov 2013 17:12:26 +0000 (18:12 +0100)
committerLuca Barbato <lu_zero@gentoo.org>
Sat, 30 Nov 2013 12:01:35 +0000 (13:01 +0100)
Based on a patch by Michael Niedermayer.

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
libavcodec/dcadec.c

index 50cbf2d..cf76f3f 100644 (file)
@@ -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);