Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 12 Mar 2012 03:35:06 +0000 (04:35 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 12 Mar 2012 03:35:06 +0000 (04:35 +0100)
* qatar/master:
  dsicinvideo: validate buffer offset before copying pixels.
  cook: error out on quant_index values outside [-63, 63] range.
  mpc: pad mpc_CC/SCF[] tables to allow for negative indices.

Conflicts:
libavcodec/cook.c
libavcodec/dsicinav.c
libavcodec/mpc.c
libavcodec/mpc7.c
libavcodec/mpcdata.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/cook.c
libavcodec/dsicinav.c
libavcodec/mpcdata.h

diff --combined libavcodec/cook.c
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2003 Sascha Sommer
   * Copyright (c) 2005 Benjamin Larsson
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -280,8 -280,8 +280,8 @@@ static av_cold void init_cplscales_tabl
  static inline int decode_bytes(const uint8_t *inbuffer, uint8_t *out, int bytes)
  {
      static const uint32_t tab[4] = {
 -        AV_BE2NE32C(0x37c511f2), AV_BE2NE32C(0xf237c511),
 -        AV_BE2NE32C(0x11f237c5), AV_BE2NE32C(0xc511f237),
 +        AV_BE2NE32C(0x37c511f2U), AV_BE2NE32C(0xf237c511U),
 +        AV_BE2NE32C(0x11f237c5U), AV_BE2NE32C(0xc511f237U),
      };
      int i, off;
      uint32_t c;
@@@ -367,7 -367,7 +367,7 @@@ static void decode_gain_info(GetBitCont
   * @param quant_index_table pointer to the array
   */
  static int decode_envelope(COOKContext *q, COOKSubpacket *p,
-                             int *quant_index_table)
+                            int *quant_index_table)
  {
      int i, j, vlc_index;
  
          j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index - 1].table,
                       q->envelope_quant_index[vlc_index - 1].bits, 2);
          quant_index_table[i] = quant_index_table[i - 1] + j - 12; // differential encoding
-         if (quant_index_table[i] < -63 || quant_index_table[i] > 63) {
-             av_log(NULL, AV_LOG_ERROR, "quant_index_table value out of bounds\n");
+         if (quant_index_table[i] > 63 || quant_index_table[i] < -63) {
+             av_log(q->avctx, AV_LOG_ERROR,
+                    "Invalid quantizer %d at position %d, outside [-63, 63] range\n",
+                    quant_index_table[i], i);
              return AVERROR_INVALIDDATA;
          }
      }
   * @param category              pointer to the category array
   * @param category_index        pointer to the category_index array
   */
 -static void categorize(COOKContext *q, COOKSubpacket *p, int *quant_index_table,
 +static void categorize(COOKContext *q, COOKSubpacket *p, const int *quant_index_table,
                         int *category, int *category_index)
  {
      int exp_idx, bias, tmpbias1, tmpbias2, bits_left, num_bits, index, v, i, j;
@@@ -651,20 -652,16 +652,20 @@@ static int mono_decode(COOKContext *q, 
      int category_index[128];
      int quant_index_table[102];
      int category[128];
-     int ret, i;
 -    int res;
++    int res, i;
  
      memset(&category,       0, sizeof(category));
      memset(&category_index, 0, sizeof(category_index));
  
-     if ((ret = decode_envelope(q, p, quant_index_table)) < 0)
-         return ret;
+     if ((res = decode_envelope(q, p, quant_index_table)) < 0)
+         return res;
      q->num_vectors = get_bits(&q->gb, p->log2_numvector_size);
      categorize(q, p, quant_index_table, category, category_index);
      expand_category(q, category, category_index);
 +    for (i=0; i<p->total_subbands; i++) {
 +        if (category[i] > 7)
 +            return AVERROR_INVALIDDATA;
 +    }
      decode_vectors(q, p, category, quant_index_table, mlt_buffer);
  
      return 0;
@@@ -765,7 -762,7 +766,7 @@@ static void imlt_gain(COOKContext *q, f
   * @param decouple_tab      decoupling array
   *
   */
 -static void decouple_info(COOKContext *q, COOKSubpacket *p, int *decouple_tab)
 +static int decouple_info(COOKContext *q, COOKSubpacket *p, int *decouple_tab)
  {
      int i;
      int vlc    = get_bits1(&q->gb);
      int length = end - start + 1;
  
      if (start > end)
 -        return;
 +        return 0;
  
      if (vlc)
          for (i = 0; i < length; i++)
              decouple_tab[start + i] = get_vlc2(&q->gb, p->ccpl.table, p->ccpl.bits, 2);
      else
 -        for (i = 0; i < length; i++)
 -            decouple_tab[start + i] = get_bits(&q->gb, p->js_vlc_bits);
 +        for (i = 0; i < length; i++) {
 +            int v = get_bits(&q->gb, p->js_vlc_bits);
 +            if (v == (1<<p->js_vlc_bits)-1) {
 +                av_log(q->avctx, AV_LOG_ERROR, "decouple value too large\n");
 +                return AVERROR_INVALIDDATA;
 +            }
 +            decouple_tab[start + i] = v;
 +        }
 +    return 0;
  }
  
  /*
@@@ -825,9 -815,9 +826,9 @@@ static void decouple_float(COOKContext 
   * @param mlt_buffer2       pointer to right channel mlt coefficients
   */
  static int joint_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer1,
-                          float *mlt_buffer2)
+                         float *mlt_buffer2)
  {
-     int i, j, ret;
+     int i, j, res;
      int decouple_tab[SUBBAND_SIZE];
      float *decode_buffer = q->decode_buffer_0;
      int idx, cpl_tmp;
      /* Make sure the buffers are zeroed out. */
      memset(mlt_buffer1, 0, 1024 * sizeof(*mlt_buffer1));
      memset(mlt_buffer2, 0, 1024 * sizeof(*mlt_buffer2));
-     if ((ret = decouple_info(q, p, decouple_tab)) < 0)
-         return ret;
-     if ((ret = mono_decode(q, p, decode_buffer)) < 0)
-         return ret;
 -    decouple_info(q, p, decouple_tab);
++    if ((res = decouple_info(q, p, decouple_tab)) < 0)
++        return res;
+     if ((res = mono_decode(q, p, decode_buffer)) < 0)
+         return res;
 -
      /* The two channels are stored interleaved in decode_buffer. */
      for (i = 0; i < p->js_subband_start; i++) {
          for (j = 0; j < SUBBAND_SIZE; j++) {
          q->decouple(q, p, i, f1, f2, decode_buffer, mlt_buffer1, mlt_buffer2);
          idx = (1 << p->js_vlc_bits) - 1;
      }
      return 0;
  }
  
@@@ -938,10 -929,10 +940,10 @@@ static inline void mlt_compensate_outpu
   * @param outbuffer         pointer to the outbuffer
   */
  static int decode_subpacket(COOKContext *q, COOKSubpacket *p,
-                              const uint8_t *inbuffer, float *outbuffer)
+                             const uint8_t *inbuffer, float *outbuffer)
  {
      int sub_packet_size = p->size;
-     int ret;
+     int res;
      /* packet dump */
      // for (i = 0; i < sub_packet_size ; i++)
      //     av_log(q->avctx, AV_LOG_ERROR, "%02x", inbuffer[i]);
      decode_bytes_and_gain(q, p, inbuffer, &p->gains1);
  
      if (p->joint_stereo) {
-         if ((ret = joint_decode(q, p, q->decode_buffer_1, q->decode_buffer_2)) < 0)
-             return ret;
+         if ((res = joint_decode(q, p, q->decode_buffer_1, q->decode_buffer_2)) < 0)
+             return res;
      } else {
-         if ((ret = mono_decode(q, p, q->decode_buffer_1)) < 0)
-             return ret;
+         if ((res = mono_decode(q, p, q->decode_buffer_1)) < 0)
+             return res;
  
          if (p->num_channels == 2) {
              decode_bytes_and_gain(q, p, inbuffer + sub_packet_size / 2, &p->gains2);
-             if ((ret = mono_decode(q, p, q->decode_buffer_2)) < 0)
-                 return ret;
+             if ((res = mono_decode(q, p, q->decode_buffer_2)) < 0)
+                 return res;
          }
      }
  
          else
              mlt_compensate_output(q, q->decode_buffer_2, &p->gains2,
                                    p->mono_previous_buffer2, outbuffer, p->ch_idx + 1);
      return 0;
  }
  
diff --combined libavcodec/dsicinav.c
@@@ -2,20 -2,20 +2,20 @@@
   * Delphine Software International CIN Audio/Video Decoders
   * Copyright (c) 2006 Gregory Montoir (cyx@users.sourceforge.net)
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -95,7 -95,6 +95,7 @@@ static av_cold int cinvideo_decode_init
      cin->avctx = avctx;
      avctx->pix_fmt = PIX_FMT_PAL8;
  
 +    avcodec_get_frame_defaults(&cin->frame);
      cin->frame.data[0] = NULL;
  
      cin->bitmap_size = avctx->width * avctx->height;
@@@ -175,6 -174,7 +175,7 @@@ static int cin_decode_lzss(const unsign
              }
          }
      }
      return 0;
  }
  
