# [ffmpeg] intégration du filtre vid.stab [résolu]

## l_arbalette

Bonjour à tous,

ça fait un moment que je recule mais là, il faut vraiment que je trouve une solution...

Je souhaite utiliser ce filtre http://public.hronopik.de/vid.stab/

avec ffmpeg. Le site explique bien que ce filtre est disponible pour ffmpeg...je ne suis pas sûr de bien comprendre, mais il parle aussi du filtre libavfilter...est-ce qu'il est intégré dedans ? je ne sais pas, mais ça m'étonnerai car ce dernier est présent chez moi, mais le filtre vid.stab ne l'est pas.

 *Quote:*   

> [AVFilterGraph @ 0x9befe0] No such filter: 'vidstabdetect'
> 
> 

 

Ce site https://github.com/georgmartius/vid.stab explique comment compiler à la main le filtre pour qu'il soit disponible dans ffmpeg.

Je pensais qu'avec ma bonne vieille Gentoo, je n'aurais qu'à activer un USE flag et le tour est joué...

Que nenni...

Pas de USE flag correspondant.

Comment puis-je installer ce filtre ?

En espérant que l'un de vous pourra m'aider...

Merci !

Voici ce qui est activé avec ffmpeg :

 *Quote:*   

> ffmpeg version 2.8.5 Copyright (c) 2000-2016 the FFmpeg developers
> 
>   built with gcc 4.8.5 (Gentoo 4.8.5 p1.3, pie-0.6.2)
> 
>   configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-march=corei7 -O2 -pipe' --disable-static --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --enable-version3 --disable-indev=oss --disable-indev=jack --disable-outdev=oss --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-gpl --enable-hardcoded-tables --enable-iconv --disable-lzma --enable-network --disable-openssl --enable-postproc --enable-libsmbclient --enable-ffplay --enable-sdl --disable-vaapi --disable-vdpau --enable-xlib --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --disable-libcdio --disable-libiec61883 --enable-libdc1394 --disable-libcaca --disable-openal --enable-opengl --disable-libv4l2 --disable-libpulse --disable-libopencore-amrwb --disable-libopencore-amrnb --disable-libfdk-aac --disable-libopenjpeg --disable-libbluray --disable-libcelt --disable-libgme --disable-libgsm --disable-libmodplug --disable-libopus --disable-libquvi --disable-librtmp --disable-libssh --disable-libschroedinger --disable-libspeex --enable-libvorbis --disable-libvpx --disable-libzvbi --disable-libbs2b --disable-libflite --enable-frei0r --disable-libfribidi --disable-fontconfig --disable-ladspa --enable-libass --enable-libfreetype --disable-libsoxr --enable-pthreads --enable-libvo-aacenc --disable-libvo-amrwbenc --enable-libmp3lame --disable-libaacplus --disable-libfaac --disable-libsnappy --disable-libtheora --disable-libtwolame --disable-libwavpack --disable-libwebp --enable-libx264 --disable-libx265 --enable-libxvid --disable-amd3dnow --disable-amd3dnowext --disable-avx2 --disable-fma3 --disable-fma4 --disable-xop --enable-pic --cpu=corei7
> ...

 

----------

## El_Goretto

Bonjour l_arbalette, tu trouveras sur bugs.gentoo.org un test de modification de l'ebuild ffmpeg pour supporter l'option de compilation dont tu as besoin, ainsi qu'une ebuild pour la bilbiothèque elle-même. Libre à toi d'appuyer leur démarche  :Wink: 

----------

## l_arbalette

Merci ElGoretto.

Je vais regarder ça.

Je suis un peu rouillé, va falloir que je me replonge sur ces histoires d'ebuild overlay...

