How to bring fully distributed and secure communication capabilities to embedded products and IOT (Part 2).

In a previous article, we presented our work on including Jami in Yocto. This was a huge step to make Jami available on all types of devices. But this Yocto layer was only usable for x86 architectures. In fact, it was a step towards the embedded world, but it did not prove that Jami could run on an embedded board. That is why we have created a layer to run Jami on i.MX6. This article details the reasons why we add Jami to an embedded board and how we have done to run Jami on an i.MX6.

Why add Jami to an embedded board ?

Jami is an open source communication tool developed by Savoir-faire Linux. Running Jami on an embedded board such as the Toradex Apalis i.MX6 opens the opportunity to run it on other embedded boards. It also creates the possibility to have secure communication and private life protection on all kinds of devices. In today’s world and more tomorrow, lots of objects are connected to the Internet. This technology is called Internet of Things (IoT). These new multimedia communications are not confined to smartphones and laptops, but are new used in personnal assistants, connected ringbells, babyphones, and much more. The security of these communications is very important for our private life. Jami therefore fits into this objective with its serverless, distributed and secure end-to-end encrypted communications.

Jami is available at https://jami.net 

A layer system to run Jami on any platform

Yocto is organized on a layer system. This gives the freedom to take an existing layer and customize it by creating our own one on top of it. Therefore, the Jami i.MX6 layer is based on the previously created Jami layer (https://github.com/savoirfairelinux/meta-jami).

The main purpose of our work was to port Jami on a Toradex Apalis i.MX6 board without any significant source code modifications. Consequently, we created a layer that provides a machine, a distro and an image which includes Jami to run it on the Apalis i.MX6. The only source code modifications that we made was to use the hardware encoders and decoders of the i.MX6

Thus, we created two layers, the first one (meta-jami-imx : https://github.com/savoirfairelinux/meta-jami-imx) which includes Jami for i.MX6, that you can add to your i.MX6 custom image. And a second one (meta-jami-imx-toradex : https://github.com/savoirfairelinux/meta-jami-imx-toradex) that you just have to compile if you want to run Jami on the Toradex Apalis i.MX6.

Our work has been tested with a Toradex kernel based on a Freescale one. But you are free to use a mainline kernel, and it will not lead to a compiling issue. 

How it works ?

In order to perform a call, we need to use the hardware encoders and decoders present on the board instead of software ones. Without hardware acceleration, all video encoding and decoding operations are executed on the CPU. Video compression and decompression are complex algorithms that generally can not be executed in real time on CPU cores. Therefore, using software codecs would make Jami unusable.

Jami is based on FFmpeg, and it doesn’t support i.MX hardware codecs. That is why, we applied some patches to FFmpeg to include these codecs (https://github.com/savoirfairelinux/FFmpeg/tree/sfl/master). We added h264 encoder and decoder for sending and receiving video, as well as MJPEG decoder to support some camera output format. In order to add them we based our work on the community API libimxvpuapi that provides the control of the i.MX VPUs (https://github.com/Freescale/libimxvpuapi). In addition, the only Jami source code modifications that we made, is to use these hardware encoders and decoders of the i.MX6.


To sum up, you can pick the layers you want for your personal purpose. To run Jami on x86, add meta-jami to your project ; to run Jami on an i.MX6, add meta-jami-imx6 to your Yocto environment. Finally, a straightforward test would be to take meta-jami-imx-toradex and its dependencies, build the image provided, and you can enjoy Jami on the Toradex Apalis i.MX6.

Leave a comment

Your email address will not be published. Required fields are marked *

Similar articles

Image of an arrow
Thumbnail image

We are delighted to announce our continued collaboration with the Embedded Recipes conference, scheduled for September 28th and 29th at the Biermans Lapotre Foundation in Paris. For its 5th edition this year, we will be participating as a sponsor, delivering an engaging presentation, and having our team on-site to meet and greet you in person! […]

Thumbnail image

TL;DR Audio pipelines often use asynchronous devices, which must be synchronized with resampling. Measurements show CPU load of resampling reach almost 30% of a CPU core on an i.MX8M Nano. A possible optimization is to use feedback with USB UAC2 audio gadget. alsaloop already supports it, as Pipewire since a recent version. A sound server […]

Paris, June 1st, 2023 – French-Canadian company Savoir-faire Linux, a leader in open-source technological innovation and digital transformation across Canada and Europe, is set to unveil its first-ever commercial support offering for the Seapath project. This key initiative will be launched at two pivotal events in the energy industry: the LF Energy Summit in Paris […]

PipeWire, implementation and evaluation In the last article, we prepared an audio system on which we could replace the sound server. In addition, we explained the main concepts of JACK and PulseAudio in audio recording and playback. This second part presents PipeWire, how to use it in our audio system and measures its performance. PipeWire PipeWire is […]

Audio system set-up In Linux embedded system world, ALSA (Advanced Linux Sound Architecture) is the lowest level way to provide an API for sound card device drivers. However, its limitation is to only allow one process to open a device. This is why we need sound servers, which take care of handling sound streams between applications. They are the […]