Merge commit '49568851bf1700e3d9ea9cda29208d0df3c2c38b'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 12 Sep 2013 11:30:44 +0000 (13:30 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 12 Sep 2013 11:31:59 +0000 (13:31 +0200)
* commit '49568851bf1700e3d9ea9cda29208d0df3c2c38b':
  shorten: Use a checked bytestream reader for the wave header

Conflicts:
libavcodec/shorten.c

See: 5e9a56a0350c518cd4b38845aff49d41a9c952ae
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/shorten.c

@@@ -207,11 -200,13 +207,13 @@@ static int init_offset(ShortenContext *
  static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
                                int header_size)
  {
 -    int len;
 +    int len, bps;
      short wave_format;
-     const uint8_t *end= header + header_size;
+     GetByteContext gb;
  
-     if (bytestream_get_le32(&header) != MKTAG('R', 'I', 'F', 'F')) {
+     bytestream2_init(&gb, header, header_size);
+     if (bytestream2_get_le32(&gb) != MKTAG('R', 'I', 'F', 'F')) {
          av_log(avctx, AV_LOG_ERROR, "missing RIFF tag\n");
          return AVERROR_INVALIDDATA;
      }
          return AVERROR_INVALIDDATA;
      }
  
-     while (bytestream_get_le32(&header) != MKTAG('f', 'm', 't', ' ')) {
-         len     = bytestream_get_le32(&header);
-         if (len<0 || end - header - 8 < len)
+     while (bytestream2_get_le32(&gb) != MKTAG('f', 'm', 't', ' ')) {
+         len = bytestream2_get_le32(&gb);
++        if (len<0 || bytestream2_get_bytes_left(&gb) - 8 < len)
 +            return AVERROR_INVALIDDATA;
-         header += len;
+         bytestream2_skip(&gb, len);
      }
-     len = bytestream_get_le32(&header);
+     len = bytestream2_get_le32(&gb);
  
      if (len < 16) {
          av_log(avctx, AV_LOG_ERROR, "fmt chunk was too short\n");
          return AVERROR(ENOSYS);
      }
  
-     header += 2;        // skip channels    (already got from shorten header)
-     avctx->sample_rate = bytestream_get_le32(&header);
-     header += 4;        // skip bit rate    (represents original uncompressed bit rate)
-     header += 2;        // skip block align (not needed)
-     bps     = bytestream_get_le16(&header);
+     bytestream2_skip(&gb, 2); // skip channels    (already got from shorten header)
+     avctx->sample_rate = bytestream2_get_le32(&gb);
+     bytestream2_skip(&gb, 4); // skip bit rate    (represents original uncompressed bit rate)
+     bytestream2_skip(&gb, 2); // skip block align (not needed)
 -    avctx->bits_per_coded_sample = bytestream2_get_le16(&gb);
++    bps = bytestream2_get_le16(&gb);
 +    avctx->bits_per_coded_sample = bps;
  
 -    if (avctx->bits_per_coded_sample != 16) {
 -        av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample\n");
 +    if (bps != 16 && bps != 8) {
 +        av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample: %d\n", bps);
          return AVERROR(ENOSYS);
      }