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

> From 6291c06dacbe2aa48a97bf36835ec8a3bce8a40a Mon Sep 17 00:00:00 2001
> From: Muhammad Faiz <mfc...@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
>  
> +@subsection Commands
> +
> +Both movie and amovie support the following commands:
> +@table @option
> +@item seek
> +Perform seek using "av_seek_frame".
> +The syntax is: seek @var{stream_index}|@var{timestamp}|@var{flags}
> +@itemize
> +@item
> +@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.
> +@item
> +@var{timestamp}: Timestamp in AVStream.time_base units
> +or, if no stream is specified, in AV_TIME_BASE units.
> +@item
> +@var{flags}: Flags which select direction and seeking mode.
> +@end itemize
> +
> +@item get_duration
> +Get movie duration in AV_TIME_BASE units.
> +
> +@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 */

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to