X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fffmpeg%2Fproducer%2Futil%2Futil.cpp;h=82f5e661ea81e9dc48a3950e2404ac91df2fa730;hb=435cf4b385c5099270bee44f89c3e2615af30521;hp=f06e3084655a42edf6813978c37df3149d0c3e01;hpb=a20af5a695fe2786762e60f99f0633283514c628;p=casparcg diff --git a/modules/ffmpeg/producer/util/util.cpp b/modules/ffmpeg/producer/util/util.cpp index f06e30846..82f5e661e 100644 --- a/modules/ffmpeg/producer/util/util.cpp +++ b/modules/ffmpeg/producer/util/util.cpp @@ -33,8 +33,8 @@ #include #include +#include #include -#include #include @@ -114,7 +114,7 @@ core::pixel_format get_pixel_format(PixelFormat pix_fmt) } } -core::pixel_format_desc get_pixel_format_desc(PixelFormat pix_fmt, int width, int height) +core::pixel_format_desc pixel_format_desc(PixelFormat pix_fmt, int width, int height) { // Get linesizes AVPicture dummy_pict; @@ -171,7 +171,7 @@ int make_alpha_format(int format) } } -spl::shared_ptr make_write_frame(const void* tag, const spl::shared_ptr& decoded_frame, const spl::shared_ptr& frame_factory, int flags) +core::mutable_frame make_frame(const void* tag, const spl::shared_ptr& decoded_frame, double fps, const spl::shared_ptr& frame_factory, int flags) { static tbb::concurrent_unordered_map>> sws_contexts_; @@ -180,13 +180,11 @@ spl::shared_ptr make_write_frame(const void* tag, const spl:: const auto width = decoded_frame->width; const auto height = decoded_frame->height; - auto desc = get_pixel_format_desc(static_cast(decoded_frame->format), width, height); + auto desc = pixel_format_desc(static_cast(decoded_frame->format), width, height); if(flags & core::frame_producer::flags::alpha_only) - desc = get_pixel_format_desc(static_cast(make_alpha_format(decoded_frame->format)), width, height); - - std::shared_ptr write; - + desc = pixel_format_desc(static_cast(make_alpha_format(decoded_frame->format)), width, height); + if(desc.format == core::pixel_format::invalid) { auto pix_fmt = static_cast(decoded_frame->format); @@ -205,9 +203,9 @@ spl::shared_ptr make_write_frame(const void* tag, const spl:: else if(pix_fmt == PIX_FMT_YUV444P10) target_pix_fmt = PIX_FMT_YUV444P; - auto target_desc = get_pixel_format_desc(target_pix_fmt, width, height); + auto target_desc = pixel_format_desc(target_pix_fmt, width, height); - write = frame_factory->create_frame(tag, target_desc); + auto write = frame_factory->create_frame(tag, target_desc, fps, get_mode(*decoded_frame)); std::shared_ptr sws_context; @@ -233,8 +231,8 @@ spl::shared_ptr make_write_frame(const void* tag, const spl:: avcodec_get_frame_defaults(av_frame.get()); if(target_pix_fmt == PIX_FMT_BGRA) { - auto size = avpicture_fill(reinterpret_cast(av_frame.get()), write->image_data(0).begin(), PIX_FMT_BGRA, width, height); - CASPAR_VERIFY(size == write->image_data(0).size()); + auto size = avpicture_fill(reinterpret_cast(av_frame.get()), write.image_data(0).begin(), PIX_FMT_BGRA, width, height); + CASPAR_VERIFY(size == write.image_data(0).size()); } else { @@ -242,27 +240,29 @@ spl::shared_ptr make_write_frame(const void* tag, const spl:: av_frame->height = height; for(int n = 0; n < target_desc.planes.size(); ++n) { - av_frame->data[n] = write->image_data(n).begin(); + av_frame->data[n] = write.image_data(n).begin(); av_frame->linesize[n] = target_desc.planes[n].linesize; } } sws_scale(sws_context.get(), decoded_frame->data, decoded_frame->linesize, 0, height, av_frame->data, av_frame->linesize); pool.push(sws_context); + + return std::move(write); } else { - write = frame_factory->create_frame(tag, desc); - + auto write = frame_factory->create_frame(tag, desc, fps, get_mode(*decoded_frame)); + for(int n = 0; n < static_cast(desc.planes.size()); ++n) { auto plane = desc.planes[n]; - auto result = write->image_data(n).begin(); + auto result = write.image_data(n).begin(); auto decoded = decoded_frame->data[n]; auto decoded_linesize = decoded_frame->linesize[n]; CASPAR_ASSERT(decoded); - CASPAR_ASSERT(write->image_data(n).begin()); + CASPAR_ASSERT(write.image_data(n).begin()); // Copy line by line since ffmpeg sometimes pads each line. tbb::affinity_partitioner ap; @@ -272,33 +272,21 @@ spl::shared_ptr make_write_frame(const void* tag, const spl:: A_memcpy(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize); }, ap); } - } - - if(decoded_frame->height == 480) // NTSC DV - { - write->get_frame_transform().fill_translation[1] += 2.0/static_cast(frame_factory->get_video_format_desc().height); - write->get_frame_transform().fill_scale[1] = 1.0 - 6.0*1.0/static_cast(frame_factory->get_video_format_desc().height); - } - // Fix field-order if needed - if(get_mode(*decoded_frame) == core::field_mode::lower && frame_factory->get_video_format_desc().field_mode == core::field_mode::upper) - write->get_frame_transform().fill_translation[1] += 1.0/static_cast(frame_factory->get_video_format_desc().height); - else if(get_mode(*decoded_frame) == core::field_mode::upper && frame_factory->get_video_format_desc().field_mode == core::field_mode::lower) - write->get_frame_transform().fill_translation[1] -= 1.0/static_cast(frame_factory->get_video_format_desc().height); - - return spl::make_shared_ptr(write); + return std::move(write); + } } -spl::shared_ptr make_av_frame(caspar::core::data_frame& frame) +spl::shared_ptr make_av_frame(core::mutable_frame& frame) { - std::array data = {}; - for(int n = 0; n < frame.get_pixel_format_desc().planes.size(); ++n) + std::array data = {}; + for(int n = 0; n < frame.pixel_format_desc().planes.size(); ++n) data[n] = frame.image_data(n).begin(); - return make_av_frame(data, frame.get_pixel_format_desc()); + return make_av_frame(data, frame.pixel_format_desc()); } -spl::shared_ptr make_av_frame(std::array data, const core::pixel_format_desc& pix_desc) +spl::shared_ptr make_av_frame(std::array data, const core::pixel_format_desc& pix_desc) { spl::shared_ptr av_frame(avcodec_alloc_frame(), av_free); avcodec_get_frame_defaults(av_frame.get()); @@ -310,7 +298,7 @@ spl::shared_ptr make_av_frame(std::array data, const core::pi av_frame->height = planes[0].height; for(int n = 0; n < planes.size(); ++n) { - av_frame->data[n] = reinterpret_cast(data[n]); + av_frame->data[n] = data[n]; av_frame->linesize[n] = planes[n].linesize; } switch(format)