Merge commit '3a19405d574a467c68b48e4b824c76617fd59de0'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 29 Jul 2014 18:57:42 +0000 (20:57 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 29 Jul 2014 18:57:42 +0000 (20:57 +0200)
* commit '3a19405d574a467c68b48e4b824c76617fd59de0':
  avformat: Use the mime type information in input probe

Conflicts:
libavformat/format.c
libavformat/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/avformat.h
libavformat/format.c
libavformat/version.h

@@@ -393,12 -391,13 +393,16 @@@ typedef struct AVProbeData 
      const char *filename;
      unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */
      int buf_size;       /**< Size of buf except extra allocated bytes */
+ #ifdef FF_API_PROBE_MIME
+     uint8_t *mime_type; /**< mime_type, when known. */
+ #endif
  } AVProbeData;
  
 +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4)
 +#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1)
 +
  #define AVPROBE_SCORE_EXTENSION  50 ///< score for file extension
+ #define AVPROBE_SCORE_MIME       75 ///< score for file mime type
  #define AVPROBE_SCORE_MAX       100 ///< maximum score
  
  #define AVPROBE_PADDING_SIZE 32             ///< extra allocated bytes at the end of the probe buffer
@@@ -213,15 -195,34 +214,19 @@@ AVInputFormat *av_probe_input_format3(A
              if (av_match_ext(lpd.filename, fmt1->extensions))
                  score = AVPROBE_SCORE_EXTENSION;
          }
 -        if (score > *score_max) {
 -            *score_max = score;
 -            fmt        = fmt1;
 -        } else if (score == *score_max)
+ #ifdef FF_API_PROBE_MIME
+         if (av_match_name(lpd.mime_type, fmt1->mime_type))
+             score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
+ #endif
 +        if (score > score_max) {
 +            score_max = score;
 +            fmt       = fmt1;
 +        } 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 == 1)
 +        score_max = FFMIN(AVPROBE_SCORE_EXTENSION / 2 - 1, score_max);
 +    *score_ret = score_max;
  
      return fmt;
  }
@@@ -263,14 -254,12 +268,21 @@@ int av_probe_input_buffer2(AVIOContext 
  
      if (offset >= max_probe_size)
          return AVERROR(EINVAL);
 -    avio_skip(pb, offset);
 -    max_probe_size -= offset;
 +
+ #ifdef FF_API_PROBE_MIME
+     if (pb->av_class)
+         av_opt_get(pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &pd.mime_type);
+ #endif
++
++#if !FF_API_PROBE_MIME
 +    if (!*fmt && pb->av_class && av_opt_get(pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type) >= 0 && mime_type) {
 +        if (!av_strcasecmp(mime_type, "audio/aacp")) {
 +            *fmt = av_find_input_format("aac");
 +        }
 +        av_freep(&mime_type);
 +    }
++#endif
 +
      for (probe_size = PROBE_BUF_MIN; probe_size <= max_probe_size && !*fmt;
           probe_size = FFMIN(probe_size << 1,
                              FFMAX(max_probe_size, probe_size + 1))) {
  
          /* Read probe data. */
          if ((ret = av_reallocp(&buf, probe_size + AVPROBE_PADDING_SIZE)) < 0)
-             return ret;
+             goto fail;
 -        if ((ret = avio_read(pb, buf + pd.buf_size,
 -                             probe_size - pd.buf_size)) < 0) {
 +        if ((ret = avio_read(pb, buf + buf_offset,
 +                             probe_size - buf_offset)) < 0) {
              /* Fail if error was not end of file, otherwise, lower score. */
-             if (ret != AVERROR_EOF) {
-                 av_free(buf);
-                 return ret;
-             }
+             if (ret != AVERROR_EOF)
+                 goto fail;
              score = 0;
              ret   = 0;          /* error was end of file, nothing read */
          }
          }
      }
  
-     if (!*fmt) {
-         av_free(buf);
-         return AVERROR_INVALIDDATA;
-     }
+     if (!*fmt)
+         ret = AVERROR_INVALIDDATA;
  
+ fail:
      /* Rewind. Reuse probe buffer to avoid seeking. */
-     ret = ffio_rewind_with_probe_data(pb, &buf, buf_offset);
 -    if (ret < 0 ||
 -        (ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0) {
 -        av_free(buf);
 -    }
++    if (ret >= 0)
++        ret = ffio_rewind_with_probe_data(pb, &buf, buf_offset);
 +
+ #ifdef FF_API_PROBE_MIME
+     av_free(pd.mime_type);
+ #endif
 -    return ret;
 +    return ret < 0 ? ret : score;
 +}
 +
 +int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
 +                          const char *filename, void *logctx,
 +                          unsigned int offset, unsigned int max_probe_size)
 +{
 +    int ret = av_probe_input_buffer2(pb, fmt, filename, logctx, offset, max_probe_size);
 +    return ret < 0 ? ret : 0;
  }
  #define FF_API_LAVF_CODEC_TB            (LIBAVFORMAT_VERSION_MAJOR < 57)
  #endif
  
 +#ifndef FF_API_ALLOC_OUTPUT_CONTEXT
 +#define FF_API_ALLOC_OUTPUT_CONTEXT    (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_FORMAT_PARAMETERS
 +#define FF_API_FORMAT_PARAMETERS       (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_NEW_STREAM
 +#define FF_API_NEW_STREAM              (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_SET_PTS_INFO
 +#define FF_API_SET_PTS_INFO            (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_CLOSE_INPUT_FILE
 +#define FF_API_CLOSE_INPUT_FILE        (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_READ_PACKET
 +#define FF_API_READ_PACKET             (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_ASS_SSA
 +#define FF_API_ASS_SSA                 (LIBAVFORMAT_VERSION_MAJOR < 56)
 +#endif
 +#ifndef FF_API_R_FRAME_RATE
 +#define FF_API_R_FRAME_RATE            1
 +#endif
+ #ifndef FF_API_PROBE_MIME
+ #define FF_API_PROBE_MIME               (LIBAVFORMAT_VERSION_MAJOR > 55)
+ #endif
  #endif /* AVFORMAT_VERSION_H */