On 29/03/14 15:45, Luca Barbato wrote:
> It should provide a quicker guess for elementary streams provided
> by http.
> ---
> 
> Most issues should be fixed.
> 
>  libavformat/avformat.h | 10 ++++++++++
>  libavformat/format.c   | 34 ++++++++++++++++++++++------------
>  libavformat/version.h  |  4 ++++
>  3 files changed, 36 insertions(+), 12 deletions(-)
> 
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 02ee6ba..4849f72 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -389,6 +389,9 @@ 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_EXTENSION  50 ///< score for file extension
> @@ -533,6 +536,13 @@ typedef struct AVInputFormat {
> 
>      const AVClass *priv_class; ///< AVClass for the private context
> 
> +    /**
> +     * Comma-separated list of mime types.
> +     * It is used check for matching mime types while probing.
> +     * @see av_probe_input_format2
> +     */
> +    const char *mime_type;
> +
>      /*****************************************************************
>       * No fields below this line are part of the public API. They
>       * may not be used outside of libavformat and can be changed and
> diff --git a/libavformat/format.c b/libavformat/format.c
> index 95c06ff..ce4c6b9 100644
> --- a/libavformat/format.c
> +++ b/libavformat/format.c
> @@ -20,6 +20,7 @@
>   */
> 
>  #include "libavutil/avstring.h"
> +#include "libavutil/opt.h"
> 
>  #include "avio_internal.h"
>  #include "avformat.h"
> @@ -212,6 +213,10 @@ AVInputFormat *av_probe_input_format2(AVProbeData *pd, 
> int is_opened,
>              if (av_match_ext(lpd.filename, fmt1->extensions))
>                  score = AVPROBE_SCORE_EXTENSION;
>          }
> +#ifdef FF_API_PROBE_MIME
> +        if (match_name(lpd.mime_type, fmt1->mime_type))
> +            score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
> +#endif
>          if (score > *score_max) {
>              *score_max = score;
>              fmt        = fmt1;
> @@ -269,7 +274,10 @@ int av_probe_input_buffer(AVIOContext *pb, AVInputFormat 
> **fmt,
>          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
>      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))) {
> @@ -277,14 +285,13 @@ int av_probe_input_buffer(AVIOContext *pb, 
> AVInputFormat **fmt,
> 
>          /* 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) {
>              /* 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 */
>          }
> @@ -307,14 +314,17 @@ int av_probe_input_buffer(AVIOContext *pb, 
> AVInputFormat **fmt,
>          }
>      }
> 
> -    if (!*fmt) {
> -        av_free(buf);
> -        return AVERROR_INVALIDDATA;
> -    }
> +    if (!*fmt)
> +        ret = AVERROR_INVALIDDATA;
> 
> +fail:
>      /* Rewind. Reuse probe buffer to avoid seeking. */
> -    if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
> +    if (ret < 0 ||
> +        (ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0) {
>          av_free(buf);
> -
> +    }
> +#ifdef FF_API_PROBE_MIME
> +    av_free(pd.mime_type);
> +#endif
>      return ret;
>  }
> diff --git a/libavformat/version.h b/libavformat/version.h
> index 85ff700..69a0e38 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -52,4 +52,8 @@
>  #define FF_API_REFERENCE_DTS            (LIBAVFORMAT_VERSION_MAJOR < 56)
>  #endif
> 
> +#ifndef FF_API_PROBE_MIME
> +#define FF_API_PROBE_MIME               (LIBAVFORMAT_VERSION_MAJOR > 55)
> +#endif
> +
>  #endif /* AVFORMAT_VERSION_H */
> --
> 1.9.0
> 

Ping.

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to