Merge commit '1509c018bd5b054a2354e20021ccbac9c934d213'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 11 Feb 2015 00:59:14 +0000 (01:59 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 11 Feb 2015 00:59:14 +0000 (01:59 +0100)
* commit '1509c018bd5b054a2354e20021ccbac9c934d213':
  mpegts: relax restrictions on matching the packet start in read_header

Conflicts:
libavformat/mpegts.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/mpegts.c

@@@ -518,20 -425,20 +518,22 @@@ static void mpegts_close_filter(MpegTSC
      ts->pids[pid] = NULL;
  }
  
- static int analyze(const uint8_t *buf, int size, int packet_size, int *index)
+ static int analyze(const uint8_t *buf, int size, int packet_size, int *index,
+                    int probe)
  {
      int stat[TS_MAX_PACKET_SIZE];
 +    int stat_all = 0;
      int i;
 -    int x = 0;
      int best_score = 0;
  
 -    memset(stat, 0, packet_size * sizeof(int));
 +    memset(stat, 0, packet_size * sizeof(*stat));
  
 -    for (x = i = 0; i < size - 3; i++) {
 +    for (i = 0; i < size - 3; i++) {
-         if (buf[i] == 0x47 && !(buf[i + 1] & 0x80) && buf[i + 3] != 0x47) {
+         if (buf[i] == 0x47 &&
 -            (!probe || (!(buf[i + 1] & 0x80) && (buf[i + 3] & 0x30)))) {
++            (!probe || (!(buf[i + 1] & 0x80) && buf[i + 3] != 0x47))) {
 +            int x = i % packet_size;
              stat[x]++;
 +            stat_all++;
              if (stat[x] > best_score) {
                  best_score = stat[x];
                  if (index)
@@@ -2392,23 -1987,23 +2394,23 @@@ static int mpegts_probe(AVProbeData *p
      if (check_count < CHECK_COUNT)
          return AVERROR_INVALIDDATA;
  
 -    score = analyze(p->buf, TS_PACKET_SIZE * check_count,
 -                    TS_PACKET_SIZE, NULL, 1) * CHECK_COUNT / check_count;
 -    dvhs_score = analyze(p->buf, TS_DVHS_PACKET_SIZE * check_count,
 -                         TS_DVHS_PACKET_SIZE, NULL, 1) * CHECK_COUNT / check_count;
 -    fec_score = analyze(p->buf, TS_FEC_PACKET_SIZE * check_count,
 -                        TS_FEC_PACKET_SIZE, NULL, 1) * CHECK_COUNT / check_count;
 -    av_dlog(NULL, "score: %d, dvhs_score: %d, fec_score: %d \n",
 -            score, dvhs_score, fec_score);
 +    for (i = 0; i<check_count; i+=CHECK_BLOCK) {
 +        int left = FFMIN(check_count - i, CHECK_BLOCK);
-         int score      = analyze(p->buf + TS_PACKET_SIZE     *i, TS_PACKET_SIZE     *left, TS_PACKET_SIZE     , NULL);
-         int dvhs_score = analyze(p->buf + TS_DVHS_PACKET_SIZE*i, TS_DVHS_PACKET_SIZE*left, TS_DVHS_PACKET_SIZE, NULL);
-         int fec_score  = analyze(p->buf + TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , NULL);
++        int score      = analyze(p->buf + TS_PACKET_SIZE     *i, TS_PACKET_SIZE     *left, TS_PACKET_SIZE     , NULL, 1);
++        int dvhs_score = analyze(p->buf + TS_DVHS_PACKET_SIZE*i, TS_DVHS_PACKET_SIZE*left, TS_DVHS_PACKET_SIZE, NULL, 1);
++        int fec_score  = analyze(p->buf + TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , NULL, 1);
 +        score = FFMAX3(score, dvhs_score, fec_score);
 +        sumscore += score;
 +        maxscore = FFMAX(maxscore, score);
 +    }
 +
 +    sumscore = sumscore * CHECK_COUNT / check_count;
 +    maxscore = maxscore * CHECK_COUNT / CHECK_BLOCK;
  
 -    /* we need a clear definition for the returned score otherwise
 -     * things will become messy sooner or later */
 -    if (score > fec_score && score > dvhs_score && score > 6)
 -        return AVPROBE_SCORE_MAX + score - CHECK_COUNT;
 -    else if (dvhs_score > score && dvhs_score > fec_score && dvhs_score > 6)
 -        return AVPROBE_SCORE_MAX + dvhs_score - CHECK_COUNT;
 -    else if (fec_score > 6)
 -        return AVPROBE_SCORE_MAX + fec_score - CHECK_COUNT;
 +    av_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
 +
 +    if      (sumscore > 6) return AVPROBE_SCORE_MAX   + sumscore - CHECK_COUNT;
 +    else if (maxscore > 6) return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
      else
          return AVERROR_INVALIDDATA;
  }