Subject: [PATCH V3 07/15] gnu: Add ffmpeg-jami.

From: Jan Wielkiewicz <[email-masked]>
Date: Sat, 2 May 2020 03:14:42 +0200

This package is needed, because Jami uses a modified version
of ffmpeg, which provides GPU hardware acceleration, automatical
adapting of bitrate and extra codecs.

* gnu/packages/jami.scm (ffmpeg-jami): New variable.
---
 gnu/packages/jami.scm | 239 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 239 insertions(+)

diff --git a/gnu/packages/jami.scm b/gnu/packages/jami.scm
index 8d34029918..0fc03b6088 100644
--- a/gnu/packages/jami.scm
+++ b/gnu/packages/jami.scm
@@ -186,6 +186,245 @@
                 "selftest: pjlib-test pjlib-util-test pjmedia-test"))
              #t)))))))
 
+(define-public ffmpeg-jami
+  (let ((commit "59da9dcd7ef6277e4e04998ced71b05a6083c635")
+        (revision "0"))
+    (package
+      (inherit ffmpeg)
+      (name "ffmpeg-jami")
+      (version (git-version "4.2.1" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://git.ffmpeg.org/ffmpeg.git")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0cm58kd06lvslc7knnfajv5p63v4cc6502badjcic5m9izd03lz2"))))
+      (native-inputs
+       `(("SFL-patches" ,(jami-source))
+         ("libiconv" ,libiconv)
+         ,@(package-native-inputs ffmpeg)))
+      (arguments
+       (append
+        '(#:tests? #f)
+        (substitute-keyword-arguments (package-arguments ffmpeg)
+          ((#:configure-flags '())
+           (append '("--disable-everything"
+                     "--enable-zlib"
+                     "--enable-gpl"
+                     "--enable-swscale"
+                     "--enable-bsfs"
+                     "--disable-filters"
+                     "--disable-programs"
+                     "--disable-postproc"
+                     "--disable-protocols"
+                     "--enable-protocol=crypto"
+                     "--enable-protocol=file"
+                     "--enable-protocol=rtp"
+                     "--enable-protocol=srtp"
+                     "--enable-protocol=tcp"
+                     "--enable-protocol=udp"
+                     "--enable-protocol=unix"
+                     "--enable-protocol=pipe"
+                     ;; enable muxers/demuxers
+                     "--disable-demuxers"
+                     "--disable-muxers"
+                     "--enable-muxer=rtp"
+                     "--enable-muxer=g722"
+                     "--enable-muxer=h263"
+                     "--enable-muxer=h264"
+                     "--enable-muxer=hevc"
+                     "--enable-muxer=webm"
+                     "--enable-muxer=ogg"
+                     "--enable-muxer=pcm_s16be"
+                     "--enable-muxer=pcm_s16le"
+                     "--enable-demuxer=rtp"
+                     "--enable-demuxer=mjpeg"
+                     "--enable-demuxer=mjpeg_2000"
+                     "--enable-demuxer=mpegvideo"
+                     "--enable-demuxer=gif"
+                     "--enable-demuxer=image_jpeg_pipe"
+                     "--enable-demuxer=image_png_pipe"
+                     "--enable-demuxer=image_webp_pipe"
+                     "--enable-demuxer=matroska"
+                     "--enable-demuxer=m4v"
+                     "--enable-demuxer=mp3"
+                     "--enable-demuxer=ogg"
+                     "--enable-demuxer=flac"
+                     "--enable-demuxer=wav"
+                     "--enable-demuxer=ac3"
+                     "--enable-demuxer=g722"
+                     "--enable-demuxer=pcm_mulaw"
+                     "--enable-demuxer=pcm_alaw"
+                     "--enable-demuxer=pcm_s16be"
+                     "--enable-demuxer=pcm_s16le"
+                     "--enable-demuxer=h263"
+                     "--enable-demuxer=h264"
+                     "--enable-demuxer=hevc"
+                     ;; enable parsers
+                     "--enable-parser=h263"
+                     "--enable-parser=h264"
+                     "--enable-parser=mpeg4video"
+                     "--enable-parser=vp8"
+                     "--enable-parser=vp9"
+                     "--enable-parser=opus"
+                     ;; encoders/decoders
+                     "--enable-encoder=adpcm_g722"
+                     "--enable-decoder=adpcm_g722"
+                     "--enable-encoder=rawvideo"
+                     "--enable-decoder=rawvideo"
+                     "--enable-encoder=libx264"
+                     "--enable-decoder=h264"
+                     "--enable-encoder=pcm_alaw"
+                     "--enable-decoder=pcm_alaw"
+                     "--enable-encoder=pcm_mulaw"
+                     "--enable-decoder=pcm_mulaw"
+                     "--enable-encoder=mpeg4"
+                     "--enable-decoder=mpeg4"
+                     "--enable-encoder=libvpx_vp8"
+                     "--enable-decoder=vp8"
+                     "--enable-decoder=vp9"
+                     "--enable-encoder=h263"
+                     "--enable-encoder=h263p"
+                     "--enable-decoder=h263"
+                     "--enable-encoder=mjpeg"
+                     "--enable-decoder=mjpeg"
+                     "--enable-decoder=mjpegb"
+                     "--enable-libspeex"
+                     "--enable-libopus"
+                     "--enable-libvpx"
+                     "--enable-libx264"
+                     "--enable-encoder=libspeex"
+                     "--enable-decoder=libspeex"
+                     "--enable-encoder=libopus"
+                     "--enable-decoder=libopus"
+                     ;; decoders for ringtones and audio streaming
+                     "--enable-decoder=flac"
+                     "--enable-decoder=vorbis"
+                     "--enable-decoder=aac"
+                     "--enable-decoder=ac3"
+                     "--enable-decoder=eac3"
+                     "--enable-decoder=mp3"
+                     "--enable-decoder=pcm_u24be"
+                     "--enable-decoder=pcm_u24le"
+                     "--enable-decoder=pcm_u32be"
+                     "--enable-decoder=pcm_u32le"
+                     "--enable-decoder=pcm_u8"
+                     "--enable-decoder=pcm_f16le"
+                     "--enable-decoder=pcm_f24le"
+                     "--enable-decoder=pcm_f32be"
+                     "--enable-decoder=pcm_f32le"
+                     "--enable-decoder=pcm_f64be"
+                     "--enable-decoder=pcm_f64le"
+                     "--enable-decoder=pcm_s16be"
+                     "--enable-decoder=pcm_s16be_planar"
+                     "--enable-decoder=pcm_s16le"
+                     "--enable-decoder=pcm_s16le_planar"
+                     "--enable-decoder=pcm_s24be"
+                     "--enable-decoder=pcm_s24le"
+                     "--enable-decoder=pcm_s24le_planar"
+                     "--enable-decoder=pcm_s32be"
+                     "--enable-decoder=pcm_s32le"
+                     "--enable-decoder=pcm_s32le_planar"
+                     "--enable-decoder=pcm_s64be"
+                     "--enable-decoder=pcm_s64le"
+                     "--enable-decoder=pcm_s8"
+                     "--enable-decoder=pcm_s8_planar"
+                     "--enable-decoder=pcm_u16be"
+                     "--enable-decoder=pcm_u16le"
+                     ;; encoders/decoders for images
+                     "--enable-encoder=gif"
+                     "--enable-decoder=gif"
+                     "--enable-encoder=jpegls"
+                     "--enable-decoder=jpegls"
+                     "--enable-encoder=ljpeg"
+                     "--enable-decoder=jpeg2000"
+                     "--enable-encoder=png"
+                     "--enable-decoder=png"
+                     "--enable-encoder=bmp"
+                     "--enable-decoder=bmp"
+                     "--enable-encoder=tiff"
+                     "--enable-decoder=tiff"
+                     ;; filters
+                     "--enable-filter=scale"
+                     "--enable-filter=overlay"
+                     "--enable-filter=amix"
+                     "--enable-filter=amerge"
+                     "--enable-filter=aresample"
+                     "--enable-filter=format"
+                     "--enable-filter=aformat"
+                     "--enable-filter=fps"
+                     "--enable-filter=transpose"
+                     "--enable-filter=pad")
+                   ;; platform specific options
+                   (if (string-contains (%current-system) "linux")
+                       '("--enable-pic"
+                         "--extra-cxxflags=-fPIC --extra-cflags=-fPIC"
+                         "--target-os=linux"
+                         "--enable-indev=v4l2"
+                         "--enable-indev=xcbgrab"
+                         "--enable-vdpau"
+                         "--enable-hwaccel=h264_vdpau"
+                         "--enable-hwaccel=mpeg4_vdpau"
+                         "--enable-vaapi"
+                         "--enable-hwaccel=h264_vaapi"
+                         "--enable-hwaccel=mpeg4_vaapi"
+                         "--enable-hwaccel=h263_vaapi"
+                         "--enable-hwaccel=vp8_vaapi"
+                         "--enable-hwaccel=mjpeg_vaapi"
+                         "--enable-encoder=h264_vaapi"
+                         "--enable-encoder=vp8_vaapi"
+                         "--enable-encoder=mjpeg_vaapi"
+                         ))
+                   (cond ((string?= (%current-system) "i386")
+                          '("--arch=x86"
+                            "--enable-cuvid"
+                            "--enable-ffnvcodec"
+                            "--enable-nvdec"
+                            "--enable-nvenc"
+                            "--enable-hwaccel=h264_nvdec"
+                            "--enable-hwaccel=hevc_nvdec"
+                            "--enable-hwaccel=vp8_nvdec"
+                            "--enable-hwaccel=mjpeg_nvdec"
+                            "--enable-encoder=h264_nvenc"
+                            "--enable-encoder=hevc_nvenc"))
+                         ((string?= (%current-system) "x86_64")
+                          '("--arch=x86_64"
+                            "--enable-cuvid"
+                            "--enable-ffnvcodec"
+                            "--enable-nvdec"
+                            "--enable-nvenc"
+                            "--enable-hwaccel=h264_nvdec"
+                            "--enable-hwaccel=hevc_nvdec"
+                            "--enable-hwaccel=vp8_nvdec"
+                            "--enable-hwaccel=mjpeg_nvdec"
+                            "--enable-encoder=h264_nvenc"
+                            "--enable-encoder=hevc_nvenc"))
+                         ((string?= (%current-system) "aarch64-linux") '("--arch=aarch64"))
+                         ((string?= (%current-system) "arm64-linux") '("--arch=aarch64"))
+                         ((string?= (%current-system) "arm") '("--arch=arm"))
+                         (else '()))))
+          ((#:phases phases)
+           `(modify-phases ,phases
+              (add-after 'unpack 'make-git-checkout-writable
+                (lambda _
+                  (for-each make-file-writable (find-files "."))
+                  #t))
+              (add-after 'unpack 'apply-patches
+                (lambda* (#:key inputs #:allow-other-keys)
+                  (let ((jami-apply-dependency-patches ,jami-apply-dependency-patches))
+                    ;; These patches come from:
+                    ;; "ring-project/daemon/contrib/src/ffmpeg/rules.mak".
+                    (jami-apply-dependency-patches #:inputs inputs
+                                                   #:dep-name "ffmpeg"
+                                                   #:patches
+                                                   '("remove-mjpeg-log"
+                                                     "change-RTCP-ratio"
+                                                     "rtp_ext_abs_send_time"))
+                    #t)))))))))))
+
 (define-public libring
   (package
     (name "libring")
-- 
2.26.2