tech memo: fedora libheif

Unfortunately libheif in the default yum repository cannot handle most heic files due to missing libraries.

This is the guide on how to build libheif with required libraries.

build custom libheif with various libraries

AOM https://aomedia.googlesource.com/aom

mkdir dist
cd dist
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=$HOME/apps/aom-bin/ ..
make -j5
make install

libde265 https://github.com/strukturag/libde265

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=$HOME/apps/libde265-bin ..
make -j5
make install

x265 https://github.com/videolan/x265

cd build/arm-linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=$HOME/apps/x265-bin/ ../../source
make -j5
make install

libheif https://github.com/strukturag/libheif

sudo dnf remove libaom-devel
sudo dnf install zlib-ng-compat-devel libpng-devel libtiff-devel libjpeg-devel doxygen libopenjph-devel

mkdir build
cd build

PKG_CONFIG_PATH="$HOME/apps/aom-bin/lib64/pkgconfig:$HOME/apps/libde265-bin/lib64/pkgconfig/:$HOME/apps/x265-bin/lib/pkgconfig/" cmake DCMAKE_INSTALL_PREFIX="$HOME/apps/libheif-bin" ..

make -j5

make install

sudo dnf install libaom-devel

Runtime options

At runtime, please put LD_LIBRARY_PATH as following:

LD_LIBRARY_PATH="$HOME/apps/libde265-bin/lib64/:$HOME/apps/x265-bin/lib/:$HOME/apps/libheif-bin/lib64"

(example)

sudo dnf install ristretto heif-pixbuf-loader libheif

export LD_LIBRARY_PATH="$HOME/apps/libde265-bin/lib64/:$HOME/apps/x265-bin/lib/:$HOME/apps/libheif-bin/lib64"

ristretto .

Thumbnailer replacement

Unfortunately, you can’t use thumbnailer at this time, because tumblerd uses /usr/bin/heif-thumbnailer with no LD_LIBRARY_PATH set. /usr/bin/heif-thumbnailer may work well with above LD_LIBRARY_PATH, but it is safer to use the binary installed at $HOME/apps/libheif-bin/bin. Thus, we need to replace the thumnailer itself, as a user-space configuration. If you want to use system-space configuration but don’t want to make mess with the yum/dnf, try /usr/local/share/thumbnailers.

To replace the default heif thumbnailer, create two files first.

.local/share/thumbnailers/heif.thumbnailer Contents:

[Thumbnailer Entry]
TryExec=/home/<your user name>/Desktop/scripts/heif-thumbnailer.sh
Exec=/home/<your user name>/Desktop/scripts/heif-thumbnailer.sh -s %s %i %o
MimeType=image/heif;image/avif;

/home/<your user name>/Desktop/scripts/heif-thumbnailer.sh Contents:

#!/bin/bash

export LD_LIBRARY_PATH="$HOME/apps/libde265-bin/lib64/:$HOME/apps/x265-bin/lib/:$HOME/apps/libheif-bin/lib64"

export PATH="$HOME/apps/libheif-bin/bin:$PATH"

heif-thumbnailer "$@"

DO NOT FORGET to append executable permissions to BOTH heif-thumbnailer.sh AND heif.thumbnailer.

chmod +x $HOME/Desktop/scripts/heif-thumbnailer.sh $HOME/.local/share/thumbnailers/heif.thumbnailer