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:
parent
d14deeb6bc
commit
defab0825f
@ -16976,4 +16976,28 @@ movie=dvd.vob:s=v:0+#0x81 [video] [audio]
|
|||||||
@end example
|
@end example
|
||||||
@end itemize
|
@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
|
@c man end MULTIMEDIA SOURCES
|
||||||
|
@ -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
|
#if CONFIG_MOVIE_FILTER
|
||||||
|
|
||||||
AVFILTER_DEFINE_CLASS(movie);
|
AVFILTER_DEFINE_CLASS(movie);
|
||||||
@ -598,6 +641,7 @@ AVFilter ff_avsrc_movie = {
|
|||||||
.inputs = NULL,
|
.inputs = NULL,
|
||||||
.outputs = NULL,
|
.outputs = NULL,
|
||||||
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
|
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
|
||||||
|
.process_command = process_command
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* CONFIG_MOVIE_FILTER */
|
#endif /* CONFIG_MOVIE_FILTER */
|
||||||
@ -619,6 +663,7 @@ AVFilter ff_avsrc_amovie = {
|
|||||||
.outputs = NULL,
|
.outputs = NULL,
|
||||||
.priv_class = &amovie_class,
|
.priv_class = &amovie_class,
|
||||||
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
|
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
|
||||||
|
.process_command = process_command,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* CONFIG_AMOVIE_FILTER */
|
#endif /* CONFIG_AMOVIE_FILTER */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user