aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya <kostya.shishkov@gmail.com>2011-08-13 16:44:04 +0000
committerAnton Khirnov <anton@khirnov.net>2011-08-15 11:53:40 +0200
commit428c59d9114ac97754f2bc06d07c4d1ba1860464 (patch)
tree39f0ff8a4d1c3a1906be68c54913a4bd227845b0
parent24efdea7fd024431f8ddd2b08c9390eba08c91f1 (diff)
downloadffmpeg-428c59d9114ac97754f2bc06d07c4d1ba1860464.tar.gz
avtools: reinitialise filter chain when input video stream changes dimensions
Signed-off-by: Anton Khirnov <anton@khirnov.net>
-rw-r--r--avconv.c13
-rw-r--r--avplay.c14
2 files changed, 27 insertions, 0 deletions
diff --git a/avconv.c b/avconv.c
index 877079c887..18c5f07380 100644
--- a/avconv.c
+++ b/avconv.c
@@ -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++) {
diff --git a/avplay.c b/avplay.c
index e9b58a817f..710c1b5469 100644
--- a/avplay.c
+++ b/avplay.c
@@ -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;