diff mbox series

[bug#40677,V3,07/15] gnu: Add ffmpeg-jami.

Message ID 20200502011450.2676-8-tona_kosmicznego_smiecia@interia.pl
State Accepted
Headers show
Series Jami patches. | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch success View Laminar job
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch fail View Laminar job

Commit Message

Jan Wielkiewicz May 2, 2020, 1:14 a.m. UTC
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(+)

Comments

Mathieu Othacehe May 2, 2020, 9:36 a.m. UTC | #1
Ok, last one! As discussed before I'm not very comfortable with this
very long list of configuration options.

Are the ffmpeg configuration options needed by Jami described somewhere?

Thanks,

Mathieu
Jan Wielkiewicz May 2, 2020, 11:31 a.m. UTC | #2
On Sat, 02 May 2020 11:36:30 +0200
Mathieu Othacehe <m.othacehe@gmail.com> wrote:

> Ok, last one! As discussed before I'm not very comfortable with this
> very long list of configuration options.
> 
> Are the ffmpeg configuration options needed by Jami described
> somewhere?
> 
> Thanks,
> 
> Mathieu

I copied it from ring-project/daemon/contrib/src/ffmpeg/rules.mak.
Tarballs are here: https://dl.jami.net/ring-release/tarballs/


Jan Wielkiewicz
Jan Wielkiewicz May 4, 2020, 6:26 p.m. UTC | #3
On Sat, 02 May 2020 11:36:30 +0200
Mathieu Othacehe <m.othacehe@gmail.com> wrote:

> Ok, last one! As discussed before I'm not very comfortable with this
> very long list of configuration options.
> 
> Are the ffmpeg configuration options needed by Jami described
> somewhere?
> 
> Thanks,
> 
> Mathieu

So I compared the list of flags turned off by default with ffmpeg
package currently in guix with ffmpeg-jami package and I managed to
shorten the list from 107 to 95. It isn't worth the effort.

I tried looking for the flags needed in the documentation, but I
couldn't find anything. There's only the rules.mak file in Jami source
code and they use these flags.

There are only few comments:
#disable everything
#enable muxers/demuxers
#enable parsers
#encoders/decoders
#decoders for ringtones and audio streaming
#encoders/decoders for images
#filters
#platform specific options
#Android Linux
#Desktop Linux
...

That's all. I see no point in comparing these flags every release just
for 12 of them I can inherit from the default ffmpeg package.

I prefer just copy the list from rules.mak. What I could do is defining
a separate "ffmpeg-configure-flags" variable somewhere near ffmpeg-jami
and use it, instead of having the bloated list inside the package
definition (if that's even possible).
Correct me if I'm wrong or suggest a reasonable solution, because I have
no idea how to deal with it right now.


Jan Wielkiewicz
Mathieu Othacehe May 5, 2020, 7:18 a.m. UTC | #4
Hello Jan,

> So I compared the list of flags turned off by default with ffmpeg
> package currently in guix with ffmpeg-jami package and I managed to
> shorten the list from 107 to 95. It isn't worth the effort.

Oh that's a disappointment indeed. Among those 95 flags I'm pretty sure
most of them match the default, but going through all of them feels like
a burden.

> I prefer just copy the list from rules.mak. What I could do is defining
> a separate "ffmpeg-configure-flags" variable somewhere near ffmpeg-jami
> and use it, instead of having the bloated list inside the package
> definition (if that's even possible).
> Correct me if I'm wrong or suggest a reasonable solution, because I have
> no idea how to deal with it right now.

Ok, this seems fine. Don't hesitate to add a link to a Web view of the
rules.mak file, so that it's clear where those flags come from.

Another remark on this part,

>         "--enable-encoder=h264_nvenc"
>         "--enable-encoder=hevc_nvenc"))
>      ((string?= (%current-system) "aarch64-linux") '("--arch=aarch64"))
>      ((string?= (%current-system) "arm64-linux") '("--arch=aarch64"))

"arm64-linux" is not a valid system, you can remove it.

>      ((string?= (%current-system) "arm") '("--arch=arm"))

I think the right system here is "armhf-linux". However, you would also
need to support cross-compilation when %current-target-system is set. In
that case, the value looks like "aarch64-linux-gnu" and
"arm-linux-gnueabihf".

If you add support for those plaforms you need to test it by building
ffmpeg-jami with "--system" and "--target" flags. As this is a complex
package with a lot of dependencies (probably failing to cross-compile),
it would be fine with me if you just drop support for other
systems/targets.

Thanks,

Mathieu
Jan Wielkiewicz May 7, 2020, 12:22 a.m. UTC | #5
Hi again!

On Tue, 05 May 2020 09:18:58 +0200
Mathieu Othacehe <m.othacehe@gmail.com> wrote:

> Hello Jan,
> 
> Oh that's a disappointment indeed. Among those 95 flags I'm pretty
> sure most of them match the default, but going through all of them
> feels like a burden.
> 
> Ok, this seems fine. Don't hesitate to add a link to a Web view of the
> rules.mak file, so that it's clear where those flags come from.
Done.

> Another remark on this part,
> 
> >         "--enable-encoder=h264_nvenc"
> >         "--enable-encoder=hevc_nvenc"))
> >      ((string?= (%current-system) "aarch64-linux")
> > '("--arch=aarch64")) ((string?= (%current-system) "arm64-linux")
> > '("--arch=aarch64"))  
> 
> "arm64-linux" is not a valid system, you can remove it.
Done.

> >      ((string?= (%current-system) "arm") '("--arch=arm"))  
> 
> I think the right system here is "armhf-linux". However, you would
> also need to support cross-compilation when %current-target-system is
> set. In that case, the value looks like "aarch64-linux-gnu" and
> "arm-linux-gnueabihf".

I added "%current-target-system" to support cross-compilation.
Also fixed the drunk "string?=" uses - there's "string=?" actually and
I replaced it with "string-prefix?".

What's the difference between "arm-linux-gnueabihf" and
"aarch64-linux-gnu"? Are they synonyms?
Should it be:
if "arm-linux-gnueabihf" or "aarch64-linux-gnu"
use "--arch=armhf-linux"?

> If you add support for those plaforms you need to test it by building
> ffmpeg-jami with "--system" and "--target" flags. As this is a complex
> package with a lot of dependencies (probably failing to
> cross-compile), it would be fine with me if you just drop support for
> other systems/targets.

I want to try anyway. Jami supports Raspbian, so it is worth trying.

> Thanks,
> 
> Mathieu


Jan Wielkiewicz
Jan Wielkiewicz May 7, 2020, 8:03 p.m. UTC | #6
Hi,

I tried fixing cross-compilation but there are several problems:

- dav1d fails, because "meson doesn't support cross-compilation"
- perl fails during installation and if I checked correctly, guix
  doesn't have support for perl on armhf or aarch64
- glib fails, because "meson doesn't support cross-compilation"
And other possible problems I didn't get to. With dav1d I could just
disable it, because it's just one codec. I also disabled perl, but
disabling glib won't work.

This isn't a good advertisement for this meson build system :P
Should I proudly drop all the support for cross compilation?



Jan Wielkiewicz
Mathieu Othacehe May 8, 2020, 8:35 a.m. UTC | #7
Hello Jan,

> - dav1d fails, because "meson doesn't support cross-compilation"
> - perl fails during installation and if I checked correctly, guix
>   doesn't have support for perl on armhf or aarch64
> - glib fails, because "meson doesn't support cross-compilation"
> And other possible problems I didn't get to. With dav1d I could just
> disable it, because it's just one codec. I also disabled perl, but
> disabling glib won't work.
>
> This isn't a good advertisement for this meson build system :P
> Should I proudly drop all the support for cross compilation?

On core-updates the cross-compilation support is a bit better (perl at
least should be fixed), but it won't get you much further. So yes you
can drop cross compilation. You can still check that native compilation
for armv7 and aarch64 works with "--system armhf-linux" and "--system
aarch64-linux". Note that you will need to setup binfmt.

Thanks,

Mathieu
Mathieu Othacehe May 8, 2020, 8:43 a.m. UTC | #8
Hey,

> What's the difference between "arm-linux-gnueabihf" and
> "aarch64-linux-gnu"? Are they synonyms?

No, "arm-linux-gnueabihf" is for ARMv7 systems with hardware floating
point support. "aarch64-linux-gnu" is for ARMv8 processors. This is
quite confusing!

Mathieu
Jan Wielkiewicz May 13, 2020, 2:57 p.m. UTC | #9
Hi,

I had a success building ffmpeg-jami on both aarch64-linux and
armhf-linux (through qemu). I have one question regarding the naming
convention of variables. Why do some variables start with "%"? I
couldn't find any explanation in the documentation nor in the source
code. Say I want to add a variable called
"ffmpeg-linux-configure-flags". Should I start it with "%" -
"%fmpeg-linux-configure-flags" or not?


Jan Wielkiewicz
Mathieu Othacehe May 13, 2020, 3:51 p.m. UTC | #10
Hello Jan,

> I had a success building ffmpeg-jami on both aarch64-linux and
> armhf-linux (through qemu). I have one question regarding the naming
> convention of variables. Why do some variables start with "%"? I
> couldn't find any explanation in the documentation nor in the source
> code. Say I want to add a variable called
> "ffmpeg-linux-configure-flags". Should I start it with "%" -
> "%fmpeg-linux-configure-flags" or not?

Good job! Variables prefixed by '%' often denote parameters (see:
https://www.gnu.org/software/guile/manual/html_node/Parameters.html).

I guess something like:

--8<---------------cut here---------------start------------->8---
(define %fmpeg-linux-configure-flags
  '("--flag-1"
    "--flag-2"))
--8<---------------cut here---------------end--------------->8---

would be fine. But using "ffmpeg-linux-configure-flags" would also be
correct.

Thanks,

Mathieu
diff mbox series

Patch

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")