[PATCH] Implement ffplay.c:configure_video_filters().

Stefano Sabatini stefano.sabatini-lala
Sun Jan 30 19:09:40 CET 2011


Factorize code from ffplay.c:video_thread() and put it in the new
function configure_video_filters().
---
 ffplay.c |   69 +++++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 42 insertions(+), 27 deletions(-)

diff --git a/ffplay.c b/ffplay.c
index 840df66..64b069f 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -211,6 +211,7 @@ typedef struct VideoState {
 
 #if CONFIG_AVFILTER
     AVFilterContext *out_video_filter;          ///<the last filter in the video chain
+    AVFilterGraph *vgraph;                      ///<the video filter graph
 #endif
 
     float skip_frames;
@@ -1782,33 +1783,24 @@ static AVFilter input_filter =
                                   { .name = NULL }},
 };
 
-#endif  /* CONFIG_AVFILTER */
-
-static int video_thread(void *arg)
+static int configure_video_filters(VideoState *is, const char *vfilters)
 {
-    VideoState *is = arg;
-    AVFrame *frame= avcodec_alloc_frame();
-    int64_t pts_int;
-    double pts;
-    int ret;
-
-#if CONFIG_AVFILTER
-    int64_t pos;
     char sws_flags_str[128];
+    int ret;
     FFSinkContext ffsink_ctx = { .pix_fmt = PIX_FMT_YUV420P };
     AVFilterContext *filt_src = NULL, *filt_out = NULL;
-    AVFilterGraph *graph = avfilter_graph_alloc();
+    is->vgraph = avfilter_graph_alloc();
     snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%d", sws_flags);
-    graph->scale_sws_opts = av_strdup(sws_flags_str);
+    is->vgraph->scale_sws_opts = av_strdup(sws_flags_str);
 
-    if (avfilter_graph_create_filter(&filt_src, &input_filter, "src",
-                                     NULL, is, graph) < 0)
-        goto the_end;
-    if (avfilter_graph_create_filter(&filt_out, &ffsink, "out",
-                                     NULL, &ffsink_ctx, graph) < 0)
-        goto the_end;
+    if ((ret = avfilter_graph_create_filter(&filt_src, &input_filter, "src",
+                                            NULL, is, is->vgraph)) < 0)
+        goto fail;
+    if ((ret = avfilter_graph_create_filter(&filt_out, &ffsink, "out",
+                                            NULL, &ffsink_ctx, is->vgraph)) < 0)
+        goto fail;
 
-    if(vfilters) {
+    if (vfilters) {
         AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
         AVFilterInOut *inputs  = av_malloc(sizeof(AVFilterInOut));
 
@@ -1822,17 +1814,40 @@ static int video_thread(void *arg)
         inputs->pad_idx = 0;
         inputs->next    = NULL;
 
-        if (avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL) < 0)
-            goto the_end;
+        if ((ret = avfilter_graph_parse(is->vgraph, vfilters, inputs, outputs, NULL)) < 0)
+            goto fail;
         av_freep(&vfilters);
     } else {
-        if(avfilter_link(filt_src, 0, filt_out, 0) < 0)          goto the_end;
+        if ((ret = avfilter_link(filt_src, 0, filt_out, 0)) < 0)
+            goto fail;
     }
 
-    if (avfilter_graph_config(graph, NULL) < 0)
-        goto the_end;
+    if ((ret = avfilter_graph_config(is->vgraph, NULL)) < 0)
+        goto fail;
 
     is->out_video_filter = filt_out;
+    return 0;
+fail:
+    avfilter_graph_free(is->vgraph);
+    av_freep(&is->vgraph);
+    return ret;
+}
+#endif  /* CONFIG_AVFILTER */
+
+static int video_thread(void *arg)
+{
+    VideoState *is = arg;
+    AVFrame *frame= avcodec_alloc_frame();
+    int64_t pts_int;
+    double pts;
+    int ret;
+#if CONFIG_AVFILTER
+    AVFilterContext *filt_out = NULL;
+    int64_t pos;
+
+    if ((ret = configure_video_filters(is, vfilters)) < 0)
+        goto the_end;
+    filt_out = is->out_video_filter;
 #endif
 
     for(;;) {
@@ -1886,8 +1901,8 @@ static int video_thread(void *arg)
     }
  the_end:
 #if CONFIG_AVFILTER
-    avfilter_graph_free(graph);
-    av_freep(&graph);
+    avfilter_graph_free(is->vgraph);
+    av_freep(&is->vgraph);
 #endif
     av_free(frame);
     return 0;
-- 
1.7.2.3


--cNdxnHkX5QqsyA0e--



More information about the ffmpeg-devel mailing list