]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/producer/filter/filter.cpp
2.0. ffmpeg_producer: Filter cleanup and bug fixes.
[casparcg] / modules / ffmpeg / producer / filter / filter.cpp
index 39303c5140f6c27df146b753cf5ca61d8f3d0fcc..04abf815818ab402a91e0e0c57945f0c8de31615 100644 (file)
@@ -35,14 +35,10 @@ struct filter::implementation
        AVFilterContext*                                                video_in_filter_;\r
        AVFilterContext*                                                video_out_filter_;\r
 \r
-       boost::circular_buffer<std::shared_ptr<AVFilterBufferRef>> buffers_;\r
-               \r
        implementation(const std::string& filters) \r
                : filters_(filters)\r
        {\r
                std::transform(filters_.begin(), filters_.end(), filters_.begin(), ::tolower);\r
-\r
-               buffers_.set_capacity(3);\r
        }\r
 \r
        void push(const safe_ptr<AVFrame>& frame)\r
@@ -102,7 +98,7 @@ struct filter::implementation
                        }\r
                }\r
        \r
-               errn = av_vsrc_buffer_add_frame(video_in_filter_, frame.get(), AV_VSRC_BUF_FLAG_OVERWRITE);\r
+               errn = av_vsrc_buffer_add_frame(video_in_filter_, frame.get(), 0);\r
                if(errn < 0)\r
                {\r
                        BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(av_error_str(errn)) <<\r
@@ -137,9 +133,15 @@ struct filter::implementation
                                boost::errinfo_api_function("avfilter_request_frame") << boost::errinfo_errno(AVUNERROR(errn)));\r
                }\r
                \r
+               auto cur_buf = link->cur_buf;\r
                auto pic = reinterpret_cast<AVPicture*>(link->cur_buf->buf);\r
                \r
-               safe_ptr<AVFrame> frame(avcodec_alloc_frame(), av_free);\r
+               safe_ptr<AVFrame> frame(avcodec_alloc_frame(), [=](AVFrame* p)\r
+               {\r
+                       av_free(p);\r
+                       avfilter_unref_buffer(cur_buf);\r
+               });\r
+\r
                avcodec_get_frame_defaults(frame.get());        \r
 \r
                for(size_t n = 0; n < 4; ++n)\r
@@ -148,7 +150,6 @@ struct filter::implementation
                        frame->linesize[n]      = pic->linesize[n];\r
                }\r
 \r
-               // FIXME\r
                frame->width                    = link->cur_buf->video->w;\r
                frame->height                   = link->cur_buf->video->h;\r
                frame->format                   = link->cur_buf->format;\r
@@ -156,20 +157,8 @@ struct filter::implementation
                frame->top_field_first  = link->cur_buf->video->top_field_first;\r
                frame->key_frame                = link->cur_buf->video->key_frame;\r
 \r
-               buffers_.push_back(std::shared_ptr<AVFilterBufferRef>(link->cur_buf, avfilter_unref_buffer));\r
-\r
                return frame;\r
        }\r
-\r
-       void skip()\r
-       {\r
-               int errn = avfilter_poll_frame(video_out_filter_->inputs[0]);\r
-               if(errn < 0)\r
-               {\r
-                       BOOST_THROW_EXCEPTION(caspar_exception() <<     msg_info(av_error_str(errn)) <<\r
-                               boost::errinfo_api_function("avfilter_poll_frame") << boost::errinfo_errno(AVUNERROR(errn)));\r
-               }\r
-       }\r
 };\r
 \r
 filter::filter(const std::string& filters) : impl_(new implementation(filters)){}\r