@@@ -221,12 -221,12 +222,12 @@@ static int cinvideo_decode_frame(AVCode
          if (palette_colors_count > 256)
              return AVERROR_INVALIDDATA;
          for (i = 0; i < palette_colors_count; ++i) {
 -            cin->palette[i] = bytestream_get_le24(&buf);
 +            cin->palette[i] = 0xFF << 24 | bytestream_get_le24(&buf);
              bitmap_frame_size -= 3;
          }
      } else {
          for (i = 0; i < palette_colors_count; ++i) {
 -            cin->palette[buf[0]] = AV_RL24(buf+1);
 +            cin->palette[buf[0]] = 0xFF << 24 | AV_RL24(buf+1);
              buf += 4;
              bitmap_frame_size -= 4;
          }
diff --combined libavcodec/mpcdata.h
@@@ -2,34 -2,37 +2,35 @@@
   * Musepack decoder
   * Copyright (c) 2006 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #ifndef AVCODEC_MPCDATA_H
  #define AVCODEC_MPCDATA_H
  
- static const float mpc_CC[1+18] = {
-     111.285962475327f,
-     65536.0000, 21845.3333, 13107.2000, 9362.2857, 7281.7778, 4369.0667, 2114.0645,
+ static const float mpc_CC[18+1] = {
+     111.285962475327f, // 32768/2/255*sqrt(3)
+     65536.0000 /* this value is never used */,
+     21845.3333, 13107.2000, 9362.2857, 7281.7778, 4369.0667, 2114.0645,
      1040.2539, 516.0315, 257.0039, 128.2505, 64.0626, 32.0156, 16.0039, 8.0010,
      4.0002, 2.0001, 1.0000
  };
  
 -static const float mpc_SCF[128+6] = {
 -    920.016296386718750000, 766.355773925781250000, 638.359558105468750000,
 -    531.741149902343750000, 442.930114746093750000, 368.952209472656250000,
 +static const float mpc_SCF[256] = {
      307.330047607421875000, 255.999984741210937500, 213.243041992187500000, 177.627334594726562500,
      147.960128784179687500, 123.247924804687500000, 102.663139343261718750, 85.516410827636718750,
      71.233520507812500000, 59.336143493652343750, 49.425861358642578125, 41.170787811279296875,
      0.000000396931966407, 0.000000330636652279, 0.000000275413924555, 0.000000229414467867,
      0.000000191097811353, 0.000000159180785886, 0.000000132594522029, 0.000000110448674207,
      0.000000092001613439, 0.000000076635565449, 0.000000063835940978, 0.000000053174105119,
 -    0.000000044293003043, 0.000000036895215771, 0.000000030733001921, 0.000000025599996789
 +    0.000000044293003043, 0.000000036895215771, 0.000000030733001921, 0.000000025599996789,
 +    0.000000021324305018, 3689522167600.270019531250000000, 3073300627835.926757812500000000, 2560000000000.002929687500000000,
 +    2132430501800.519042968750000000, 1776273376956.721923828125000000, 1479601378343.250244140625000000, 1232479339720.794189453125000000,
 +    1026631459710.774291992187500000, 855164155779.391845703125000000, 712335206965.024780273437500000, 593361454233.829101562500000000,
 +    494258618594.112609863281250000, 411707872682.763122558593750000, 342944697476.612365722656250000, 285666302081.983886718750000000,
 +    237954506209.446411132812500000, 198211502766.368713378906250000, 165106349338.563323974609375000, 137530396629.095306396484375000,
 +    114560161209.611633300781250000, 95426399240.062576293945312500, 79488345475.196502685546875000, 66212254855.064872741699218750,
 +    55153528064.816276550292968750, 45941822471.611343383789062500, 38268649822.956413269042968750, 31877045369.216873168945312500,
 +    26552962442.420688629150390625, 22118104306.789615631103515625, 18423953228.829509735107421875, 15346796808.164905548095703125,
 +    12783585007.291271209716796875, 10648479137.463939666748046875, 8869977230.669750213623046875, 7388519530.061036109924316406,
 +    6154493909.785535812377929688, 5126574428.270387649536132812, 4270337375.232155323028564453, 3557108465.595236301422119141,
 +    2963002574.315670013427734375, 2468123854.056322574615478516, 2055899448.676229715347290039, 1712524489.450022459030151367,
 +    1426499787.649837732315063477, 1188246741.404872417449951172, 989786560.561257958412170410, 824473067.192597866058349609,
 +    686770123.591610312461853027, 572066234.090648531913757324, 476520111.962911486625671387, 396932039.637152194976806641,
 +    330636714.243810534477233887, 275413990.026798009872436523, 229414528.498330980539321899, 191097866.455478429794311523,
 +    159180827.835415601730346680, 132594551.788319095969200134, 110448697.892960876226425171, 92001629.793398514389991760,
 +    76635578.744844585657119751, 63835955.327594503760337830, 53174116.504741288721561432, 44293010.914454914629459381,
 +    36895221.676002673804759979, 30733006.278359245508909225, 25600000.000000011175870895, 21324305.018005173653364182,
 +    17762733.769567202776670456, 14796013.783432489261031151, 12324793.397207930684089661, 10266314.597107734531164169,
 +    8551641.557793911546468735, 7123352.069650243036448956, 5933614.542338287457823753, 4942586.185941123403608799,
 +    4117078.726827629376202822, 3429446.974766122177243233, 2856663.020819837693125010, 2379545.062094463035464287,
 +    1982115.027663686312735081, 1651063.493385632522404194, 1375303.966290952404960990, 1145601.612096115713939071,
 +    954263.992400625254958868, 794883.454751964658498764, 662122.548550648498348892, 551535.280648162588477135,
 +    459418.224716113239992410, 382686.498229563992936164, 318770.453692168579436839, 265529.624424206791445613,
 +    221181.043067896069260314, 184239.532288295013131574, 153467.968081648985389620, 127835.850072912653558888,
 +    106484.791374639346031472, 88699.772306697457679547, 73885.195300610314006917, 61544.939097855312866159,
 +    51265.744282703839417081, 42703.373752321524079889, 35571.084655952341563534, 29630.025743156678800005,
 +    24681.238540563208516687, 20558.994486762283486314, 17125.244894500214286381, 14264.997876498367986642,
 +    11882.467414048716818797, 9897.865605612574654515, 8244.730671925974093028, 6867.701235916098994494,
 +    5720.662340906482313585, 4765.201119629112326948, 3969.320396371519564127, 3306.367142438103201130,
 +    2754.139900267978191550, 2294.145284983308101801, 1910.978664554782881169, 1591.808278354154936096,
 +    1325.945517883190177599, 1104.486978929608085309, 920.016297933984674273, 766.355787448445425980,
 +    638.359553275944676898, 531.741165047412550848, 442.930109144548907807, 368.952216760026544762,
  };
  
  #endif /* AVCODEC_MPCDATA_H */