[FFmpeg-devel] [PATCH] avfilter/src_movie: add various commands

wm4 nfxjfg at googlemail.com
Wed Feb 17 16:20:38 CET 2016


On Wed, 17 Feb 2016 21:30:20 +0700
Muhammad Faiz <mfcc64 at gmail.com> wrote:

> From 6291c06dacbe2aa48a97bf36835ec8a3bce8a40a Mon Sep 17 00:00:00 2001
> From: Muhammad Faiz <mfcc64 at gmail.com>
> Date: Wed, 17 Feb 2016 21:21:12 +0700
> Subject: [PATCH] avfilter/src_movie: add various commands
> 
> add seek command
> add get_duration command
> ---
>  doc/filters.texi        | 24 ++++++++++++++++++++++++
>  libavfilter/src_movie.c | 37 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 61 insertions(+)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 68f54f1..a9eecf1 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -15897,4 +15897,28 @@ movie=dvd.vob:s=v:0+#0x81 [video] [audio]
>  @end example
>  @end itemize
>  
> + at subsection Commands
> +
> +Both movie and amovie support the following commands:
> + at table @option
> + at item seek
> +Perform seek using "av_seek_frame".
> +The syntax is: seek @var{stream_index}|@var{timestamp}|@var{flags}
> + at itemize
> + at item
> + at var{stream_index}: If stream_index is -1, a default
> +stream is selected, and @var{timestamp} is automatically converted
> +from AV_TIME_BASE units to the stream specific time_base.
> + at item
> + at var{timestamp}: Timestamp in AVStream.time_base units
> +or, if no stream is specified, in AV_TIME_BASE units.
> + at item
> + at var{flags}: Flags which select direction and seeking mode.
> + at end itemize
> +
> + at item get_duration
> +Get movie duration in AV_TIME_BASE units.
> +
> + at end table
> +
>  @c man end MULTIMEDIA SOURCES
> diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
> index 82d2bcd..cc75e5f 100644
> --- a/libavfilter/src_movie.c
> +++ b/libavfilter/src_movie.c
> @@ -573,6 +573,41 @@ static int movie_request_frame(AVFilterLink *outlink)
>      }
>  }
>  
> +static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
> +                           char *res, int res_len, int flags)
> +{
> +    MovieContext *movie = ctx->priv;
> +    int ret = AVERROR(ENOSYS);
> +
> +    if (!strcmp(cmd, "seek")) {
> +        int idx, flags;
> +        int64_t ts;
> +        char tail[2];
> +
> +        if (sscanf(args, "%i|%"SCNi64"|%i %1s", &idx, &ts, &flags, tail) != 3)
> +            return AVERROR(EINVAL);
> +
> +        return av_seek_frame(movie->format_ctx, idx, ts, flags);

This can't work correctly. You have to flush the decoder (which you
could easily do, but fail to do here), and the filters (which you can't
do unless you add seeking and/or flushing support to libavfilter).

Possibly it happens to work for you because there are no filters with
much buffering and you didn't try video.

> +    } else if (!strcmp(cmd, "get_duration")) {
> +        int print_len;
> +        char tail[2];
> +
> +        if (!res || res_len <= 0)
> +            return AVERROR(EINVAL);
> +
> +        if (args && sscanf(args, "%1s", tail) == 1)
> +            return AVERROR(EINVAL);
> +
> +        print_len = snprintf(res, res_len, "%"PRId64, movie->format_ctx->duration);
> +        if (print_len < 0 || print_len >= res_len)
> +            return AVERROR(EINVAL);
> +
> +        return 0;
> +    }
> +
> +    return ret;
> +}
> +
>  #if CONFIG_MOVIE_FILTER
>  
>  AVFILTER_DEFINE_CLASS(movie);
> @@ -589,6 +624,7 @@ AVFilter ff_avsrc_movie = {
>      .inputs    = NULL,
>      .outputs   = NULL,
>      .flags     = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
> +    .process_command = process_command
>  };
>  
>  #endif  /* CONFIG_MOVIE_FILTER */
> @@ -610,6 +646,7 @@ AVFilter ff_avsrc_amovie = {
>      .outputs    = NULL,
>      .priv_class = &amovie_class,
>      .flags      = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
> +    .process_command = process_command,
>  };
>  
>  #endif /* CONFIG_AMOVIE_FILTER */



More information about the ffmpeg-devel mailing list