avfilter/src_movie: add various commands

add seek command
add get_duration command

Update to codecpar by commiter

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Muhammad Faiz
2016-02-17 23:20:08 +07:00
committed by Michael Niedermayer
parent d14deeb6bc
commit defab0825f
2 changed files with 69 additions and 0 deletions

View File

@@ -582,6 +582,49 @@ 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, i;
int64_t ts;
char tail[2];
if (sscanf(args, "%i|%"SCNi64"|%i %1s", &idx, &ts, &flags, tail) != 3)
return AVERROR(EINVAL);
ret = av_seek_frame(movie->format_ctx, idx, ts, flags);
if (ret < 0)
return ret;
for (i = 0; i < ctx->nb_outputs; i++) {
avcodec_flush_buffers(movie->st[i].codec_ctx);
movie->st[i].done = 0;
}
return ret;
} 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);
@@ -598,6 +641,7 @@ AVFilter ff_avsrc_movie = {
.inputs = NULL,
.outputs = NULL,
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
.process_command = process_command
};
#endif /* CONFIG_MOVIE_FILTER */
@@ -619,6 +663,7 @@ AVFilter ff_avsrc_amovie = {
.outputs = NULL,
.priv_class = &amovie_class,
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
.process_command = process_command,
};
#endif /* CONFIG_AMOVIE_FILTER */