X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fffmpeg%2Fproducer%2Ffilter%2Ffilter.cpp;h=2475bf7101c50a2fef37ead3b18acc50cc4f7ef7;hb=ea8490603358f327d8e0c2c90c1401165e7015b4;hp=9478d523fafd7a96a0440c61d8291262e38bf380;hpb=6b8b752068674445e735f076ca96588c39e77f5e;p=casparcg diff --git a/modules/ffmpeg/producer/filter/filter.cpp b/modules/ffmpeg/producer/filter/filter.cpp index 9478d523f..2475bf710 100644 --- a/modules/ffmpeg/producer/filter/filter.cpp +++ b/modules/ffmpeg/producer/filter/filter.cpp @@ -31,20 +31,6 @@ extern "C" namespace caspar { -PixelFormat pix_fmts[] = -{ - PIX_FMT_YUV420P, - PIX_FMT_YUVA420P, - PIX_FMT_YUV422P, - PIX_FMT_YUV444P, - PIX_FMT_YUV411P, - PIX_FMT_ARGB, - PIX_FMT_RGBA, - PIX_FMT_ABGR, - PIX_FMT_GRAY8, - PIX_FMT_NONE -}; - struct filter::implementation { std::string filters_; @@ -52,11 +38,29 @@ struct filter::implementation AVFilterContext* buffersink_ctx_; AVFilterContext* buffersrc_ctx_; std::shared_ptr parallel_yadif_ctx_; + std::vector pix_fmts_; - implementation(const std::wstring& filters) + implementation(const std::wstring& filters, const std::vector& pix_fmts) : filters_(narrow(filters)) , parallel_yadif_ctx_(nullptr) + , pix_fmts_(pix_fmts) { + if(pix_fmts_.empty()) + { + pix_fmts_.push_back(PIX_FMT_YUV420P); + pix_fmts_.push_back(PIX_FMT_YUVA420P); + pix_fmts_.push_back(PIX_FMT_YUV422P); + pix_fmts_.push_back(PIX_FMT_YUV444P); + pix_fmts_.push_back(PIX_FMT_YUV411P); + pix_fmts_.push_back(PIX_FMT_ARGB); + pix_fmts_.push_back(PIX_FMT_RGBA); + pix_fmts_.push_back(PIX_FMT_ABGR); + pix_fmts_.push_back(PIX_FMT_GRAY8); + pix_fmts_.push_back(PIX_FMT_NONE); + } + else + pix_fmts_.push_back(PIX_FMT_NONE); + std::transform(filters_.begin(), filters_.end(), filters_.begin(), ::tolower); } @@ -84,7 +88,7 @@ struct filter::implementation THROW_ON_ERROR2(avfilter_graph_create_filter(&buffersrc_ctx_, avfilter_get_by_name("buffer"), "src", args.str().c_str(), NULL, graph_.get()), "[filter]"); // OPIX_FMT_BGRAutput - THROW_ON_ERROR2(avfilter_graph_create_filter(&buffersink_ctx_, avfilter_get_by_name("buffersink"), "out", NULL, pix_fmts, graph_.get()), "[filter]"); + THROW_ON_ERROR2(avfilter_graph_create_filter(&buffersink_ctx_, avfilter_get_by_name("buffersink"), "out", NULL, pix_fmts_.data(), graph_.get()), "[filter]"); AVFilterInOut* outputs = avfilter_inout_alloc(); AVFilterInOut* inputs = avfilter_inout_alloc(); @@ -159,7 +163,7 @@ struct filter::implementation } }; -filter::filter(const std::wstring& filters) : impl_(new implementation(filters)){} +filter::filter(const std::wstring& filters, const std::vector& pix_fmts) : impl_(new implementation(filters, pix_fmts)){} filter::filter(filter&& other) : impl_(std::move(other.impl_)){} filter& filter::operator=(filter&& other){impl_ = std::move(other.impl_); return *this;} std::vector> filter::execute(const std::shared_ptr& frame) {return impl_->execute(frame);}