You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
ffmpeg: Make video filter graph reinit user selectable
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
5
ffmpeg.c
5
ffmpeg.c
@@ -1610,12 +1610,13 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
|
|||||||
ist->resample_height = decoded_frame->height;
|
ist->resample_height = decoded_frame->height;
|
||||||
ist->resample_pix_fmt = decoded_frame->format;
|
ist->resample_pix_fmt = decoded_frame->format;
|
||||||
|
|
||||||
for (i = 0; i < nb_filtergraphs; i++)
|
for (i = 0; i < nb_filtergraphs; i++) {
|
||||||
if (ist_in_filtergraph(filtergraphs[i], ist) &&
|
if (ist_in_filtergraph(filtergraphs[i], ist) && ist->reinit_filters &&
|
||||||
configure_filtergraph(filtergraphs[i]) < 0) {
|
configure_filtergraph(filtergraphs[i]) < 0) {
|
||||||
av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
|
av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
|
frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
|
||||||
|
4
ffmpeg.h
4
ffmpeg.h
@@ -161,6 +161,8 @@ typedef struct OptionsContext {
|
|||||||
int nb_copy_prior_start;
|
int nb_copy_prior_start;
|
||||||
SpecifierOpt *filters;
|
SpecifierOpt *filters;
|
||||||
int nb_filters;
|
int nb_filters;
|
||||||
|
SpecifierOpt *reinit_filters;
|
||||||
|
int nb_reinit_filters;
|
||||||
SpecifierOpt *fix_sub_duration;
|
SpecifierOpt *fix_sub_duration;
|
||||||
int nb_fix_sub_duration;
|
int nb_fix_sub_duration;
|
||||||
SpecifierOpt *pass;
|
SpecifierOpt *pass;
|
||||||
@@ -253,6 +255,8 @@ typedef struct InputStream {
|
|||||||
* currently video and audio only */
|
* currently video and audio only */
|
||||||
InputFilter **filters;
|
InputFilter **filters;
|
||||||
int nb_filters;
|
int nb_filters;
|
||||||
|
|
||||||
|
int reinit_filters;
|
||||||
} InputStream;
|
} InputStream;
|
||||||
|
|
||||||
typedef struct InputFile {
|
typedef struct InputFile {
|
||||||
|
@@ -579,6 +579,9 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
|
|||||||
|
|
||||||
ist->dec = choose_decoder(o, ic, st);
|
ist->dec = choose_decoder(o, ic, st);
|
||||||
|
|
||||||
|
ist->reinit_filters = -1;
|
||||||
|
MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
|
||||||
|
|
||||||
switch (dec->codec_type) {
|
switch (dec->codec_type) {
|
||||||
case AVMEDIA_TYPE_VIDEO:
|
case AVMEDIA_TYPE_VIDEO:
|
||||||
if(!ist->dec)
|
if(!ist->dec)
|
||||||
@@ -2341,6 +2344,8 @@ const OptionDef options[] = {
|
|||||||
"set profile", "profile" },
|
"set profile", "profile" },
|
||||||
{ "filter", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(filters) },
|
{ "filter", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(filters) },
|
||||||
"set stream filterchain", "filter_list" },
|
"set stream filterchain", "filter_list" },
|
||||||
|
{ "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(reinit_filters) },
|
||||||
|
"reinit filtergraph on input parameter changes", "" },
|
||||||
{ "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
|
{ "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
|
||||||
"create a complex filtergraph", "graph_description" },
|
"create a complex filtergraph", "graph_description" },
|
||||||
{ "stats", OPT_BOOL, { &print_stats },
|
{ "stats", OPT_BOOL, { &print_stats },
|
||||||
|
Reference in New Issue
Block a user