[FFmpeg-devel] [PATCH 2/7] avformat: add url field to AVFormatContext

Bang He hezhanbang at gmail.com
Mon Jan 8 09:12:48 EET 2018


On Sun, Jan 7, 2018 at 4:50 AM, Marton Balint <cus at passwd.hu> wrote:

> This will replace the 1024 character limited filename field. Compatiblity
> for
> output contexts are provided by copying filename field to URL if URL is
> unset
> and by providing an internal function for muxers to set both url and
> filename
> at once.
>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
>  doc/APIchanges         |  3 +++
>  libavformat/avformat.h | 15 +++++++++++++++
>  libavformat/internal.h |  7 +++++++
>  libavformat/mux.c      | 11 ++++++++++-
>  libavformat/utils.c    | 14 ++++++++++++++
>  libavformat/version.h  |  2 +-
>  6 files changed, 50 insertions(+), 2 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index d66c842521..4a91b7460a 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2017-10-21
>
>  API changes, most recent first:
>
> +2018-xx-xx - xxxxxxx - lavf 58.4.100 - avformat.h
> +  Add url field to AVFormatContext and add ff_format_set_url helper
> function.
> +
>  2018-01-xx - xxxxxxx - lavfi 7.11.101 - avfilter.h
>    Deprecate avfilter_link_get_channels(). Use
> av_buffersink_get_channels().
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 4f2798a871..9fa25abd90 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -1391,6 +1391,21 @@ typedef struct AVFormatContext {
>      char filename[1024];
>
>      /**
> +     * input or output URL. Unlike the old filename field, this field has
> no
> +     * length restriction.
> +     *
> +     * - demuxing: set by avformat_open_input(), initialized to an empty
> +     *             string if url parameter was NULL in
> avformat_open_input().
> +     * - muxing: may be set by the caller before calling
> avformat_write_header()
> +     *           (or avformat_init_output() if that is called first) to a
> string
> +     *           which is freeable by av_free(). Set to an empty string
> if it
> +     *           was NULL in avformat_init_output().
> +     *
> +     * Freed by libavformat in avformat_free_context().
> +     */
> +    char *url;
> +
> +    /**
>       * Position of the first frame of the component, in
>       * AV_TIME_BASE fractional seconds. NEVER set this value directly:
>       * It is deduced from the AVStream values.
> diff --git a/libavformat/internal.h b/libavformat/internal.h
> index 0cd0556dc7..1e2a3e05a1 100644
> --- a/libavformat/internal.h
> +++ b/libavformat/internal.h
> @@ -696,4 +696,11 @@ int ff_interleaved_peek(AVFormatContext *s, int
> stream,
>  int ff_lock_avformat(void);
>  int ff_unlock_avformat(void);
>
> +/**
> + * Set AVFormatContext url field to the provided pointer. The pointer must
> + * point to a valid string. The existing url field is freed if necessary.
> Also
> + * set the legacy filename field to the same string which was provided in
> url.
> + */
> +void ff_format_set_url(AVFormatContext *s, char *url);
> +
>  #endif /* AVFORMAT_INTERNAL_H */
> diff --git a/libavformat/mux.c b/libavformat/mux.c
> index ea9f13fdf5..de63f2ca25 100644
> --- a/libavformat/mux.c
> +++ b/libavformat/mux.c
> @@ -186,8 +186,12 @@ int avformat_alloc_output_context2(AVFormatContext
> **avctx, AVOutputFormat *ofor
>      } else
>          s->priv_data = NULL;
>
> -    if (filename)
> +    if (filename) {
>          av_strlcpy(s->filename, filename, sizeof(s->filename));
> +        if (!(s->url = av_strdup(filename)))
> +            goto nomem;
> +
> +    }
>      *avctx = s;
>      return 0;
>  nomem:
> @@ -251,6 +255,11 @@ static int init_muxer(AVFormatContext *s,
> AVDictionary **options)
>          (ret = av_opt_set_dict2(s->priv_data, &tmp,
> AV_OPT_SEARCH_CHILDREN)) < 0)
>          goto fail;
>
> +    if (!s->url && !(s->url = av_strdup(s->filename))) {
> +        ret = AVERROR(ENOMEM);
> +        goto fail;
> +    }
> +
>  #if FF_API_LAVF_AVCTX
>  FF_DISABLE_DEPRECATION_WARNINGS
>      if (s->nb_streams && s->streams[0]->codec->flags &
> AV_CODEC_FLAG_BITEXACT) {
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index 2185a6f05b..fdfd3a088d 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -551,6 +551,11 @@ int avformat_open_input(AVFormatContext **ps, const
> char *filename,
>      if ((ret = av_opt_set_dict(s, &tmp)) < 0)
>          goto fail;
>
> +    if (!(s->url = av_strdup(filename ? filename : ""))) {
> +        ret = AVERROR(ENOMEM);
> +        goto fail;
> +    }
> +
>      av_strlcpy(s->filename, filename ? filename : "",
> sizeof(s->filename));
>      if ((ret = init_input(s, filename, &tmp)) < 0)
>          goto fail;
> @@ -4357,6 +4362,7 @@ void avformat_free_context(AVFormatContext *s)
>      av_freep(&s->streams);
>      flush_packet_queue(s);
>      av_freep(&s->internal);
> +    av_freep(&s->url);
>      av_free(s);
>  }
>
> @@ -5624,3 +5630,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
>      return st->internal->avctx->time_base;
>  #endif
>  }
> +
> +void ff_format_set_url(AVFormatContext *s, char *url)
> +{
> +    av_assert0(url);
> +    av_freep(&s->url);
> +    s->url = url;
>
mybe you should: s->url=av_strdup(url)


> +    av_strlcpy(s->filename, url, sizeof(s->filename));
> +}
> diff --git a/libavformat/version.h b/libavformat/version.h
> index 5ced041f0a..49b9906a20 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -32,7 +32,7 @@
>  // Major bumping may affect Ticket5467, 5421, 5451(compatibility with
> Chromium)
>  // Also please add any ticket numbers that you believe might be affected
> here
>  #define LIBAVFORMAT_VERSION_MAJOR  58
> -#define LIBAVFORMAT_VERSION_MINOR   3
> +#define LIBAVFORMAT_VERSION_MINOR   4
>  #define LIBAVFORMAT_VERSION_MICRO 100
>
>  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR,
> \
> --
> 2.13.6
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list