On Thu, 13 Mar 2014 22:35:41 +0100, Luca Barbato <[email protected]> wrote:
> It should provide a quicker guess for elementary streams provided
> by http.
> ---
> libavformat/avformat.h | 7 +++++++
> libavformat/format.c | 29 +++++++++++++++++++----------
> 2 files changed, 26 insertions(+), 10 deletions(-)
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index ec9c262..d532ad6 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -389,6 +389,7 @@ 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 */
> + uint8_t *mime_type; /**< mime_type, when known. */
This breaks ABI
> } AVProbeData;
>
> #define AVPROBE_SCORE_EXTENSION 50 ///< score for file extension
> @@ -620,6 +621,12 @@ typedef struct AVInputFormat {
> * Active streams are all streams that have AVStream.discard <
> AVDISCARD_ALL.
> */
> int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t
> min_ts, int64_t ts, int64_t max_ts, int flags);
> +
> + /**
> + * Used to raise the score while probing for unknown format
This documentation is very vague, please be more precise.
> + * @see av_probe_input_format2
> + */
> + const char *mime_type;
Is it supposed to be public? Then it should be higher up.
Also, shouldn't this better be a list of strings?
> } AVInputFormat;
> /**
> * @}
> diff --git a/libavformat/format.c b/libavformat/format.c
> index 95c06ff..8bc0f8e 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,9 @@ AVInputFormat *av_probe_input_format2(AVProbeData *pd,
> int is_opened,
> if (av_match_ext(lpd.filename, fmt1->extensions))
> score = AVPROBE_SCORE_EXTENSION;
> }
> + if (match_name(lpd.mime_type, fmt1->mime_type))
> + score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
> +
> if (score > *score_max) {
> *score_max = score;
> fmt = fmt1;
> @@ -270,6 +274,9 @@ int av_probe_input_buffer(AVIOContext *pb, AVInputFormat
> **fmt,
> avio_skip(pb, offset);
> max_probe_size -= offset;
>
> + if (pb->av_class)
> + av_opt_get(pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &pd.mime_type);
> +
> 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 +284,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 +313,17 @@ int av_probe_input_buffer(AVIOContext *pb,
> AVInputFormat **fmt,
> }
> }
>
> - if (!*fmt) {
> - av_free(buf);
> - return AVERROR_INVALIDDATA;
> - }
> + if (!*fmt)
> + ret = AVERROR_INVALIDDATA;
>
> /* 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) {
> +fail:
This jumping inside of a block looks evil and likely to break in the future.
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel