On Tue, 25 Oct 2011 20:09:41 -0700, Alex Converse <[email protected]> wrote: > On Tue, Oct 25, 2011 at 7:22 PM, Alex Converse <[email protected]> > wrote: > > On Sun, Jun 19, 2011 at 1:42 PM, Anton Khirnov <[email protected]> wrote: > >> Module: libav > >> Branch: release/0.7 > >> Commit: 05e84c95c7f0543553af8f0ebd50fb5604e7e2ff > >> > >> Author: Anton Khirnov <[email protected]> > >> Committer: Anton Khirnov <[email protected]> > >> Date: Sun May 22 08:37:25 2011 +0200 > >> > >> lavf: add avformat_open_input() as a replacement for av_open_input_* > >> > >> Add support for demuxer private options. > >> > > > > This seems to do scary things... > > > >> --- > >> > >> libavformat/avformat.h | 22 ++++++++++ > >> libavformat/options.c | 28 +++++++++++++ > >> libavformat/utils.c | 104 > >> +++++++++++++++++++++++++++++++++++++++++++++++- > >> 3 files changed, 153 insertions(+), 1 deletions(-) > >> > >> diff --git a/libavformat/avformat.h b/libavformat/avformat.h > >> index 2b5b50e..56a9d57 100644 > > [...] > >> --- a/libavformat/utils.c > >> +++ b/libavformat/utils.c > >> @@ -605,6 +605,107 @@ int av_open_input_file(AVFormatContext **ic_ptr, > >> const char *filename, > > [...] > >> +/* open input file and probe the format if necessary */ > >> +static int init_input(AVFormatContext *s, const char *filename) > >> +{ > >> + int ret; > >> + AVProbeData pd = {filename, NULL, 0}; > >> + > >> + if (s->pb) { > >> + s->flags |= AVFMT_FLAG_CUSTOM_IO; > >> + if (!s->iformat) > >> + return av_probe_input_buffer(s->pb, &s->iformat, filename, s, > >> 0, 0); > >> + else if (s->iformat->flags & AVFMT_NOFILE) > >> + return AVERROR(EINVAL); > >> + return 0; > >> + } > >> + > >> + if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) || > >> + (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0)))) > >> + return 0; > > > > Why are we probing with max score 0 here? Why are we probing at all here? > > > > My apologies about this part... is_opened = 0 here > > while ((fmt1 = av_iformat_next(fmt1))) { > if (!is_opened == !(fmt1->flags & AVFMT_NOFILE)) > continue; > > > >> + > >> + if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0) > >> + return ret; > >> + if (s->iformat) > >> + return 0; > >> + return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0); > >> +} > >> + > >> +int avformat_open_input(AVFormatContext **ps, const char *filename, > >> AVInputFormat *fmt, AVDictionary **options) > >> +{ > >> + AVFormatContext *s = *ps; > >> + int ret = 0; > >> + AVFormatParameters ap = { 0 }; > >> + AVDictionary *tmp = NULL; > >> + > >> + if (!s && !(s = avformat_alloc_context())) > >> + return AVERROR(ENOMEM); > >> + if (fmt) > >> + s->iformat = fmt; > >> + > >> + if (options) > >> + av_dict_copy(&tmp, *options, 0); > >> + > >> + if ((ret = av_opt_set_dict(s, &tmp)) < 0) > >> + goto fail; > >> + > >> + if ((ret = init_input(s, filename)) < 0) > >> + goto fail; > >> + > >> + /* check filename in case an image number is expected */ > >> + if (s->iformat->flags & AVFMT_NEEDNUMBER) { > >> + if (!av_filename_number_test(filename)) { > >> + ret = AVERROR(EINVAL); > >> + goto fail; > >> + } > >> + } > >> + > >> + s->duration = s->start_time = AV_NOPTS_VALUE; > >> + av_strlcpy(s->filename, filename, sizeof(s->filename)); > >> + > >> + /* allocate private data */ > >> + if (s->iformat->priv_data_size > 0) { > >> + if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) { > >> + ret = AVERROR(ENOMEM); > >> + goto fail; > >> + } > >> + if (s->iformat->priv_class) { > >> + *(const AVClass**)s->priv_data = s->iformat->priv_class; > >> + av_opt_set_defaults(s->priv_data); > >> + if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0) > >> + goto fail; > >> + } > >> + } > >> + > >> + /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */ > >> + if (s->pb) > >> + ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC); > >> + > >> + if (s->iformat->read_header) > >> + if ((ret = s->iformat->read_header(s, &ap)) < 0) > > > > read_header() often uses s->pb > > > > still curious about this part >
read_header() only uses s->pb if it's not an AVFMT_NOFILE format, so s->pb is non-NULL. -- Anton Khirnov _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
