Commit 428c59d9 authored by Kostya's avatar Kostya Committed by Anton Khirnov

avtools: reinitialise filter chain when input video stream changes dimensions

Signed-off-by: 's avatarAnton Khirnov <anton@khirnov.net>
parent 24efdea7
...@@ -1211,7 +1211,20 @@ static void do_video_out(AVFormatContext *s, ...@@ -1211,7 +1211,20 @@ static void do_video_out(AVFormatContext *s,
sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize, sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
0, ost->resample_height, final_picture->data, final_picture->linesize); 0, ost->resample_height, final_picture->data, final_picture->linesize);
} }
#else
if (resample_changed) {
avfilter_graph_free(&ost->graph);
if (configure_video_filters(ist, ost)) {
fprintf(stderr, "Error reinitialising filters!\n");
exit_program(1);
}
}
#endif #endif
if (resample_changed) {
ost->resample_width = dec->width;
ost->resample_height = dec->height;
ost->resample_pix_fmt = dec->pix_fmt;
}
/* duplicates frame if needed */ /* duplicates frame if needed */
for(i=0;i<nb_frames;i++) { for(i=0;i<nb_frames;i++) {
......
...@@ -1755,6 +1755,8 @@ static int video_thread(void *arg) ...@@ -1755,6 +1755,8 @@ static int video_thread(void *arg)
AVFilterGraph *graph = avfilter_graph_alloc(); AVFilterGraph *graph = avfilter_graph_alloc();
AVFilterContext *filt_out = NULL; AVFilterContext *filt_out = NULL;
int64_t pos; int64_t pos;
int last_w = is->video_st->codec->width;
int last_h = is->video_st->codec->height;
if ((ret = configure_video_filters(graph, is, vfilters)) < 0) if ((ret = configure_video_filters(graph, is, vfilters)) < 0)
goto the_end; goto the_end;
...@@ -1771,6 +1773,18 @@ static int video_thread(void *arg) ...@@ -1771,6 +1773,18 @@ static int video_thread(void *arg)
while (is->paused && !is->videoq.abort_request) while (is->paused && !is->videoq.abort_request)
SDL_Delay(10); SDL_Delay(10);
#if CONFIG_AVFILTER #if CONFIG_AVFILTER
if ( last_w != is->video_st->codec->width
|| last_h != is->video_st->codec->height) {
av_dlog(NULL, "Changing size %dx%d -> %dx%d\n", last_w, last_h,
is->video_st->codec->width, is->video_st->codec->height);
avfilter_graph_free(&graph);
graph = avfilter_graph_alloc();
if ((ret = configure_video_filters(graph, is, vfilters)) < 0)
goto the_end;
filt_out = is->out_video_filter;
last_w = is->video_st->codec->width;
last_h = is->video_st->codec->height;
}
ret = get_filtered_video_frame(filt_out, frame, &picref, &tb); ret = get_filtered_video_frame(filt_out, frame, &picref, &tb);
if (picref) { if (picref) {
pts_int = picref->pts; pts_int = picref->pts;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment