Merge commit '955aec3c7c7be39b659197e1ec379a09f2b7c41c'
authorHendrik Leppkes <h.leppkes@gmail.com>
Fri, 1 Jan 2016 15:47:27 +0000 (16:47 +0100)
committerHendrik Leppkes <h.leppkes@gmail.com>
Fri, 1 Jan 2016 15:47:27 +0000 (16:47 +0100)
* commit '955aec3c7c7be39b659197e1ec379a09f2b7c41c':
  mpegaudiodecheader: check the header in avpriv_mpegaudio_decode_header

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
libavcodec/libmp3lame.c
libavcodec/mpegaudiodec_template.c
libavcodec/mpegaudiodecheader.c
libavformat/mp3dec.c
libavformat/mp3enc.c

Simple merge
@@@ -1668,16 -1631,12 +1668,15 @@@ static int decode_frame(AVCodecContext 
          return AVERROR_INVALIDDATA;
  
      header = AV_RB32(buf);
 -
 +    if (header>>8 == AV_RB32("TAG")>>8) {
 +        av_log(avctx, AV_LOG_DEBUG, "discarding ID3 tag\n");
 +        return buf_size;
 +    }
-     if (ff_mpa_check_header(header) < 0) {
+     ret = avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header);
+     if (ret < 0) {
          av_log(avctx, AV_LOG_ERROR, "Header missing\n");
          return AVERROR_INVALIDDATA;
-     }
-     if (avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header) == 1) {
+     } else if (ret == 1) {
          /* free format: prepare to compute frame size */
          s->frame_size = -1;
          return AVERROR_INVALIDDATA;
@@@ -1954,13 -1902,10 +1952,12 @@@ static int decode_frame_mp3on4(AVCodecC
          }
          header = (AV_RB32(buf) & 0x000fffff) | s->syncword; // patch header
  
-         if (ff_mpa_check_header(header) < 0) {
+         ret = avpriv_mpegaudio_decode_header((MPADecodeHeader *)m, header);
 -        if (ret < 0) // Bad header, discard block
 -            break;
++        if (ret < 0) {
 +            av_log(avctx, AV_LOG_ERROR, "Bad header, discard block\n");
 +            return AVERROR_INVALIDDATA;
 +        }
  
-         avpriv_mpegaudio_decode_header((MPADecodeHeader *)m, header);
          if (ch + m->nb_channels > avctx->channels ||
              s->coff[fr] + m->nb_channels > avctx->channels) {
              av_log(avctx, AV_LOG_ERROR, "frame channel count exceeds codec "
Simple merge
@@@ -82,14 -71,12 +82,11 @@@ static int mp3_read_probe(AVProbeData *
  
      for(; buf < end; buf= buf2+1) {
          buf2 = buf;
-         if(ff_mpa_check_header(AV_RB32(buf2)))
-             continue;
--
          for(frames = 0; buf2 < end; frames++) {
 +            int dummy;
              header = AV_RB32(buf2);
 -            fsize = avpriv_mpa_decode_header(avctx, header, &sample_rate,
 -                                             &sample_rate, &sample_rate,
 -                                             &sample_rate);
 +            fsize = avpriv_mpa_decode_header(avctx, header,
 +                                             &dummy, &dummy, &dummy, &dummy);
              if(fsize < 0)
                  break;
              buf2 += fsize;
@@@ -307,43 -304,23 +307,44 @@@ static int mp3_write_audio_packet(AVFor
  {
      MP3Context  *mp3 = s->priv_data;
  
 -    if (mp3->xing_offset && pkt->size >= 4) {
 -        MPADecodeHeader c;
 +    if (pkt->data && pkt->size >= 4) {
 +        MPADecodeHeader mpah;
+         int ret;
 +        int av_unused base;
          uint32_t h;
  
          h = AV_RB32(pkt->data);
-         if (ff_mpa_check_header(h) == 0) {
-             avpriv_mpegaudio_decode_header(&mpah, h);
 -        ret = avpriv_mpegaudio_decode_header(&c, h);
++        ret = avpriv_mpegaudio_decode_header(&mpah, h);
+         if (ret >= 0) {
              if (!mp3->initial_bitrate)
 -                mp3->initial_bitrate = c.bit_rate;
 -            if ((c.bit_rate == 0) || (mp3->initial_bitrate != c.bit_rate))
 +                mp3->initial_bitrate = mpah.bit_rate;
 +            if ((mpah.bit_rate == 0) || (mp3->initial_bitrate != mpah.bit_rate))
                  mp3->has_variable_bitrate = 1;
 +        } else {
 +            av_log(s, AV_LOG_WARNING, "Audio packet of size %d (starting with %08X...) "
 +                   "is invalid, writing it anyway.\n", pkt->size, h);
          }
  
 -        mp3_xing_add_frame(mp3, pkt);
 +#ifdef FILTER_VBR_HEADERS
 +        /* filter out XING and INFO headers. */
 +        base = 4 + xing_offtbl[mpah.lsf == 1][mpah.nb_channels == 1];
 +
 +        if (base + 4 <= pkt->size) {
 +            uint32_t v = AV_RB32(pkt->data + base);
 +
 +            if (MKBETAG('X','i','n','g') == v || MKBETAG('I','n','f','o') == v)
 +                return 0;
 +        }
 +
 +        /* filter out VBRI headers. */
 +        base = 4 + 32;
 +
 +        if (base + 4 <= pkt->size && MKBETAG('V','B','R','I') == AV_RB32(pkt->data + base))
 +            return 0;
 +#endif
  
          if (mp3->xing_offset) {
 +            mp3_xing_add_frame(mp3, pkt);
              mp3->audio_size += pkt->size;
              mp3->audio_crc   = av_crc(av_crc_get_table(AV_CRC_16_ANSI_LE),
                                        mp3->audio_crc, pkt->data, pkt->size);