Merge commit 'e0f8be6413b6a8d334d6052e610af32935c310af'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 5 May 2013 10:29:56 +0000 (12:29 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 5 May 2013 10:31:03 +0000 (12:31 +0200)
* commit 'e0f8be6413b6a8d334d6052e610af32935c310af':
  avformat: Add AVPROBE_SCORE_EXTENSION define and use where appropriate

Conflicts:
libavformat/ac3dec.c
libavformat/avformat.h
libavformat/avs.c
libavformat/m4vdec.c
libavformat/mov.c
libavformat/mp3dec.c
libavformat/mpeg.c
libavformat/mpegvideodec.c
libavformat/psxstr.c
libavformat/pva.c
libavformat/utils.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
36 files changed:
1  2 
libavformat/aacdec.c
libavformat/ac3dec.c
libavformat/avformat.h
libavformat/avidec.c
libavformat/avs.c
libavformat/cavsvideodec.c
libavformat/dtsdec.c
libavformat/flacdec.c
libavformat/h261dec.c
libavformat/h263dec.c
libavformat/h264dec.c
libavformat/idcin.c
libavformat/img2dec.c
libavformat/m4vdec.c
libavformat/matroskadec.c
libavformat/mm.c
libavformat/mov.c
libavformat/mp3dec.c
libavformat/mpc8.c
libavformat/mpeg.c
libavformat/mpegvideodec.c
libavformat/mtv.c
libavformat/nsvdec.c
libavformat/omadec.c
libavformat/psxstr.c
libavformat/pva.c
libavformat/rtsp.c
libavformat/sierravmd.c
libavformat/spdifdec.c
libavformat/takdec.c
libavformat/tta.c
libavformat/utils.c
libavformat/vc1test.c
libavformat/vqf.c
libavformat/westwood_aud.c
libavformat/xa.c

Simple merge
@@@ -79,11 -57,31 +79,11 @@@ static int ac3_eac3_probe(AVProbeData *
      if(codec_id != expected_codec_id) return 0;
      // keep this in sync with mp3 probe, both need to avoid
      // issues with MPEG-files!
-     if   (first_frames>=4) return AVPROBE_SCORE_MAX/2+1;
-     else if(max_frames>200)return AVPROBE_SCORE_MAX/2;
-     else if(max_frames>=4) return AVPROBE_SCORE_MAX/4;
 -    if (first_frames >= 4) return AVPROBE_SCORE_EXTENSION + 1;
 -
 -    if (max_frames) {
 -        int pes = 0, i;
 -        unsigned int code = -1;
 -
 -#define VIDEO_ID 0x000001e0
 -#define AUDIO_ID 0x000001c0
 -        /* do a search for mpegps headers to be able to properly bias
 -         * towards mpegps if we detect this stream as both. */
 -        for (i = 0; i<p->buf_size; i++) {
 -            code = (code << 8) + p->buf[i];
 -            if ((code & 0xffffff00) == 0x100) {
 -                if     ((code & 0x1f0) == VIDEO_ID) pes++;
 -                else if((code & 0x1e0) == AUDIO_ID) pes++;
 -            }
 -        }
 -
 -        if (pes)
 -            max_frames = (max_frames + pes - 1) / pes;
 -    }
 -    if      (max_frames >  500) return AVPROBE_SCORE_EXTENSION;
 -    else if (max_frames >= 4)   return AVPROBE_SCORE_EXTENSION / 2;
 -    else if (max_frames >= 1)   return 1;
 -    else                        return 0;
++    if   (first_frames>=4) return AVPROBE_SCORE_EXTENSION + 1;
++    else if(max_frames>200)return AVPROBE_SCORE_EXTENSION;
++    else if(max_frames>=4) return AVPROBE_SCORE_EXTENSION/2;
 +    else if(max_frames>=1) return 1;
 +    else                   return 0;
  }
  
  #if CONFIG_AC3_DEMUXER
@@@ -337,8 -337,9 +337,10 @@@ typedef struct AVProbeData 
      int buf_size;       /**< Size of buf except extra allocated bytes */
  } AVProbeData;
  
