Package: casparcg-server
Version: 2.2.0+dfsg-2.1
Severity: serious
Tags: patch
Justification: FTBFS
User: ubuntu-de...@lists.ubuntu.com
Usertags: origin-ubuntu kinetic ubuntu-patch

Hi Petter,

casparcg-server fails to build against ffmpeg 5.0 which is now in unstable. 
The attached patch fixes the API incompatibilities.

Other fixes are needed to get casparcg-server building in general; I believe
there are bugs open for these other issues.

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                   https://www.debian.org/
slanga...@ubuntu.com                                     vor...@debian.org
diff -Nru casparcg-server-2.2.0+dfsg/debian/control 
casparcg-server-2.2.0+dfsg/debian/control
--- casparcg-server-2.2.0+dfsg/debian/control   2022-03-09 03:13:39.000000000 
-0800
+++ casparcg-server-2.2.0+dfsg/debian/control   2022-07-20 21:42:59.000000000 
-0700
@@ -1,6 +1,5 @@
 Source: casparcg-server
-Maintainer: Ubuntu Developers <ubuntu-devel-disc...@lists.ubuntu.com>
-XSBC-Original-Maintainer: Petter Reinholdtsen <p...@debian.org>
+Maintainer: Petter Reinholdtsen <p...@debian.org>
 Section: contrib/video
 Priority: optional
 Standards-Version: 4.3.0
