mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avtools: reinitialise filter chain when input video stream changes dimensions
Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
parent
24efdea7fd
commit
428c59d911
13
avconv.c
13
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++) {
|
||||
|
14
avplay.c
14
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;
|
||||
|
Loading…
Reference in New Issue
Block a user