Looks good to me.
On Fri, Jul 11, 2014 at 5:24 AM, Luca Barbato <[email protected]> wrote: > --- > libavformat/format.c | 139 > ++++++++++++++++++++++++++++++++++++++++++++++++++- > libavformat/utils.c | 135 > ------------------------------------------------- > 2 files changed, 138 insertions(+), 136 deletions(-) > > diff --git a/libavformat/format.c b/libavformat/format.c > index 3a510cd..ae7b3df 100644 > --- a/libavformat/format.c > +++ b/libavformat/format.c > @@ -19,9 +19,12 @@ > * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > 02110-1301 USA > */ > > +#include "libavutil/avstring.h" > + > +#include "avio_internal.h" > #include "avformat.h" > +#include "id3v2.h" > #include "internal.h" > -#include "libavutil/avstring.h" > > /** > * @file > @@ -181,3 +184,137 @@ AVInputFormat *av_find_input_format(const char > *short_name) > return fmt; > return NULL; > } > + > +AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, > + int *score_max) > +{ > + AVProbeData lpd = *pd; > + AVInputFormat *fmt1 = NULL, *fmt; > + int score, id3 = 0; > + > + if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, > ID3v2_DEFAULT_MAGIC)) { > + int id3len = ff_id3v2_tag_len(lpd.buf); > + if (lpd.buf_size > id3len + 16) { > + lpd.buf += id3len; > + lpd.buf_size -= id3len; > + } > + id3 = 1; > + } > + > + fmt = NULL; > + while ((fmt1 = av_iformat_next(fmt1))) { > + if (!is_opened == !(fmt1->flags & AVFMT_NOFILE)) > + continue; > + score = 0; > + if (fmt1->read_probe) { > + score = fmt1->read_probe(&lpd); > + } else if (fmt1->extensions) { > + if (av_match_ext(lpd.filename, fmt1->extensions)) > + score = AVPROBE_SCORE_EXTENSION; > + } > + if (score > *score_max) { > + *score_max = score; > + fmt = fmt1; > + } else if (score == *score_max) > + fmt = NULL; > + } > + > + // A hack for files with huge id3v2 tags -- try to guess by file > extension. > + if (!fmt && is_opened && *score_max < AVPROBE_SCORE_EXTENSION / 2) { > + while ((fmt = av_iformat_next(fmt))) > + if (fmt->extensions && > + av_match_ext(lpd.filename, fmt->extensions)) { > + *score_max = AVPROBE_SCORE_EXTENSION / 2; > + break; > + } > + } > + > + if (!fmt && id3 && *score_max < AVPROBE_SCORE_EXTENSION / 2 - 1) { > + while ((fmt = av_iformat_next(fmt))) > + if (fmt->extensions && av_match_ext("mp3", fmt->extensions)) { > + *score_max = AVPROBE_SCORE_EXTENSION / 2 - 1; > + break; > + } > + } > + > + return fmt; > +} > + > +AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) > +{ > + int score = 0; > + return av_probe_input_format2(pd, is_opened, &score); > +} > + > +/* size of probe buffer, for guessing file type from file contents */ > +#define PROBE_BUF_MIN 2048 > +#define PROBE_BUF_MAX (1 << 20) > + > +int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, > + const char *filename, void *logctx, > + unsigned int offset, unsigned int > max_probe_size) > +{ > + AVProbeData pd = { filename ? filename : "" }; > + uint8_t *buf = NULL; > + int ret = 0, probe_size; > + > + if (!max_probe_size) > + max_probe_size = PROBE_BUF_MAX; > + else if (max_probe_size > PROBE_BUF_MAX) > + max_probe_size = PROBE_BUF_MAX; > + else if (max_probe_size < PROBE_BUF_MIN) > + return AVERROR(EINVAL); > + > + if (offset >= max_probe_size) > + return AVERROR(EINVAL); > + avio_skip(pb, offset); > + max_probe_size -= offset; > + > + 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))) { > + int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX / 4 : > 0; > + > + /* Read probe data. */ > + if ((ret = av_reallocp(&buf, probe_size + AVPROBE_PADDING_SIZE)) > < 0) > + return ret; > + 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; > + } > + score = 0; > + ret = 0; /* error was end of file, nothing read */ > + } > + pd.buf_size += ret; > + pd.buf = buf; > + > + memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE); > + > + /* Guess file format. */ > + *fmt = av_probe_input_format2(&pd, 1, &score); > + if (*fmt) { > + /* This can only be true in the last iteration. */ > + if (score <= AVPROBE_SCORE_MAX / 4) { > + av_log(logctx, AV_LOG_WARNING, > + "Format detected only with low score of %d, " > + "misdetection possible!\n", score); > + } else > + av_log(logctx, AV_LOG_DEBUG, > + "Probed with size=%d and score=%d\n", probe_size, > score); > + } > + } > + > + if (!*fmt) { > + av_free(buf); > + return AVERROR_INVALIDDATA; > + } > + > + /* Rewind. Reuse probe buffer to avoid seeking. */ > + if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0) > + av_free(buf); > + > + return ret; > +} > diff --git a/libavformat/utils.c b/libavformat/utils.c > index 7a054af..71e0d9b 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -41,7 +41,6 @@ > > #include "audiointerleave.h" > #include "avformat.h" > -#include "avio_internal.h" > #include "id3v2.h" > #include "internal.h" > #include "metadata.h" > @@ -139,67 +138,6 @@ int av_filename_number_test(const char *filename) > (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0); > } > > -AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, > - int *score_max) > -{ > - AVProbeData lpd = *pd; > - AVInputFormat *fmt1 = NULL, *fmt; > - int score, id3 = 0; > - > - if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, > ID3v2_DEFAULT_MAGIC)) { > - int id3len = ff_id3v2_tag_len(lpd.buf); > - if (lpd.buf_size > id3len + 16) { > - lpd.buf += id3len; > - lpd.buf_size -= id3len; > - } > - id3 = 1; > - } > - > - fmt = NULL; > - while ((fmt1 = av_iformat_next(fmt1))) { > - if (!is_opened == !(fmt1->flags & AVFMT_NOFILE)) > - continue; > - score = 0; > - if (fmt1->read_probe) { > - score = fmt1->read_probe(&lpd); > - } else if (fmt1->extensions) { > - if (av_match_ext(lpd.filename, fmt1->extensions)) > - score = AVPROBE_SCORE_EXTENSION; > - } > - if (score > *score_max) { > - *score_max = score; > - fmt = fmt1; > - } else if (score == *score_max) > - fmt = NULL; > - } > - > - // A hack for files with huge id3v2 tags -- try to guess by file > extension. > - if (!fmt && is_opened && *score_max < AVPROBE_SCORE_EXTENSION / 2) { > - while ((fmt = av_iformat_next(fmt))) > - if (fmt->extensions && > - av_match_ext(lpd.filename, fmt->extensions)) { > - *score_max = AVPROBE_SCORE_EXTENSION / 2; > - break; > - } > - } > - > - if (!fmt && id3 && *score_max < AVPROBE_SCORE_EXTENSION / 2 - 1) { > - while ((fmt = av_iformat_next(fmt))) > - if (fmt->extensions && av_match_ext("mp3", fmt->extensions)) { > - *score_max = AVPROBE_SCORE_EXTENSION / 2 - 1; > - break; > - } > - } > - > - return fmt; > -} > - > -AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) > -{ > - int score = 0; > - return av_probe_input_format2(pd, is_opened, &score); > -} > - > static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, > AVProbeData *pd, int score) > { > @@ -241,79 +179,6 @@ static int set_codec_from_probe_data(AVFormatContext > *s, AVStream *st, > /************************************************************/ > /* input media file */ > > -/** size of probe buffer, for guessing file type from file contents */ > -#define PROBE_BUF_MIN 2048 > -#define PROBE_BUF_MAX (1 << 20) > - > -int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, > - const char *filename, void *logctx, > - unsigned int offset, unsigned int > max_probe_size) > -{ > - AVProbeData pd = { filename ? filename : "" }; > - uint8_t *buf = NULL; > - int ret = 0, probe_size; > - > - if (!max_probe_size) > - max_probe_size = PROBE_BUF_MAX; > - else if (max_probe_size > PROBE_BUF_MAX) > - max_probe_size = PROBE_BUF_MAX; > - else if (max_probe_size < PROBE_BUF_MIN) > - return AVERROR(EINVAL); > - > - if (offset >= max_probe_size) > - return AVERROR(EINVAL); > - avio_skip(pb, offset); > - max_probe_size -= offset; > - > - 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))) { > - int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX / 4 : > 0; > - > - /* Read probe data. */ > - if ((ret = av_reallocp(&buf, probe_size + AVPROBE_PADDING_SIZE)) > < 0) > - return ret; > - 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; > - } > - score = 0; > - ret = 0; /* error was end of file, nothing read */ > - } > - pd.buf_size += ret; > - pd.buf = buf; > - > - memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE); > - > - /* Guess file format. */ > - *fmt = av_probe_input_format2(&pd, 1, &score); > - if (*fmt) { > - /* This can only be true in the last iteration. */ > - if (score <= AVPROBE_SCORE_MAX / 4) { > - av_log(logctx, AV_LOG_WARNING, > - "Format detected only with low score of %d, " > - "misdetection possible!\n", score); > - } else > - av_log(logctx, AV_LOG_DEBUG, > - "Probed with size=%d and score=%d\n", probe_size, > score); > - } > - } > - > - if (!*fmt) { > - av_free(buf); > - return AVERROR_INVALIDDATA; > - } > - > - /* Rewind. Reuse probe buffer to avoid seeking. */ > - if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0) > - av_free(buf); > - > - return ret; > -} > - > /* Open input file and probe the format if necessary. */ > static int init_input(AVFormatContext *s, const char *filename, > AVDictionary **options) > -- > 1.9.0 > > _______________________________________________ > libav-devel mailing list > [email protected] > https://lists.libav.org/mailman/listinfo/libav-devel > _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
