diff options
author | Kostya <kostya.shishkov@gmail.com> | 2011-08-13 20:44:04 +0400 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2011-08-15 13:53:40 +0400 |
commit | 428c59d9114ac97754f2bc06d07c4d1ba1860464 (patch) | |
tree | 39f0ff8a4d1c3a1906be68c54913a4bd227845b0 | |
parent | 24efdea7fd024431f8ddd2b08c9390eba08c91f1 (diff) |
avtools: reinitialise filter chain when input video stream changes dimensions
Signed-off-by: Anton Khirnov <anton@khirnov.net>
-rw-r--r-- | avconv.c | 13 | ||||
-rw-r--r-- | avplay.c | 14 |
2 files changed, 27 insertions, 0 deletions
@@ -1211,7 +1211,20 @@ static void do_video_out(AVFormatContext *s, sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_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 + if (resample_changed) { + ost->resample_width = dec->width; + ost->resample_height = dec->height; + ost->resample_pix_fmt = dec->pix_fmt; + } /* duplicates frame if needed */ for(i=0;i<nb_frames;i++) { @@ -1755,6 +1755,8 @@ static int video_thread(void *arg) AVFilterGraph *graph = avfilter_graph_alloc(); AVFilterContext *filt_out = NULL; 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) goto the_end; @@ -1771,6 +1773,18 @@ static int video_thread(void *arg) while (is->paused && !is->videoq.abort_request) SDL_Delay(10); #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); if (picref) { pts_int = picref->pts; |