]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 23 Oct 2011 14:52:08 +0000 (14:52 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 23 Oct 2011 14:52:08 +0000 (14:52 +0000)
modules/ffmpeg/producer/filter/filter.cpp

index e55524d91387378f6ee750fd26328c95dbc1e1eb..8fc266a65ee5510b5f7945cda0969f3cd144fa05 100644 (file)
@@ -78,43 +78,51 @@ struct filter::implementation
 \r
                if(!graph_)\r
                {\r
-                       graph_.reset(avfilter_graph_alloc(), [](AVFilterGraph* p){avfilter_graph_free(&p);});\r
+                       try\r
+                       {\r
+                               graph_.reset(avfilter_graph_alloc(), [](AVFilterGraph* p){avfilter_graph_free(&p);});\r
                                                                \r
-                       // Input\r
-                       std::stringstream args;\r
-                       args << frame->width << ":" << frame->height << ":" << frame->format << ":" << 0 << ":" << 0 << ":" << 0 << ":" << 0; // don't care about pts and aspect_ratio\r
-                       THROW_ON_ERROR2(avfilter_graph_create_filter(&buffersrc_ctx_, avfilter_get_by_name("buffer"), "src", args.str().c_str(), NULL, graph_.get()), "[filter]");\r
-\r
-                       // OPIX_FMT_BGRAutput\r
-                       AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();\r
-                       buffersink_params->pixel_fmts = pix_fmts_.data();\r
-                       THROW_ON_ERROR2(avfilter_graph_create_filter(&buffersink_ctx_, avfilter_get_by_name("buffersink"), "out", NULL, buffersink_params, graph_.get()), "[filter]");\r
+                               // Input\r
+                               std::stringstream args;\r
+                               args << frame->width << ":" << frame->height << ":" << frame->format << ":" << 0 << ":" << 0 << ":" << 0 << ":" << 0; // don't care about pts and aspect_ratio\r
+                               THROW_ON_ERROR2(avfilter_graph_create_filter(&buffersrc_ctx_, avfilter_get_by_name("buffer"), "src", args.str().c_str(), NULL, graph_.get()), "[filter]");\r
+\r
+                               // OPIX_FMT_BGRAutput\r
+                               AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();\r
+                               buffersink_params->pixel_fmts = pix_fmts_.data();\r
+                               THROW_ON_ERROR2(avfilter_graph_create_filter(&buffersink_ctx_, avfilter_get_by_name("buffersink"), "out", NULL, buffersink_params, graph_.get()), "[filter]");\r
                        \r
-                       AVFilterInOut* outputs = avfilter_inout_alloc();\r
-                       AVFilterInOut* inputs  = avfilter_inout_alloc();\r
+                               AVFilterInOut* outputs = avfilter_inout_alloc();\r
+                               AVFilterInOut* inputs  = avfilter_inout_alloc();\r
                        \r
-                       outputs->name                   = av_strdup("in");\r
-                       outputs->filter_ctx             = buffersrc_ctx_;\r
-                       outputs->pad_idx                = 0;\r
-                       outputs->next                   = NULL;\r
-\r
-                       inputs->name                    = av_strdup("out");\r
-                       inputs->filter_ctx              = buffersink_ctx_;\r
-                       inputs->pad_idx                 = 0;\r
-                       inputs->next                    = NULL;\r
+                               outputs->name                   = av_strdup("in");\r
+                               outputs->filter_ctx             = buffersrc_ctx_;\r
+                               outputs->pad_idx                = 0;\r
+                               outputs->next                   = NULL;\r
+\r
+                               inputs->name                    = av_strdup("out");\r
+                               inputs->filter_ctx              = buffersink_ctx_;\r
+                               inputs->pad_idx                 = 0;\r
+                               inputs->next                    = NULL;\r
                        \r
-                       THROW_ON_ERROR2(avfilter_graph_parse(graph_.get(), filters_.c_str(), &inputs, &outputs, NULL), "[filter]");\r
+                               THROW_ON_ERROR2(avfilter_graph_parse(graph_.get(), filters_.c_str(), &inputs, &outputs, NULL), "[filter]");\r
                        \r
-                       avfilter_inout_free(&inputs);\r
-                       avfilter_inout_free(&outputs);\r
+                               avfilter_inout_free(&inputs);\r
+                               avfilter_inout_free(&outputs);\r
 \r
-                       THROW_ON_ERROR2(avfilter_graph_config(graph_.get(), NULL), "[filter]");                 \r
+                               THROW_ON_ERROR2(avfilter_graph_config(graph_.get(), NULL), "[filter]");                 \r
 \r
-                       for(size_t n = 0; n < graph_->filter_count; ++n)\r
+                               for(size_t n = 0; n < graph_->filter_count; ++n)\r
+                               {\r
+                                       auto filter_name = graph_->filters[n]->name;\r
+                                       if(strstr(filter_name, "yadif") != 0)\r
+                                               parallel_yadif_ctx_ = make_parallel_yadif(graph_->filters[n]);\r
+                               }\r
+                       }\r
+                       catch(...)\r
                        {\r
-                               auto filter_name = graph_->filters[n]->name;\r
-                               if(strstr(filter_name, "yadif") != 0)\r
-                                       parallel_yadif_ctx_ = make_parallel_yadif(graph_->filters[n]);\r
+                               graph_ = nullptr;\r
+                               throw;\r
                        }\r
                }\r
                        \r