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

Marton Balint git at videolan.org
Sun Jul 1 02:48:59 CEST 2012


ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Fri Jun  8 00:16:49 2012 +0200| [58f22f70121c2c9f4bf9935d00c7ba7948fbe5c0] | committer: Marton Balint

ffplay: only configure video filters after we got the first frame

Otherwise the codec width, height and pixel format values may not be set.

Signed-off-by: Marton Balint <cus at passwd.hu>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=58f22f70121c2c9f4bf9935d00c7ba7948fbe5c0
---

 ffplay.c |   33 ++++++++++++++-------------------
 1 file changed, 14 insertions(+), 19 deletions(-)

diff --git a/ffplay.c b/ffplay.c
index c01740a..164958d 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -1625,13 +1625,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;
 }
 
@@ -1646,28 +1639,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);
@@ -1691,6 +1682,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;
             }



More information about the ffmpeg-cvslog mailing list