On Fri, 11 Jul 2014 14:24:34 +0200
Luca Barbato <[email protected]> wrote:
> It should provide a quicker guess for elementary streams provided
> by http.
> ---
> 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 2bc1df9..31ae84b 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -391,6 +391,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
> @@ -535,6 +538,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);
Looks good to me conceptually, but I wonder if matching mime type
shouldn't give a slightly higher probe score than matching extension.
Websites sometimes serve mismatching mime type and extension, and
unlike the mime type is generic untyped data, the mime type seems to
be more often the correct one.
I suppose it's also a good idea to accelerate probing slow streams (web
radios) by giving a higher score.
> +#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 1a017ce..6e9ce67 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -61,4 +61,8 @@
> #define FF_API_LAVF_CODEC_TB (LIBAVFORMAT_VERSION_MAJOR < 57)
> #endif
>
> +#ifndef FF_API_PROBE_MIME
> +#define FF_API_PROBE_MIME (LIBAVFORMAT_VERSION_MAJOR > 55)
> +#endif
> +
> #endif /* AVFORMAT_VERSION_H */
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel