[FFmpeg-devel] [PATCH] ffserver: add stream Metadata option

Michael Niedermayer michaelni at gmx.at
Sat Dec 14 17:10:15 CET 2013


On Fri, Nov 29, 2013 at 08:43:58AM +0100, Stefano Sabatini wrote:
> Deprecate Author, Comment, Copyright, Title options.
> 
> Note that the old options (and the new), has no effect with FFM output
> because the format does not export metadata.
> ---
>  doc/ffserver.texi |  6 +++++-
>  ffserver.c        | 60 +++++++++++++++++++++++++++++++++----------------------
>  2 files changed, 41 insertions(+), 25 deletions(-)
> 
> diff --git a/doc/ffserver.texi b/doc/ffserver.texi
> index efaa664..290f6e0 100644
> --- a/doc/ffserver.texi
> +++ b/doc/ffserver.texi
> @@ -451,7 +451,11 @@ for regular streams.
>  @item Comment @var{value}
>  @item Copyright @var{value}
>  @item Title @var{value}
> -Set metadata corresponding to the option.
> +Set metadata corresponding to the option. All these options are
> +deprecated in favor of @option{Metadata}.
> +
> + at item Metadata @var{key} @var{value}
> +Set metadata value on the output stream.
>  
>  @item NoAudio
>  @item NoVideo
> diff --git a/ffserver.c b/ffserver.c
> index 6ce09c4..f9efaf7 100644
> --- a/ffserver.c
> +++ b/ffserver.c
> @@ -216,6 +216,7 @@ typedef struct FFStream {
>      struct FFStream *feed;   /* feed we are using (can be null if
>                                  coming from file) */
>      AVDictionary *in_opts;   /* input parameters */
> +    AVDictionary *metadata;  /* metadata to set on the stream */
>      AVInputFormat *ifmt;       /* if non NULL, force input format */
>      AVOutputFormat *fmt;
>      IPAddressACL *acl;
> @@ -228,10 +229,6 @@ typedef struct FFStream {
>      int feed_streams[MAX_STREAMS]; /* index of streams in the feed */
>      char feed_filename[1024]; /* file name of the feed storage, or
>                                   input file name for a stream */
> -    char author[512];
> -    char title[512];
> -    char copyright[512];
> -    char comment[512];
>      pid_t pid;  /* Of ffmpeg process */
>      time_t pid_start;  /* Of ffmpeg process */
>      char **child_argv;
> @@ -2279,11 +2276,7 @@ static int http_prepare_data(HTTPContext *c)
>      switch(c->state) {
>      case HTTPSTATE_SEND_DATA_HEADER:
>          memset(&c->fmt_ctx, 0, sizeof(c->fmt_ctx));
> -        av_dict_set(&c->fmt_ctx.metadata, "author"   , c->stream->author   , 0);
> -        av_dict_set(&c->fmt_ctx.metadata, "comment"  , c->stream->comment  , 0);
> -        av_dict_set(&c->fmt_ctx.metadata, "copyright", c->stream->copyright, 0);
> -        av_dict_set(&c->fmt_ctx.metadata, "title"    , c->stream->title    , 0);
> -
> +        av_dict_copy(&(c->fmt_ctx.metadata), c->stream->metadata, 0);
>          c->fmt_ctx.streams = av_mallocz(sizeof(AVStream *) * c->stream->nb_streams);
>  
>          for(i=0;i<c->stream->nb_streams;i++) {
> @@ -2991,6 +2984,7 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
>      AVFormatContext *avc;
>      AVStream *avs = NULL;
>      AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL);
> +    AVDictionaryEntry *entry = av_dict_get(stream->metadata, "title", NULL, 0);
>      int i;
>  
>      avc =  avformat_alloc_context();
> @@ -2999,7 +2993,7 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
>      }
>      avc->oformat = rtp_format;
>      av_dict_set(&avc->metadata, "title",
> -               stream->title[0] ? stream->title : "No Title", 0);
> +               entry->key[0] ? entry->key : "No Title", 0);

entry can be NULL here i think


>      avc->nb_streams = stream->nb_streams;
>      if (stream->is_multicast) {
>          snprintf(avc->filename, 1024, "rtp://%s:%d?multicast=1?ttl=%d",
> @@ -4060,7 +4054,7 @@ static int parse_ffconfig(const char *filename)
>      FILE *f;
>      char line[1024];
>      char cmd[64];
> -    char arg[1024];
> +    char arg[1024], arg2[1024];
>      const char *p;
>      int val, errors, line_num;
>      FFStream **last_stream, *stream, *redirect;
> @@ -4360,18 +4354,37 @@ static int parse_ffconfig(const char *filename)
>              } else {
>                  ERROR("FaviconURL only permitted for status streams\n");
>              }
> -        } else if (!av_strcasecmp(cmd, "Author")) {
> -            if (stream)
> -                get_arg(stream->author, sizeof(stream->author), &p);
> -        } else if (!av_strcasecmp(cmd, "Comment")) {
> -            if (stream)
> -                get_arg(stream->comment, sizeof(stream->comment), &p);
> -        } else if (!av_strcasecmp(cmd, "Copyright")) {
> -            if (stream)
> -                get_arg(stream->copyright, sizeof(stream->copyright), &p);
> -        } else if (!av_strcasecmp(cmd, "Title")) {
> -            if (stream)
> -                get_arg(stream->title, sizeof(stream->title), &p);
> +        } else if (!av_strcasecmp(cmd, "Author")    ||
> +                   !av_strcasecmp(cmd, "Comment")   ||
> +                   !av_strcasecmp(cmd, "Copyright") ||
> +                   !av_strcasecmp(cmd, "Title")) {
> +            get_arg(arg, sizeof(arg), &p);
> +
> +            if (stream) {
> +                char key[32];
> +                int i, ret;
> +
> +                av_log(NULL, AV_LOG_WARNING,
> +                       "'%s' option in configuration file is deprecated, "
> +                       "use 'Metadata %s VALUE' instead\n", cmd, cmd);
> +                for (i = 0; i < strlen(cmd); i++)
> +                    key[i] = av_tolower(cmd[i]);
> +                key[i] = 0;
> +                if ((ret = av_dict_set(&stream->metadata, key, arg, 0)) < 0) {
> +                    ERROR("Could not set metadata '%s' to value '%s': %s\n",
> +                          key, arg, av_err2str(ret));
> +                }
> +            }
> +        } else if (!av_strcasecmp(cmd, "Metadata")) {
> +            get_arg(arg, sizeof(arg), &p);
> +            get_arg(arg2, sizeof(arg2), &p);
> +            if (stream) {
> +                int ret;
> +                if ((ret = av_dict_set(&stream->metadata, arg, arg, 0)) < 0) {
> +                    ERROR("Could not set metadata '%s' to value '%s': %s\n",
> +                          arg, arg2, av_err2str(ret));
> +                }
> +            }
>          } else if (!av_strcasecmp(cmd, "Preroll")) {
>              get_arg(arg, sizeof(arg), &p);
>              if (stream)
> @@ -4494,7 +4507,6 @@ static int parse_ffconfig(const char *filename)
>              }
>          } else if (!av_strcasecmp(cmd, "AVOptionVideo") ||
>                     !av_strcasecmp(cmd, "AVOptionAudio")) {
> -            char arg2[1024];
>              AVCodecContext *avctx;
>              int type;
>              get_arg(arg, sizeof(arg), &p);
> -- 
> 1.8.1.2
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Dictatorship naturally arises out of democracy, and the most aggravated
form of tyranny and slavery out of the most extreme liberty. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20131214/f626ef04/attachment.asc>


More information about the ffmpeg-devel mailing list