diff -Nru casparcg-server-2.2.0+dfsg/debian/patches/ffmpeg-5.0.patch 
casparcg-server-2.2.0+dfsg/debian/patches/ffmpeg-5.0.patch
--- casparcg-server-2.2.0+dfsg/debian/patches/ffmpeg-5.0.patch  1969-12-31 
16:00:00.000000000 -0800
+++ casparcg-server-2.2.0+dfsg/debian/patches/ffmpeg-5.0.patch  2022-07-20 
21:42:59.000000000 -0700
@@ -0,0 +1,182 @@
+Description: Compatibility with ffmpeg 5.0.
+Author: Steve Langasek <steve.langa...@ubuntu.com>
+Last-Update: 2022-07-20
+Forwarded: no
+
+Index: casparcg-server-2.2.0+dfsg/src/modules/ffmpeg/producer/av_producer.cpp
+===================================================================
+--- casparcg-server-2.2.0+dfsg.orig/src/modules/ffmpeg/producer/av_producer.cpp
++++ casparcg-server-2.2.0+dfsg/src/modules/ffmpeg/producer/av_producer.cpp
+@@ -38,6 +38,7 @@
+ #include <libavfilter/buffersrc.h>
+ #include <libavformat/avformat.h>
+ #include <libavutil/avutil.h>
++#include <libavutil/channel_layout.h>
+ #include <libavutil/error.h>
+ #include <libavutil/opt.h>
+ #include <libavutil/pixfmt.h>
+Index: casparcg-server-2.2.0+dfsg/src/modules/ffmpeg/util/av_util.cpp
+===================================================================
+--- casparcg-server-2.2.0+dfsg.orig/src/modules/ffmpeg/util/av_util.cpp
++++ casparcg-server-2.2.0+dfsg/src/modules/ffmpeg/util/av_util.cpp
+@@ -9,7 +9,9 @@
+ extern "C" {
+ #include <libavcodec/avcodec.h>
+ #include <libavfilter/avfilter.h>
++#include <libavutil/channel_layout.h>
+ #include <libavutil/frame.h>
++#include <libavutil/imgutils.h>
+ #include <libavutil/pixfmt.h>
+ }
+ #if defined(_MSC_VER)
+@@ -113,46 +115,52 @@
+ core::pixel_format_desc pixel_format_desc(AVPixelFormat pix_fmt, int width, 
int height)
+ {
+     // Get linesizes
+-    AVPicture dummy_pict;
+-    avpicture_fill(&dummy_pict, nullptr, pix_fmt, width, height);
++    uint8_t *pointers[4];
++    int linesize[4];
++    av_image_alloc(pointers, linesize, width, height, pix_fmt, 8);
+ 
+     core::pixel_format_desc desc = get_pixel_format(pix_fmt);
+ 
+     switch (desc.format) {
+         case core::pixel_format::gray:
+         case core::pixel_format::luma: {
+-            
desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[0], 
height, 1));
++            desc.planes.push_back(core::pixel_format_desc::plane(linesize[0], 
height, 1));
++            av_freep(&pointers[0]);
+             return desc;
+         }
+         case core::pixel_format::bgr:
+         case core::pixel_format::rgb: {
+-            
desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[0] / 
3, height, 3));
++            desc.planes.push_back(core::pixel_format_desc::plane(linesize[0] 
/ 3, height, 3));
++            av_freep(&pointers[0]);
+             return desc;
+         }
+         case core::pixel_format::bgra:
+         case core::pixel_format::argb:
+         case core::pixel_format::rgba:
+         case core::pixel_format::abgr: {
+-            
desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[0] / 
4, height, 4));
++            desc.planes.push_back(core::pixel_format_desc::plane(linesize[0] 
/ 4, height, 4));
++            av_freep(&pointers[0]);
+             return desc;
+         }
+         case core::pixel_format::ycbcr:
+         case core::pixel_format::ycbcra: {
+             // Find chroma height
+-            auto size2 = static_cast<int>(dummy_pict.data[2] - 
dummy_pict.data[1]);
+-            auto h2    = size2 / dummy_pict.linesize[1];
++            auto size2 = static_cast<int>(pointers[2] - pointers[1]);
++            auto h2    = size2 / linesize[1];
+ 
+-            
desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[0], 
height, 1));
+-            
desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[1], 
h2, 1));
+-            
desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[2], 
h2, 1));
++            desc.planes.push_back(core::pixel_format_desc::plane(linesize[0], 
height, 1));
++            desc.planes.push_back(core::pixel_format_desc::plane(linesize[1], 
h2, 1));
++            desc.planes.push_back(core::pixel_format_desc::plane(linesize[2], 
h2, 1));
+ 
+             if (desc.format == core::pixel_format::ycbcra)
+-                
desc.planes.push_back(core::pixel_format_desc::plane(dummy_pict.linesize[3], 
height, 1));
++                
desc.planes.push_back(core::pixel_format_desc::plane(linesize[3], height, 1));
+ 
++            av_freep(&pointers[0]);
+             return desc;
+         }
+         default:
+             desc.format = core::pixel_format::invalid;
++            av_freep(&pointers[0]);
+             return desc;
+     }
+ }
+Index: casparcg-server-2.2.0+dfsg/src/modules/ffmpeg/ffmpeg.cpp
+===================================================================
+--- casparcg-server-2.2.0+dfsg.orig/src/modules/ffmpeg/ffmpeg.cpp
++++ casparcg-server-2.2.0+dfsg/src/modules/ffmpeg/ffmpeg.cpp
+@@ -52,37 +52,6 @@
+ }
+ 
+ namespace caspar { namespace ffmpeg {
+-int ffmpeg_lock_callback(void** mutex, enum AVLockOp op)
+-{
+-    if (!mutex)
+-        return 0;
+-
+-    auto my_mutex = reinterpret_cast<std::recursive_mutex*>(*mutex);
+-
+-    switch (op) {
+-        case AV_LOCK_CREATE: {
+-            *mutex = new std::recursive_mutex();
+-            break;
+-        }
+-        case AV_LOCK_OBTAIN: {
+-            if (my_mutex)
+-                my_mutex->lock();
+-            break;
+-        }
+-        case AV_LOCK_RELEASE: {
+-            if (my_mutex)
+-                my_mutex->unlock();
+-            break;
+-        }
+-        case AV_LOCK_DESTROY: {
+-            delete my_mutex;
+-            *mutex = nullptr;
+-            break;
+-        }
+-    }
+-    return 0;
+-}
+-
+ static void sanitize(uint8_t* line)
+ {
+     while (*line) {
+@@ -141,13 +110,9 @@
+ 
+ void init(core::module_dependencies dependencies)
+ {
+-    av_lockmgr_register(ffmpeg_lock_callback);
+     av_log_set_callback(log_for_thread);
+ 
+-    avfilter_register_all();
+-    av_register_all();
+     avformat_network_init();
+-    avcodec_register_all();
+     avdevice_register_all();
+ 
+     dependencies.consumer_registry->register_consumer_factory(L"FFmpeg 
Consumer", create_consumer);
+@@ -160,6 +125,5 @@
+ {
+     // avfilter_uninit();
+     avformat_network_deinit();
+-    av_lockmgr_register(nullptr);
+ }
+ }} // namespace caspar::ffmpeg
+Index: 
casparcg-server-2.2.0+dfsg/src/modules/ffmpeg/consumer/ffmpeg_consumer.cpp
+===================================================================
+--- 
casparcg-server-2.2.0+dfsg.orig/src/modules/ffmpeg/consumer/ffmpeg_consumer.cpp
++++ casparcg-server-2.2.0+dfsg/src/modules/ffmpeg/consumer/ffmpeg_consumer.cpp
+@@ -58,6 +58,7 @@
+ #include <libavfilter/buffersink.h>
+ #include <libavfilter/buffersrc.h>
+ #include <libavformat/avformat.h>
++#include <libavutil/channel_layout.h>
+ #include <libavutil/opt.h>
+ #include <libavutil/pixfmt.h>
+ #include <libavutil/samplefmt.h>
+Index: 
casparcg-server-2.2.0+dfsg/src/modules/decklink/producer/decklink_producer.cpp
+===================================================================
+--- 
casparcg-server-2.2.0+dfsg.orig/src/modules/decklink/producer/decklink_producer.cpp
++++ 
casparcg-server-2.2.0+dfsg/src/modules/decklink/producer/decklink_producer.cpp
+@@ -63,6 +63,7 @@
+ #include <libavfilter/buffersink.h>
+ #include <libavfilter/buffersrc.h>
+ #include <libavformat/avformat.h>
++#include <libavutil/channel_layout.h>
+ #include <libavutil/opt.h>
+ #include <libavutil/pixfmt.h>
+ #include <libavutil/samplefmt.h>
diff -Nru casparcg-server-2.2.0+dfsg/debian/patches/series 
casparcg-server-2.2.0+dfsg/debian/patches/series
--- casparcg-server-2.2.0+dfsg/debian/patches/series    2021-11-20 
13:05:06.000000000 -0800
+++ casparcg-server-2.2.0+dfsg/debian/patches/series    2022-07-20 
21:39:55.000000000 -0700
@@ -1,1 +1,2 @@
 cmake-ftbfs.patch
+ffmpeg-5.0.patch

Reply via email to