[FFmpeg-devel] [PATCH] ffplay: only configure video filters after we got the first frame

Marton Balint cus at passwd.hu
Sat Jun 30 19:30:48 CEST 2012



On Sun, 24 Jun 2012, Marton Balint wrote:

> Otherwise the codec width, height and pixel format values may not be set.
>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
> ffplay.c |   33 ++++++++++++++-------------------
> 1 files changed, 14 insertions(+), 19 deletions(-)

Michael, please merge from ffplay stable for this patch.

Thanks,
Marton

>
> diff --git a/ffplay.c b/ffplay.c
> index b9104ec..965b96b 100644
> --- a/ffplay.c
> +++ b/ffplay.c
> @@ -1621,13 +1621,6 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
>     is->in_video_filter  = filt_src;
>     is->out_video_filter = filt_out;
>
> -    if (codec->codec->capabilities & CODEC_CAP_DR1) {
> -        is->use_dr1 = 1;
> -        codec->get_buffer     = codec_get_buffer;
> -        codec->release_buffer = codec_release_buffer;
> -        codec->opaque         = &is->buffer_pool;
> -    }
> -
>     return ret;
> }
>
> @@ -1642,28 +1635,26 @@ static int video_thread(void *arg)
>     int ret;
>
> #if CONFIG_AVFILTER
> +    AVCodecContext *codec = is->video_st->codec;
>     AVFilterGraph *graph = avfilter_graph_alloc();
>     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;
> +    int last_w = 0;
> +    int last_h = 0;
> +    enum PixelFormat last_format = -2;
>
> -    if ((ret = configure_video_filters(graph, is, vfilters)) < 0) {
> -        SDL_Event event;
> -        event.type = FF_QUIT_EVENT;
> -        event.user.data1 = is;
> -        SDL_PushEvent(&event);
> -        goto the_end;
> +    if (codec->codec->capabilities & CODEC_CAP_DR1) {
> +        is->use_dr1 = 1;
> +        codec->get_buffer     = codec_get_buffer;
> +        codec->release_buffer = codec_release_buffer;
> +        codec->opaque         = &is->buffer_pool;
>     }
> -    filt_in  = is->in_video_filter;
> -    filt_out = is->out_video_filter;
> #endif
>
>     for (;;) {
>         AVPacket pkt;
> #if CONFIG_AVFILTER
>         AVFilterBufferRef *picref;
> -        AVRational tb = filt_out->inputs[0]->time_base;
> +        AVRational tb;
> #endif
>         while (is->paused && !is->videoq.abort_request)
>             SDL_Delay(10);
> @@ -1687,6 +1678,10 @@ static int video_thread(void *arg)
>             avfilter_graph_free(&graph);
>             graph = avfilter_graph_alloc();
>             if ((ret = configure_video_filters(graph, is, vfilters)) < 0) {
> +                SDL_Event event;
> +                event.type = FF_QUIT_EVENT;
> +                event.user.data1 = is;
> +                SDL_PushEvent(&event);
>                 av_free_packet(&pkt);
>                 goto the_end;
>             }
> -- 
> 1.7.3.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list