Merge remote-tracking branch 'cus/stable'
* cus/stable: ffplay: fix build if avfilter is disabled ffplay: fix frame_delay calculation in new avfilter code ffplay: add support for changing pixel format ffplay: add missing filt_in assignment after video filter reconfigure ffplay: fix frame aspect ratio after qatar merge ffplay: fix use after free ffplay: use dummy video driver if display is disabled Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
9f7b014ad3
36
ffplay.c
36
ffplay.c
@ -1540,9 +1540,6 @@ static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacke
|
||||
SDL_UnlockMutex(is->pictq_mutex);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
is->frame_last_returned_time = av_gettime() / 1000000.0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
@ -1648,6 +1645,7 @@ static int video_thread(void *arg)
|
||||
AVFilterContext *filt_out = NULL, *filt_in = NULL;
|
||||
int last_w = is->video_st->codec->width;
|
||||
int last_h = is->video_st->codec->height;
|
||||
enum PixelFormat last_format = is->video_st->codec->pix_fmt;
|
||||
|
||||
if ((ret = configure_video_filters(graph, is, vfilters)) < 0) {
|
||||
SDL_Event event;
|
||||
@ -1672,30 +1670,33 @@ static int video_thread(void *arg)
|
||||
ret = get_video_frame(is, frame, &pts_int, &pkt);
|
||||
if (ret < 0)
|
||||
goto the_end;
|
||||
av_free_packet(&pkt);
|
||||
|
||||
if (!ret)
|
||||
if (!ret) {
|
||||
av_free_packet(&pkt);
|
||||
continue;
|
||||
|
||||
is->frame_last_filter_delay = av_gettime() / 1000000.0 - is->frame_last_returned_time;
|
||||
if (fabs(is->frame_last_filter_delay) > AV_NOSYNC_THRESHOLD / 10.0)
|
||||
is->frame_last_filter_delay = 0;
|
||||
}
|
||||
|
||||
#if CONFIG_AVFILTER
|
||||
if ( last_w != is->video_st->codec->width
|
||||
|| last_h != is->video_st->codec->height) {
|
||||
|| last_h != is->video_st->codec->height
|
||||
|| last_format != is->video_st->codec->pix_fmt) {
|
||||
av_log(NULL, AV_LOG_INFO, "Frame changed from size:%dx%d to size:%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)
|
||||
if ((ret = configure_video_filters(graph, is, vfilters)) < 0) {
|
||||
av_free_packet(&pkt);
|
||||
goto the_end;
|
||||
}
|
||||
filt_in = is->in_video_filter;
|
||||
filt_out = is->out_video_filter;
|
||||
last_w = is->video_st->codec->width;
|
||||
last_h = is->video_st->codec->height;
|
||||
last_format = is->video_st->codec->pix_fmt;
|
||||
}
|
||||
|
||||
frame->pts = pts_int;
|
||||
frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
|
||||
if (is->use_dr1) {
|
||||
FrameBuffer *buf = frame->opaque;
|
||||
AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
|
||||
@ -1714,13 +1715,21 @@ static int video_thread(void *arg)
|
||||
} else
|
||||
av_buffersrc_write_frame(filt_in, frame);
|
||||
|
||||
av_free_packet(&pkt);
|
||||
|
||||
while (ret >= 0) {
|
||||
is->frame_last_returned_time = av_gettime() / 1000000.0;
|
||||
|
||||
ret = av_buffersink_get_buffer_ref(filt_out, &picref, 0);
|
||||
if (ret < 0) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
is->frame_last_filter_delay = av_gettime() / 1000000.0 - is->frame_last_returned_time;
|
||||
if (fabs(is->frame_last_filter_delay) > AV_NOSYNC_THRESHOLD / 10.0)
|
||||
is->frame_last_filter_delay = 0;
|
||||
|
||||
avfilter_fill_frame_from_video_buffer_ref(frame, picref);
|
||||
|
||||
pts_int = picref->pts;
|
||||
@ -2300,7 +2309,9 @@ static void stream_component_close(VideoState *is, int stream_index)
|
||||
|
||||
ic->streams[stream_index]->discard = AVDISCARD_ALL;
|
||||
avcodec_close(avctx);
|
||||
#if CONFIG_AVFILTER
|
||||
free_buffer_pool(&is->buffer_pool);
|
||||
#endif
|
||||
switch (avctx->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
is->audio_st = NULL;
|
||||
@ -3060,6 +3071,7 @@ int main(int argc, char **argv)
|
||||
{
|
||||
int flags;
|
||||
VideoState *is;
|
||||
char dummy_videodriver[] = "SDL_VIDEODRIVER=dummy";
|
||||
|
||||
av_log_set_flags(AV_LOG_SKIP_REPEATED);
|
||||
parse_loglevel(argc, argv, options);
|
||||
@ -3097,6 +3109,8 @@ int main(int argc, char **argv)
|
||||
flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
|
||||
if (audio_disable)
|
||||
flags &= ~SDL_INIT_AUDIO;
|
||||
if (display_disable)
|
||||
SDL_putenv(dummy_videodriver); /* For the event queue, we always need a video driver. */
|
||||
#if !defined(__MINGW32__) && !defined(__APPLE__)
|
||||
flags |= SDL_INIT_EVENTTHREAD; /* Not supported on Windows or Mac OS X */
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user