X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffplay.c;h=d302793924bcccddca8b196dac5e3439e79ca93c;hb=0acd4e75fdad1b6656a8722e386679ec9f8b0ba7;hp=67cf9ea6ccf41e0948ac669f949139aad78a57e6;hpb=b1f78632c681f32c4901a85aa7ee72bf9ca6fece;p=ffmpeg diff --git a/ffplay.c b/ffplay.c index 67cf9ea6ccf..d302793924b 100644 --- a/ffplay.c +++ b/ffplay.c @@ -31,7 +31,6 @@ #include #include "libavutil/avstring.h" -#include "libavutil/colorspace.h" #include "libavutil/eval.h" #include "libavutil/mathematics.h" #include "libavutil/pixdesc.h" @@ -49,7 +48,6 @@ #include "libswresample/swresample.h" #if CONFIG_AVFILTER -# include "libavfilter/avcodec.h" # include "libavfilter/avfilter.h" # include "libavfilter/buffersink.h" # include "libavfilter/buffersrc.h" @@ -66,7 +64,9 @@ const char program_name[] = "ffplay"; const int program_birth_year = 2003; #define MAX_QUEUE_SIZE (15 * 1024 * 1024) -#define MIN_FRAMES 5 +#define MIN_FRAMES 25 +#define EXTERNAL_CLOCK_MIN_FRAMES 2 +#define EXTERNAL_CLOCK_MAX_FRAMES 10 /* Minimum SDL audio buffer size, in samples. */ #define SDL_AUDIO_MIN_BUFFER_SIZE 512 @@ -102,7 +102,7 @@ const int program_birth_year = 2003; #define CURSOR_HIDE_DELAY 1000000 -static int64_t sws_flags = SWS_BICUBIC; +static unsigned sws_flags = SWS_BICUBIC; typedef struct MyAVPacketList { AVPacket pkt; @@ -1301,11 +1301,11 @@ static double get_master_clock(VideoState *is) } static void check_external_clock_speed(VideoState *is) { - if (is->video_stream >= 0 && is->videoq.nb_packets <= MIN_FRAMES / 2 || - is->audio_stream >= 0 && is->audioq.nb_packets <= MIN_FRAMES / 2) { + if (is->video_stream >= 0 && is->videoq.nb_packets <= EXTERNAL_CLOCK_MIN_FRAMES || + is->audio_stream >= 0 && is->audioq.nb_packets <= EXTERNAL_CLOCK_MIN_FRAMES) { set_clock_speed(&is->extclk, FFMAX(EXTERNAL_CLOCK_SPEED_MIN, is->extclk.speed - EXTERNAL_CLOCK_SPEED_STEP)); - } else if ((is->video_stream < 0 || is->videoq.nb_packets > MIN_FRAMES * 2) && - (is->audio_stream < 0 || is->audioq.nb_packets > MIN_FRAMES * 2)) { + } else if ((is->video_stream < 0 || is->videoq.nb_packets > EXTERNAL_CLOCK_MAX_FRAMES) && + (is->audio_stream < 0 || is->audioq.nb_packets > EXTERNAL_CLOCK_MAX_FRAMES)) { set_clock_speed(&is->extclk, FFMIN(EXTERNAL_CLOCK_SPEED_MAX, is->extclk.speed + EXTERNAL_CLOCK_SPEED_STEP)); } else { double speed = is->extclk.speed; @@ -1677,7 +1677,18 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, double av_picture_copy(&pict, (AVPicture *)src_frame, src_frame->format, vp->width, vp->height); #else - av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags); + { + AVDictionaryEntry *e = av_dict_get(sws_dict, "sws_flags", NULL, 0); + if (e) { + const AVClass *class = sws_get_class(); + const AVOption *o = av_opt_find(&class, "sws_flags", NULL, 0, + AV_OPT_SEARCH_FAKE_OBJ); + int ret = av_opt_eval_flags(&class, o, e->value, &sws_flags); + if (ret < 0) + exit(1); + } + } + is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx, vp->width, vp->height, src_frame->format, vp->width, vp->height, AV_PIX_FMT_YUV420P, sws_flags, NULL, NULL, NULL); @@ -1787,15 +1798,23 @@ fail: static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const char *vfilters, AVFrame *frame) { static const enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }; - char sws_flags_str[128]; + char sws_flags_str[512] = ""; char buffersrc_args[256]; int ret; AVFilterContext *filt_src = NULL, *filt_out = NULL, *last_filter = NULL; AVCodecContext *codec = is->video_st->codec; AVRational fr = av_guess_frame_rate(is->ic, is->video_st, NULL); + AVDictionaryEntry *e = NULL; + + while ((e = av_dict_get(sws_dict, "", e, AV_DICT_IGNORE_SUFFIX))) { + if (!strcmp(e->key, "sws_flags")) { + av_strlcatf(sws_flags_str, sizeof(sws_flags_str), "%s=%s:", "flags", e->value); + } else + av_strlcatf(sws_flags_str, sizeof(sws_flags_str), "%s=%s:", e->key, e->value); + } + if (strlen(sws_flags_str)) + sws_flags_str[strlen(sws_flags_str)-1] = '\0'; - av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags); - snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%"PRId64, sws_flags); graph->scale_sws_opts = av_strdup(sws_flags_str); snprintf(buffersrc_args, sizeof(buffersrc_args), @@ -2557,11 +2576,15 @@ static int stream_component_open(VideoState *is, int stream_index) } av_codec_set_lowres(avctx, stream_lowres); +#if FF_API_EMU_EDGE if(stream_lowres) avctx->flags |= CODEC_FLAG_EMU_EDGE; +#endif if (fast) avctx->flags2 |= AV_CODEC_FLAG2_FAST; +#if FF_API_EMU_EDGE if(codec->capabilities & AV_CODEC_CAP_DR1) avctx->flags |= CODEC_FLAG_EMU_EDGE; +#endif opts = filter_codec_opts(codec_opts, avctx->codec_id, ic, ic->streams[stream_index], codec); if (!av_dict_get(opts, "threads", NULL, 0))