Merge remote-tracking branch 'qatar/master'
[ffmpeg.git] / libavcodec / qdm2.c
index b9529e7701858e64b0d6444631ad8038304b2e05..921f322c4a344a664423a7085d9b4f94daae4a4e 100644 (file)
@@ -532,8 +532,8 @@ static void build_sb_samples_from_noise(QDM2Context *q, int sb)
  * @param channels         number of channels
  * @param coding_method    q->coding_method[0][0][0]
  */
-static void fix_coding_method_array(int sb, int channels,
-                                    sb_int8_array coding_method)
+static int fix_coding_method_array(int sb, int channels,
+                                   sb_int8_array coding_method)
 {
     int j, k;
     int ch;
@@ -541,6 +541,8 @@ static void fix_coding_method_array(int sb, int channels,
 
     for (ch = 0; ch < channels; ch++) {
         for (j = 0; j < 64; ) {
+            if (coding_method[ch][sb][j] < 8)
+                return -1;
             if ((coding_method[ch][sb][j] - 8) > 22) {
                 run      = 1;
                 case_val = 8;
@@ -586,6 +588,7 @@ static void fix_coding_method_array(int sb, int channels,
             j += run;
         }
     }
+    return 0;
 }
 
 /**
@@ -844,16 +847,16 @@ static int synthfilt_build_sb_samples(QDM2Context *q, GetBitContext *gb,
                 for (j = 0; j < 16; j++)
                     sign_bits[j] = get_bits1 (gb);
 
-            if (q->coding_method[0][sb][0] <= 0) {
-                av_log(NULL, AV_LOG_ERROR, "coding method invalid\n");
-                return AVERROR_INVALIDDATA;
-            }
-
             for (j = 0; j < 64; j++)
                 if (q->coding_method[1][sb][j] > q->coding_method[0][sb][j])
                     q->coding_method[0][sb][j] = q->coding_method[1][sb][j];
 
-            fix_coding_method_array(sb, q->nb_channels, q->coding_method);
+            if (fix_coding_method_array(sb, q->nb_channels,
+                                            q->coding_method)) {
+                av_log(NULL, AV_LOG_ERROR, "coding method invalid\n");
+                build_sb_samples_from_noise(q, sb);
+                continue;
+            }
             channels = 1;
         }