OSDN Git Service

doc/examples/filtering_video: add some error handling in init_filters()
authorStefano Sabatini <stefasab@gmail.com>
Mon, 2 Dec 2013 13:25:45 +0000 (14:25 +0100)
committerStefano Sabatini <stefasab@gmail.com>
Mon, 2 Dec 2013 13:35:39 +0000 (14:35 +0100)
doc/examples/filtering_video.c

index c933320..07badd5 100644 (file)
@@ -85,7 +85,7 @@ static int open_input_file(const char *filename)
 static int init_filters(const char *filters_descr)
 {
     char args[512];
-    int ret;
+    int ret = 0;
     AVFilter *buffersrc  = avfilter_get_by_name("buffer");
     AVFilter *buffersink = avfilter_get_by_name("buffersink");
     AVFilterInOut *outputs = avfilter_inout_alloc();
@@ -94,6 +94,10 @@ static int init_filters(const char *filters_descr)
     AVBufferSinkParams *buffersink_params;
 
     filter_graph = avfilter_graph_alloc();
+    if (!outputs || !inputs || !filter_graph) {
+        ret = AVERROR(ENOMEM);
+        goto end;
+    }
 
     /* buffer video source: the decoded frames from the decoder will be inserted here. */
     snprintf(args, sizeof(args),
@@ -106,7 +110,7 @@ static int init_filters(const char *filters_descr)
                                        args, NULL, filter_graph);
     if (ret < 0) {
         av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
-        return ret;
+        goto end;
     }
 
     /* buffer video sink: to terminate the filter chain. */
@@ -117,7 +121,7 @@ static int init_filters(const char *filters_descr)
     av_free(buffersink_params);
     if (ret < 0) {
         av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
-        return ret;
+        goto end;
     }
 
     /* Endpoints for the filter graph. */
@@ -133,11 +137,16 @@ static int init_filters(const char *filters_descr)
 
     if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
                                     &inputs, &outputs, NULL)) < 0)
-        return ret;
+        goto end;
 
     if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
-        return ret;
-    return 0;
+        goto end;
+
+end:
+    avfilter_inout_free(&inputs);
+    avfilter_inout_free(&outputs);
+
+    return ret;
 }
 
 static void display_frame(const AVFrame *frame, AVRational time_base)