- #define AVPROBE_SCORE_MAX 100               ///< maximum score, half of that is used for file-extension-based detection
 +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4)
+ #define AVPROBE_SCORE_EXTENSION  50 ///< score for file extension
+ #define AVPROBE_SCORE_MAX       100 ///< maximum score
  #define AVPROBE_PADDING_SIZE 32             ///< extra allocated bytes at the end of the probe buffer
  
  /// Demuxer will use avio_open, no opened file should be provided by the caller.
@@@ -828,9 -756,9 +828,9 @@@ static int avi_read_header(AVFormatCont
  }
  
  static int read_gab2_sub(AVStream *st, AVPacket *pkt) {
 -    if (!strcmp(pkt->data, "GAB2") && AV_RL16(pkt->data+5) == 2) {
 +    if (pkt->data && !strcmp(pkt->data, "GAB2") && AV_RL16(pkt->data+5) == 2) {
          uint8_t desc[256];
-         int score = AVPROBE_SCORE_MAX / 2, ret;
+         int score = AVPROBE_SCORE_EXTENSION, ret;
          AVIStream *ast = st->priv_data;
          AVInputFormat *sub_demuxer;
          AVRational time_base;
@@@ -50,7 -50,7 +50,7 @@@ static int avs_probe(AVProbeData * p
  
      d = p->buf;
      if (d[0] == 'w' && d[1] == 'W' && d[2] == 0x10 && d[3] == 0)
-         return 55;
 -        return AVPROBE_SCORE_EXTENSION;
++        return AVPROBE_SCORE_EXTENSION+5;
  
      return 0;
  }
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -180,12 -129,8 +180,12 @@@ static int img_read_probe(AVProbeData *
      if (p->filename && ff_guess_image2_codec(p->filename)) {
          if (av_filename_number_test(p->filename))
              return AVPROBE_SCORE_MAX;
 +        else if (is_glob(p->filename))
 +            return AVPROBE_SCORE_MAX;
 +        else if (av_match_ext(p->filename, "raw") || av_match_ext(p->filename, "gif"))
 +            return 5;
          else
-             return AVPROBE_SCORE_MAX / 2;
+             return AVPROBE_SCORE_EXTENSION;
      }
      return 0;
  }
@@@ -45,7 -45,7 +45,7 @@@ static int mpeg4video_probe(AVProbeDat
      }
  
      if (VOP >= VISO && VOP >= VOL && VO >= VOL && VOL > 0 && res==0)
-         return VOP+VO > 3 ? AVPROBE_SCORE_MAX/2 : AVPROBE_SCORE_MAX/4;
 -        return AVPROBE_SCORE_EXTENSION;
++        return VOP+VO > 3 ? AVPROBE_SCORE_EXTENSION : AVPROBE_SCORE_EXTENSION/2;
      return 0;
  }
  
Simple merge
Simple merge
@@@ -2883,16 -2625,7 +2883,16 @@@ static int mov_probe(AVProbeData *p
          case MKTAG('p','n','o','t'): /* detect movs with preview pics like ew.mov and april.mov */
          case MKTAG('u','d','t','a'): /* Packet Video PVAuthor adds this and a lot of more junk */
          case MKTAG('f','t','y','p'):
 -            return AVPROBE_SCORE_MAX;
 +            if (AV_RB32(p->buf+offset) < 8 &&
 +                (AV_RB32(p->buf+offset) != 1 ||
 +                 offset + 12 > (unsigned int)p->buf_size ||
 +                 AV_RB64(p->buf+offset + 8) == 0)) {
-                 score = FFMAX(score, AVPROBE_SCORE_MAX - 50);
++                score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
 +            } else {
 +                score = AVPROBE_SCORE_MAX;
 +            }
 +            offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset;
 +            break;
          /* those are more common words, so rate then a bit less */
          case MKTAG('e','d','i','w'): /* xdcam files have reverted first tags */
          case MKTAG('w','i','d','e'):
          case MKTAG('s','k','i','p'):
          case MKTAG('u','u','i','d'):
          case MKTAG('p','r','f','l'):
 -            offset = AV_RB32(p->buf+offset) + offset;
              /* if we only find those cause probedata is too small at least rate them */
-             score  = FFMAX(score, AVPROBE_SCORE_MAX - 50);
 -            score = AVPROBE_SCORE_EXTENSION;
++            score  = FFMAX(score, AVPROBE_SCORE_EXTENSION);
 +            offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset;
              break;
          default:
 -            /* unrecognized tag */
 -            return score;
 +            offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset;
          }
      }
 +    if(score > AVPROBE_SCORE_MAX - 50 && moov_offset != -1) {
 +        /* moov atom in the header - we should make sure that this is not a
 +         * MOV-packed MPEG-PS */
 +        offset = moov_offset;
 +
 +        while(offset < (p->buf_size - 16)){ /* Sufficient space */
 +               /* We found an actual hdlr atom */
 +            if(AV_RL32(p->buf + offset     ) == MKTAG('h','d','l','r') &&
 +               AV_RL32(p->buf + offset +  8) == MKTAG('m','h','l','r') &&
 +               AV_RL32(p->buf + offset + 12) == MKTAG('M','P','E','G')){
 +                av_log(NULL, AV_LOG_WARNING, "Found media data tag MPEG indicating this is a MOV-packed MPEG-PS.\n");
 +                /* We found a media handler reference atom describing an
 +                 * MPEG-PS-in-MOV, return a
 +                 * low score to force expanding the probe window until
 +                 * mpegps_probe finds what it needs */
 +                return 5;
 +            }else
 +                /* Keep looking */
 +                offset+=2;
 +        }
 +    }
 +
 +    return score;
  }
  
  // must be done after parsing all trak because there's no order requirement
