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
}\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
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
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
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