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