@@@ -76,13 -73,31 +76,13 @@@ static int mp3_read_probe(AVProbeData *
      }
      // keep this in sync with ac3 probe, both need to avoid
      // issues with MPEG-files!
-     if   (first_frames>=4) return AVPROBE_SCORE_MAX/2+1;
-     else if(max_frames>200)return AVPROBE_SCORE_MAX/2;
-     else if(max_frames>=4) return AVPROBE_SCORE_MAX/4;
 -    if (first_frames >= 4) return AVPROBE_SCORE_EXTENSION + 1;
 -
 -    if (max_frames) {
 -        int pes = 0, i;
 -        unsigned int code = -1;
 -
 -#define VIDEO_ID 0x000001e0
 -#define AUDIO_ID 0x000001c0
 -        /* do a search for mpegps headers to be able to properly bias
 -         * towards mpegps if we detect this stream as both. */
 -        for (i = 0; i<p->buf_size; i++) {
 -            code = (code << 8) + p->buf[i];
 -            if ((code & 0xffffff00) == 0x100) {
 -                if     ((code & 0x1f0) == VIDEO_ID) pes++;
 -                else if((code & 0x1e0) == AUDIO_ID) pes++;
 -            }
 -        }
 -
 -        if (pes)
 -            max_frames = (max_frames + pes - 1) / pes;
 -    }
 -    if      (max_frames >  500) return AVPROBE_SCORE_EXTENSION;
 -    else if (max_frames >= 4)   return AVPROBE_SCORE_EXTENSION / 2;
 -    else if (max_frames >= 1)   return 1;
 -    else                        return 0;
++    if   (first_frames>=4) return AVPROBE_SCORE_EXTENSION + 1;
++    else if(max_frames>200)return AVPROBE_SCORE_EXTENSION;
++    else if(max_frames>=4) return AVPROBE_SCORE_EXTENSION / 2;
 +    else if(ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC) && 2*ff_id3v2_tag_len(buf0) >= p->buf_size)
-                            return AVPROBE_SCORE_MAX/8;
++                           return AVPROBE_SCORE_EXTENSION / 4;
 +    else if(max_frames>=1) return 1;
 +    else                   return 0;
  //mpegps_mp3_unrecognized_format.mpg has max_frames=3
  }
  
Simple merge
@@@ -88,15 -81,15 +88,15 @@@ static int mpegps_probe(AVProbeData *p
          }
      }
  
 -    if(vid+audio > invalid)     /* invalid VDR files nd short PES streams */
 +    if(vid+audio > invalid+1)     /* invalid VDR files nd short PES streams */
-         score= AVPROBE_SCORE_MAX/4;
+         score = AVPROBE_SCORE_EXTENSION / 2;
  
      if(sys>invalid && sys*9 <= pspack*10)
-         return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
 -        return pspack > 2 ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg
++        return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg
      if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
-         return pspack > 2 ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
+         return pspack > 2 ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg
      if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048 && vid + audio > invalid) /* PES stream */
-         return (audio > 12 || vid > 3 + 2*invalid) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4;
 -        return (audio > 12 || vid > 3) ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2;
++        return (audio > 12 || vid > 3 + 2*invalid) ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2;
  
      //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
      //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
@@@ -44,28 -43,15 +44,28 @@@ static int mpegvideo_probe(AVProbeData 
              switch(code){
              case     SEQ_START_CODE:   seq++; break;
              case PICTURE_START_CODE:   pic++; break;
 -            case   SLICE_START_CODE: slice++; break;
              case    PACK_START_CODE: pspack++; break;
 +            case              0x1b6:
 +                                        res++; break;
              }
 -            if     ((code & 0x1f0) == VIDEO_ID)   pes++;
 -            else if((code & 0x1e0) == AUDIO_ID)   pes++;
 +            if (code >= SLICE_START_CODE && code <= 0x1af) {
 +                if (last >= SLICE_START_CODE && last <= 0x1af) {
 +                    if (code >= last) slice++;
 +                    else              sicle++;
 +                }else{
 +                    if (code == SLICE_START_CODE) slice++;
 +                    else                          sicle++;
 +                }
 +            }
 +            if     ((code & 0x1f0) == VIDEO_ID)   vpes++;
 +            else if((code & 0x1e0) == AUDIO_ID)   apes++;
 +            last = code;
          }
      }
 -    if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
 -        return pic>1 ? AVPROBE_SCORE_EXTENSION + 1 : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg
 +    if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !apes && !res && slice > sicle) {
-         if(vpes) return AVPROBE_SCORE_MAX/8;
-         else     return pic>1 ? AVPROBE_SCORE_MAX/2+1 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
++        if(vpes) return AVPROBE_SCORE_EXTENSION / 4;
++        else     return pic>1 ? AVPROBE_SCORE_EXTENSION + 1 : AVPROBE_SCORE_EXTENSION / 2; // +1 for .mpg
 +    }
      return 0;
  }
  
Simple merge
Simple merge
Simple merge
@@@ -83,52 -81,20 +83,52 @@@ static int str_probe(AVProbeData *p
          sector += RIFF_HEADER_SIZE;
      }
  
 -    /* look for CD sync header (00, 0xFF x 10, 00) */
 -    if (memcmp(sector,sync_header,sizeof(sync_header)))
 -        return 0;
 +    while (end - sector >= RAW_CD_SECTOR_SIZE) {
 +        /* look for CD sync header (00, 0xFF x 10, 00) */
 +        if (memcmp(sector,sync_header,sizeof(sync_header)))
 +            return 0;
  
 -    if(sector[0x11] >= 32)
 -        return 0;
 -    if(   (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_VIDEO
 -       && (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_AUDIO
 -       && (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_DATA)
 -        return 0;
 +        if (sector[0x11] >= 32)
 +            return 0;
 +
 +        switch (sector[0x12] & CDXA_TYPE_MASK) {
 +        case CDXA_TYPE_DATA:
 +        case CDXA_TYPE_VIDEO: {
 +                int current_sector = AV_RL16(&sector[0x1C]);
 +                int sector_count   = AV_RL16(&sector[0x1E]);
 +                int frame_size = AV_RL32(&sector[0x24]);
 +
 +                if(!(   frame_size>=0
 +                     && current_sector < sector_count
 +                     && sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){
 +                    return 0;
 +                }
  
 +                /*st->codec->width      = AV_RL16(&sector[0x28]);
 +                st->codec->height     = AV_RL16(&sector[0x2A]);*/
 +
 +//                 if (current_sector == sector_count-1) {
 +                    vid++;
 +//                 }
 +
 +            }
 +            break;
 +        case CDXA_TYPE_AUDIO:
 +            if(sector[0x13]&0x2A)
 +                return 0;
 +            aud++;
 +            break;
 +        default:
 +            if(sector[0x12] & CDXA_TYPE_MASK)
 +                return 0;
 +        }
 +        sector += RAW_CD_SECTOR_SIZE;
 +    }
      /* MPEG files (like those ripped from VCDs) can also look like this;
       * only return half certainty */
-     if(vid+aud > 3)  return 50;
 -    return AVPROBE_SCORE_EXTENSION;
++    if(vid+aud > 3)  return AVPROBE_SCORE_EXTENSION;
 +    else if(vid+aud) return 1;
 +    else             return 0;
  }
  
  static int str_read_header(AVFormatContext *s)
@@@ -32,26 -32,13 +32,26 @@@ typedef struct 
      int continue_pes;
  } PVAContext;
  
 +static int pva_check(const uint8_t *p) {
 +    int length = AV_RB16(p + 6);
 +    if (AV_RB16(p) != PVA_MAGIC || !p[2] || p[2] > 2 || p[4] != 0x55 ||
 +        (p[5] & 0xe0) || length > PVA_MAX_PAYLOAD_LENGTH)
 +        return -1;
 +    return length + 8;
 +}
 +
  static int pva_probe(AVProbeData * pd) {
 -    unsigned char *buf = pd->buf;
 +    const unsigned char *buf = pd->buf;
 +    int len = pva_check(buf);
 +
 +    if (len < 0)
 +        return 0;
  
 -    if (AV_RB16(buf) == PVA_MAGIC && buf[2] && buf[2] < 3 && buf[4] == 0x55)
 +    if (pd->buf_size >= len + 8 &&
 +        pva_check(buf + len) >= 0)
-         return AVPROBE_SCORE_MAX / 2;
+         return AVPROBE_SCORE_EXTENSION;
  
 -    return 0;
 +    return AVPROBE_SCORE_MAX / 4;
  }
  
  static int pva_read_header(AVFormatContext *s) {
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -375,22 -307,34 +375,22 @@@ AVInputFormat *av_probe_input_format3(A
          score = 0;
          if (fmt1->read_probe) {
              score = fmt1->read_probe(&lpd);
-                 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
 +            if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
++                score = FFMAX(score, nodat ? AVPROBE_SCORE_EXTENSION / 2 - 1 : 1);
          } else if (fmt1->extensions) {
              if (av_match_ext(lpd.filename, fmt1->extensions)) {
-                 score = 50;
+                 score = AVPROBE_SCORE_EXTENSION;
              }
          }
 -        if (score > *score_max) {
 -            *score_max = score;
 +        if (score > score_max) {
 +            score_max = score;
              fmt = fmt1;
 -        }else if (score == *score_max)
 +        }else if (score == score_max)
              fmt = NULL;
      }
 -
 -    /* a hack for files with huge id3v2 tags -- try to guess by file extension. */
 -    if (!fmt && is_opened && *score_max < AVPROBE_SCORE_EXTENSION / 2) {
 -        while ((fmt = av_iformat_next(fmt)))
 -            if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
 -                *score_max = AVPROBE_SCORE_EXTENSION / 2;
 -                break;
 -            }
 -    }
 -
 -    if (!fmt && id3 && *score_max < AVPROBE_SCORE_EXTENSION / 2 - 1) {
 -        while ((fmt = av_iformat_next(fmt)))
 -            if (fmt->extensions && av_match_ext("mp3", fmt->extensions)) {
 -                *score_max = AVPROBE_SCORE_EXTENSION / 2 - 1;
 -                break;
 -            }
 -    }
 +    if(nodat)
-         score_max = FFMIN(AVPROBE_SCORE_MAX/4-1, score_max);
++        score_max = FFMIN(AVPROBE_SCORE_EXTENSION / 2 - 1, score_max);
 +    *score_ret= score_max;
  
      return fmt;
  }
Simple merge
Simple merge
Simple merge
Simple merge