\r
audio_buffer mix(const video_format_desc& format_desc)\r
{ \r
- CASPAR_ASSERT(format_desc.audio_channels == 2);\r
- CASPAR_ASSERT(format_desc.audio_samples_per_frame % 4 == 0);\r
+ //CASPAR_ASSERT(format_desc.audio_channels == 2);\r
+ //CASPAR_ASSERT(format_desc.audio_samples_per_frame % 4 == 0);\r
\r
// NOTE: auto data should be larger than format_desc_.audio_samples_per_frame to allow sse to read/write beyond size.\r
\r
//colored_fputs(av_clip(level>>3, 0, 6), line);\r
}\r
\r
+//static int query_yadif_formats(AVFilterContext *ctx)
+//{
+// static const int pix_fmts[] = {
+// PIX_FMT_YUV444P,
+// PIX_FMT_YUV422P,
+// PIX_FMT_YUV420P,
+// PIX_FMT_YUV410P,
+// PIX_FMT_YUV411P,
+// PIX_FMT_GRAY8,
+// PIX_FMT_YUVJ444P,
+// PIX_FMT_YUVJ422P,
+// PIX_FMT_YUVJ420P,
+// AV_NE( PIX_FMT_GRAY16BE, PIX_FMT_GRAY16LE ),
+// PIX_FMT_YUV440P,
+// PIX_FMT_YUVJ440P,
+// AV_NE( PIX_FMT_YUV444P16BE, PIX_FMT_YUV444P16LE ),
+// AV_NE( PIX_FMT_YUV422P16BE, PIX_FMT_YUV422P16LE ),
+// AV_NE( PIX_FMT_YUV420P16BE, PIX_FMT_YUV420P16LE ),
+// PIX_FMT_YUVA420P,
+// PIX_FMT_NONE
+// };
+// avfilter_set_common_pixel_formats(ctx, avfilter_make_format_list(pix_fmts));
+//
+// return 0;
+//}\r
+//\r
+//#pragma warning (push)\r
+//#pragma warning (disable : 4706)\r
+//void fix_yadif_filter_format_query()\r
+//{\r
+// AVFilter** filter = nullptr;
+// while((filter = av_filter_next(filter)) && *filter)\r
+// {\r
+// if(strstr((*filter)->name, "yadif") != 0)\r
+// (*filter)->query_formats = query_yadif_formats;\r
+// }\r
+//}\r
+//#pragma warning (pop)\r
+\r
void init()\r
{\r
avfilter_register_all();\r
+ //fix_yadif_filter_format_query();\r
av_register_all();\r
avcodec_init();\r
avcodec_register_all();\r
std::shared_ptr<void> parallel_yadif_ctx_;\r
std::vector<PixelFormat> pix_fmts_;\r
std::queue<std::shared_ptr<AVFrame>> bypass_;\r
+ int in_format_;\r
+ bool warned_;\r
\r
implementation(const std::wstring& filters, const std::vector<PixelFormat>& pix_fmts) \r
: filters_(narrow(filters))\r
, parallel_yadif_ctx_(nullptr)\r
, pix_fmts_(pix_fmts)\r
+ , in_format_(0)\r
+ , warned_(false)\r
{\r
if(pix_fmts_.empty())\r
{\r
- pix_fmts_.push_back(PIX_FMT_YUV420P);\r
pix_fmts_.push_back(PIX_FMT_YUVA420P);\r
- pix_fmts_.push_back(PIX_FMT_YUV422P);\r
pix_fmts_.push_back(PIX_FMT_YUV444P);\r
+ pix_fmts_.push_back(PIX_FMT_YUV422P);\r
+ pix_fmts_.push_back(PIX_FMT_YUV420P);\r
pix_fmts_.push_back(PIX_FMT_YUV411P);\r
pix_fmts_.push_back(PIX_FMT_ARGB);\r
pix_fmts_.push_back(PIX_FMT_RGBA);\r
{\r
try\r
{\r
+ in_format_ = frame->format;\r
graph_.reset(avfilter_graph_alloc(), [](AVFilterGraph* p){avfilter_graph_free(&p);});\r
\r
// Input\r
frame->pict_type = picref->video->pict_type;\r
frame->sample_aspect_ratio = picref->video->sample_aspect_ratio;\r
\r
+ // HACK: Workaround for missing format bug in libavfilter.\r
+ if(frame->format == 0)\r
+ {\r
+ if(in_format_ == PIX_FMT_YUV444P10)\r
+ frame->format = PIX_FMT_YUV420P;//PIX_FMT_YUV444P;\r
+ else if(in_format_ == PIX_FMT_YUV422P10)\r
+ frame->format = PIX_FMT_YUV420P;//PIX_FMT_YUV422P;\r
+ else\r
+ BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("libavfilter bug: Mframe format == 0."));\r
+ \r
+ if(!warned_)\r
+ {\r
+ CASPAR_LOG(warning) << "[ffmpeg] libavfilter bug workaround: frame format == 0, guessing PIX_FMT_YUV420P.";\r
+ warned_ = true;\r
+ }\r
+ }\r
+\r
return frame;\r
}\r
}\r
filter_.push(video_frame);\r
BOOST_FOREACH(auto& av_frame, filter_.poll_all())\r
{\r
- av_frame->format = format;\r
+ if(video_frame->format == PIX_FMT_GRAY8 && format == CASPAR_PIX_FMT_LUMA)\r
+ av_frame->format = format;\r
+\r
video_streams_.back().push(make_write_frame(this, av_frame, frame_factory_, hints));\r
++video_frame_count_;\r
}\r
// Use sws_scale when provided colorspace has no hw-accel.\r
safe_ptr<AVFrame> av_frame(avcodec_alloc_frame(), av_free); \r
avcodec_get_frame_defaults(av_frame.get()); \r
- avpicture_fill(reinterpret_cast<AVPicture*>(av_frame.get()), write->image_data().begin(), PIX_FMT_BGRA, width, height);\r
- \r
+ auto size = avpicture_fill(reinterpret_cast<AVPicture*>(av_frame.get()), write->image_data().begin(), PIX_FMT_BGRA, width, height);\r
+ CASPAR_VERIFY(size == write->image_data().size()); \r
+\r
sws_scale(sws_context.get(), decoded_frame->data, decoded_frame->linesize, 0, height, av_frame->data, av_frame->linesize); \r
pool.push(sws_context);\r
\r