(de la meme façon que je n'avais pas pensé à regarder sur bugs.gentoo.org...)

----------

## l_arbalette

re-bonjour,

je pense avoir pas mal progressé avec cette indication. Merci !

Mon objectif est bien de re-compiler ffmpeg en ajoutant cette fonctionnalité.

Je suis parti sur l'idée de copier ma version de ffmpeg et d'y ajouter cette fonctionnalité vidstab (qui est CANON !) http://public.hronopik.de/vid.stab/

Donc j'ai adapté ce qui est proposé sur ce site https://github.com/thinrope/pkalin/commit/a59ec0ae0cd96683e58430ef98040c2ddb9d6797?diff=unified, en modifiant plutôt l'ebuild de ma version courante de ffmpeg (c'est à dire media-video/ffmpeg-2.8.5), plutôt que la "vieille" version qui a été testée.

Mais j'ai un pb au moment de l'emerge (qui ne me semble pas liée au fait que j'utilise une version plus récente)

En syntèse, j'ai fait les modif suivantes :

     - dans le make.conf, j'ai déclaré mon répertoire overlay

 *Quote:*   

> PORTDIR_OVERLAY="/usr/local/overlay"

 

     - j'ai créé la structure /media-video/ffmpeg et /media-video/vidstab

     - J'ai copié l'ebuild de la version de ffmpeg que j'utilise actuellement dans le dossier overlay ffmeg

     - que j'ai renommé en ajoutant -r1 à la fin de la version

     - J'ai modifié les 2 lignes dans l'ebuild comme indiqué à cette adresse https://github.com/thinrope/pkalin/commit/a59ec0ae0cd96683e58430ef98040c2ddb9d6797?diff=unified

     - j'ai créé un fichier /usr/local/overlay/media-video/vidstab/vidstab-0.98b.ebuild dans lequel j'ai recopié ce qui est proposé toujours à cette adresse https://github.com/thinrope/pkalin/commit/a59ec0ae0cd96683e58430ef98040c2ddb9d6797?diff=unified

     - j'ai créé les Manifest avec la commande 

```
ebuild vidstab-0.98b.ebuild digest
```

 et 

```
ebuild ffmpeg-2.8.5-r1.ebuild digest
```

 (après avoir "cd" dans le répertoire de chacun des ebuilds)

     - j'ai copié le fichier metadata.xml de l'ebuild de ffmpeg original et placé dans mon répertoire /usr/local/overlay/media-video/ffmpeg/, et j'ai ajouté une ligne comme toujours indiqué sur le même site (ce qui permet d'avoir le USE flag qui apparaît)

     - j'ai ajouté "=media-video/ffmpeg-2.8.5-r1 libvidstab" dans /etc/portage/package.use

     - j'ai ajouté le keyword ~amd64 dans /etc/portage/package.keywords pour l'ebuild vidstab-0.98b

Et j'ai lancé 

```
emerge -av =media-video/ffmpeg-2.8.5-r1
```

La proposition m'a bien plu : le USE flag était proposé et activé, l'installation de vidstab était bien proposée en dépendance.

Quelques packages supplémentaires ont été nécessaire (GIT ? apparemment pour gérer la lecture de l'arboresence du projet vidstab j'ai l'impression ? ou qqchose comme ça)

L'emerge de vidstab s'est bien passé.

```

>>> Installing (10 of 11) media-video/vidstab-0.98b::thibaut_perso

 * checking 20 files for package collisions

>>> Merging media-video/vidstab-0.98b to /

--- /usr/

--- /usr/lib64/

>>> /usr/lib64/libvidstab.so.0.9

--- /usr/lib64/pkgconfig/

>>> /usr/lib64/pkgconfig/vidstab.pc

--- /usr/share/

--- /usr/share/doc/

>>> /usr/share/doc/vidstab-0.98b/

>>> /usr/share/doc/vidstab-0.98b/README.bz2

--- /usr/include/

>>> /usr/include/vid.stab/

>>> /usr/include/vid.stab/transformtype.h

>>> /usr/include/vid.stab/transformfixedpoint.h

>>> /usr/include/vid.stab/libvidstab.h

>>> /usr/include/vid.stab/transformtype_operations.h

>>> /usr/include/vid.stab/transform_internal.h

>>> /usr/include/vid.stab/boxblur.h

>>> /usr/include/vid.stab/localmotion2transform.h

>>> /usr/include/vid.stab/vsvector.h

>>> /usr/include/vid.stab/motiondetect.h

>>> /usr/include/vid.stab/transform.h

>>> /usr/include/vid.stab/transformfloat.h

>>> /usr/include/vid.stab/frameinfo.h

>>> /usr/include/vid.stab/vidstabdefines.h

>>> /usr/include/vid.stab/serialize.h

>>> /usr/include/vid.stab/motiondetect_internal.h

>>> /usr/include/vid.stab/motiondetect_opt.h

>>> /usr/lib64/libvidstab.so -> libvidstab.so.0.9

>>> media-video/vidstab-0.98b merged.

>>> Regenerating /etc/ld.so.cache...

```

Par contre, arrivé à ffmpeg, plantage. La librairie vidstat est bien "enabled" dans le début de compilation de ffmpeg comme vous pouvez le voir ci-dessous dans le log. Extrait rapide :  *Quote:*   

> --enable-libfreetype --enable-libvidstab --disable-libsoxr 

 

Par contre, j'ai ce message, que je ne sais pas corriger :

```
 ERROR: vidstab not found using pkg-config
```

Ci-joint le début du log de emerge :

```
>>> Emerging (11 of 11) media-video/ffmpeg-2.8.5-r1::thibaut_perso

* ffmpeg-2.8.5.tar.bz2 SHA256 SHA512 WHIRLPOOL size ;-) ... [ ok ]

>>> Unpacking source...

>>> Unpacking ffmpeg-2.8.5.tar.bz2 to /var/tmp/portage/media-video/ffmpeg-2.8.5-r1/work

>>> Source unpacked in /var/tmp/portage/media-video/ffmpeg-2.8.5-r1/work

>>> Preparing source in /var/tmp/portage/media-video/ffmpeg-2.8.5-r1/work/ffmpeg-2.8.5 ...

>>> Source prepared.

>>> Configuring source in /var/tmp/portage/media-video/ffmpeg-2.8.5-r1/work/ffmpeg-2.8.5 ...

* abi_x86_32.x86: running multilib-minimal_abi_src_configure

/var/tmp/portage/media-video/ffmpeg-2.8.5-r1/work/ffmpeg-2.8.5/configure --prefix=/usr --libdir=/usr/lib32 --shlibdir=/usr/lib32 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc -m32 --cxx=x86_64-pc-linux-gnu-g++ -m32 --ar=ar --optflags=-march=corei7 -O2 -pipe --disable-static --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --enable-version3 --disable-indev=oss --disable-indev=jack --disable-outdev=oss --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-gpl --enable-hardcoded-tables --enable-iconv --disable-lzma --enable-network --disable-openssl --enable-postproc --enable-libsmbclient --enable-ffplay --enable-sdl --disable-vaapi --disable-vdpau --enable-xlib --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --disable-libcdio --disable-libiec61883 --enable-libdc1394 --disable-libcaca --disable-openal --enable-opengl --disable-libv4l2 --disable-libpulse --disable-libopencore-amrwb --disable-libopencore-amrnb --disable-libfdk-aac --disable-libopenjpeg --disable-libbluray --disable-libcelt --disable-libgme --disable-libgsm --disable-libmodplug --disable-libopus --disable-libquvi --disable-librtmp --disable-libssh --disable-libschroedinger --disable-libspeex --enable-libvorbis --disable-libvpx --disable-libzvbi --disable-libbs2b --disable-libflite --enable-frei0r --disable-libfribidi --disable-fontconfig --disable-ladspa --enable-libass --enable-libfreetype --enable-libvidstab --disable-libsoxr --enable-pthreads --enable-libvo-aacenc --disable-libvo-amrwbenc --enable-libmp3lame --disable-libaacplus --disable-libfaac --disable-libsnappy --disable-libtheora --disable-libtwolame --disable-libwavpack --disable-libwebp --enable-libx264 --disable-libx265 --enable-libxvid --disable-frei0r --disable-amd3dnow --disable-amd3dnowext --disable-avx2 --disable-fma3 --disable-fma4 --disable-xop --enable-pic --disable-asm --cpu=corei7

ERROR: vidstab not found using pkg-config

If you think configure made a mistake, make sure you are using the latest

version from Git. If the latest version fails, report the problem to the

ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.

Include the log file "config.log" produced by configure as this will help

solve the problem.

* ERROR: media-video/ffmpeg-2.8.5-r1::thibaut_perso failed (configure phase):

* (no error message)

*

* Call stack:

* ebuild.sh, line 133: Called src_configure

* environment, line 3130: Called multilib-minimal_src_configure

* environment, line 2241: Called multilib_foreach_abi 'multilib-minimal_abi_src_configure'

* environment, line 2455: Called multibuild_foreach_variant '_multilib_multibuild_wrapper' 'multilib-minimal_abi_src_configure'

* environment, line 2171: Called _multibuild_run '_multilib_multibuild_wrapper' 'multilib-minimal_abi_src_configure'

* environment, line 2169: Called _multilib_multibuild_wrapper 'multilib-minimal_abi_src_configure'

* environment, line 680: Called multilib-minimal_abi_src_configure

* environment, line 2235: Called multilib_src_configure

* environment, line 2755: Called die

* The specific snippet of code:

* "${@}" || die

*

* If you need support, post the output of `emerge --info '=media-video/ffmpeg-2.8.5-r1::thibaut_perso'`,

* the complete build log and the output of `emerge -pqv '=media-video/ffmpeg-2.8.5-r1::thibaut_perso'`.

* The complete build log is located at '/var/tmp/portage/media-video/ffmpeg-2.8.5-r1/temp/build.log'.

* The ebuild environment file is located at '/var/tmp/portage/media-video/ffmpeg-2.8.5-r1/temp/environment'.

* Working directory: '/var/tmp/portage/media-video/ffmpeg-2.8.5-r1/work/ffmpeg-2.8.5-abi_x86_32.x86'

* S: '/var/tmp/portage/media-video/ffmpeg-2.8.5-r1/work/ffmpeg-2.8.5'

>>> Failed to emerge media-video/ffmpeg-2.8.5-r1, Log file:

>>> '/var/tmp/portage/media-video/ffmpeg-2.8.5-r1/temp/build.log'
```

Il n'y a rien de plus dans le log /var/tmp/portage/media-video/ffmpeg-2.8.5-r1/temp/build.log

Est-ce que vous avez une idée de comment corriger cela ?

Merci !

----------

## l_arbalette

ce qui est d'autant plus étrange que la commande suivante renvoit bien qquechose

```
larbalette vidstab # pkg-config --modversion vidstab

0.98

```

 :Rolling Eyes: 

----------

## PabOu

Peux-tu nous poster tes deux ebuilds pour que l'on puisse tester de notre côté ?

----------

## l_arbalette

Bien sûr ! Et merci.

ebuild de ffmpeg : http://arbalette.hopto.org/images/forums/ffmpeg-2.8.5-r1.ebuild

le metadata.xml : http://arbalette.hopto.org/images/forums/metadata.xml

et l'ebuild pour vidstab : http://arbalette.hopto.org/images/forums/vidstab-0.98b.ebuild

----------

## sebB

Test effectué sans soucis chez moi.

Copie des 2 ebuild dans l'overlay puis digest (même pas besoin du metadata).

Peux-tu poster ton emerge --infoLast edited by sebB on Thu Feb 25, 2016 10:45 pm; edited 1 time in total

----------

## l_arbalette

OK, donc on devrait trouver une solution ! Cool !

Merci d'avoir testé.

Mon emerge --info accessible ici :

http://arbalette.hopto.org/images/forums/emerge-info.txt

----------

## sebB

T'as changé quelque chose dans ton make.conf?

 *Quote:*   

> ffmpeg version 2.8.5 Copyright (c) 2000-2016 the FFmpeg developers
> 
> built with gcc 4.8.5 (Gentoo 4.8.5 p1.3, pie-0.6.2)
> 
> configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64

 

 *Quote:*   

> >>> Emerging (11 of 11) media-video/ffmpeg-2.8.5-r1::thibaut_perso
> 
> * ffmpeg-2.8.5.tar.bz2 SHA256 SHA512 WHIRLPOOL size  ... [ ok ]
> 
> .
> ...

 

----------

## l_arbalette

Non, c'est très rare que j'y touche.

La, en l'occurrence, je n'y ai pas touché. 

Mais ce que tu pointes du doigt a effectivement l'air prometteur....

Qu'est-ce qui influence cette ligne --libdir ?

Effectivement, ça ne va pas chercher dans le bon répertoire..

----------

## l_arbalette

En creusant, je comprend que ce /usr/lib32 est envoyé par la fonction get_libdir, appelé ici dans l'ebuild :

 *Quote:*   

> 		--libdir="${EPREFIX}/usr/$(get_libdir)" \
> 
> 		--shlibdir="${EPREFIX}/usr/$(get_libdir)" \

 

Au passage, il semblerait que les fonctions tc-getCC et tc-getCXX renvoient elles-aussi une information erronée, puisqu'elles renvoient

 *Quote:*   

> --cc=x86_64-pc-linux-gnu-gcc -m32 --cxx=x86_64-pc-linux-gnu-g++ -m32 

 

ou le -m32 n'est pas là normalement...

puisque dans ma version compilée de ffmpeg, j'ai bien ceci :

 *Quote:*   

> --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ 

 

Ces fonctions sont appelées juste en dessous dans l'ebuild :

 *Quote:*   

> --cc="$(tc-getCC)" \
> 
> 		--cxx="$(tc-getCXX)" \

 

Ces fonctions viennent des eclass multilib.eclass et toolchain.eclass.

Si on se concentre sur /usr/portage/lass/multilib.eclass, c'est à priori la fonction get_abi_var() appelée avec l'argument LIBDIR qui fait le boulot :

 *Quote:*   

> get_abi_var() {
> 
>         local flag=$1
> 
>         local abi=${2:-${ABI:-${DEFAULT_ABI:-default}}}
> ...

 

Ma compréhension (très limitée) du bash me laisse penser que c'est la variable ${abi} qui renvoit une mauvaise valeur...

Reste à comprendre ou est-ce que cette variable est définie...

D'après les commentaires de la fonction :

 *Quote:*   

> # @RETURN: returns the value of ${<VAR>_<ABI>} which should be set in make.defaults

 

ça devrait être dans make.defaults de mon profile.

Je suis allé voir quel profile était activé :

```
eselect profile show

default/linux/amd64/13.0/desktop/kde

```

Je suis allé voir le contenu de  mon profile :

 *Quote:*   

> ls -lha /usr/portage/profiles/default/linux/amd64/13.0/desktop/kde
> 
> total 20K
> 
> drwxr-xr-x 3 portage portage 4,0K 27 févr. 13:01 .
> ...

 

Le fichier parent m'informe qu'en fait, la cible se situe /usr/portage/profiles/targets/desktop/kde/ dans lequel j'ai bien un fichier make.defaults

mais dont le contenu est réduit à sa plus simple expression

 *Quote:*   

> # Copyright 1999-2011 Gentoo Foundation
> 
> # Distributed under the terms of the GNU General Public License v2
> 
> # $Id$
> ...

 

du coup, je suis un peu coincé dans l'analyse...

----------

## l_arbalette

suspectant un problème d'ABI (multilib) vu les problèmes rencontrés, j'ai essayé carrément d'empêcher l'ABI x86 d'avoir le dessus sur l'ABI standard chez moi, c'est à dire amd64.

pour ce faire, j'ai ajouté dans package.use

 *Quote:*   

> =media-video/ffmpeg-2.8.5-r1 libvidstab -abi_x86_32

 

De fait, un nouvel emerge m'a donné un nouveau message d'erreur concernant le fait que ffmpeg était déjà installé sur un slot identique, et que ce n'était pas possible !

donc au lieu de m'en avertir tout de suite précédemment, le système a préféré tenter une installation en changeant l'ABI par défaut...

comportement curieux il me semble, mais bon, bref...

j'ai désinstallé ffmpeg, pour le réinstaller avec mon ebuild.

Et là : ça marche !

Merci à tous ceux qui m'ont aiguillé vers la solution.

 *Quote:*   

> $ ffmpeg -i IMG_2400.MOV -vf vidstabdetect=stepsize=6:shakiness=8:accuracy=9:result=transform_vectors.trf -f null -
> 
> ffmpeg version 2.8.5 Copyright (c) 2000-2016 the FFmpeg developers
> 
>   built with gcc 4.8.5 (Gentoo 4.8.5 p1.3, pie-0.6.2)
> ...

 

----------

