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
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel