# Build voxl-uvc-server with voxl-cross

Source: https://forum.modalai.com/topic/793/build-voxl-uvc-server-with-voxl-cross
Category: VOXL SDK and Software (https://forum.modalai.com/category/47/voxl-sdk-and-software)
Tags: mpa
Posted: 2022-03-09 16:48:50 UTC by Philemon Benner
Replies: 24 · Views: 9198

## Philemon Benner · 2022-03-09 16:48:50 UTC

@Eric-Katzfey 
Hey,
i am currently trying to integrate voxl-uvc-server dev with voxl-tflite-server. But i am having issues compiling it in voxl-cross. Build Error is shown below:
```
voxl-cross:~(dev)$ ./build.sh 
Building for voxl
BUILDSIZE=32
BUILDSIZE does not match 64
-- Configuring done
-- Generating done
-- Build files have been written to: /home/root/build32
Consolidate compiler generated dependencies of target voxl-uvc-server
[ 50%] Linking C executable voxl-uvc-server
/usr/lib/libmodal_json.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
CMakeFiles/voxl-uvc-server.dir/build.make:98: recipe for target 'voxl-uvc-server' failed
make[2]: *** [voxl-uvc-server] Error 1
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/voxl-uvc-server.dir/all' failed
make[1]: *** [CMakeFiles/voxl-uvc-server.dir/all] Error 2
Makefile:135: recipe for target 'all' failed
make: *** [all] Error 2
```
Help would be appreciated.

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-09 17:21:58 UTC

@Philemon-Benner The build instructions are here: https://gitlab.com/voxl-public/modal-pipe-architecture/voxl-uvc-server/-/tree/dev. In short, you need to build in the emulator, not with voxl-cross.

## Reply by Philemon Benner · 2022-03-09 18:22:29 UTC (in reply to Eric Katzfey)

@Eric-Katzfey yeah i know, but is it possible to do it in voxl-cross or what would i have to change to make it work with voxl-cross?

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-09 18:42:26 UTC (in reply to Philemon Benner)

@Philemon-Benner You would need to change it. Is there a reason that you prefer building in voxl-cross?

## Reply by Philemon Benner · 2022-03-10 08:36:43 UTC (in reply to Eric Katzfey)

@Eric-Katzfey Not really it's used in the tutorial for building voxl-tflite-server from source. I basically want to replace libmodal pipe input with libuvc in the tflite-server, using parts of the voxl-uvc-server. Is it possible to build tflite-server in the voxl-emulator without changing anything?

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-10 18:16:36 UTC (in reply to Philemon Benner)

@Philemon-Benner That's not something we have tried. But I can't imagine that it would be too difficult to get voxl-tflite-server building in voxl-emulator. Any reason that you can't leave voxl-uvc-server and voxl-tflite-server as separate processes communicating via MPA?

## Reply by Philemon Benner · 2022-03-10 18:25:20 UTC (in reply to Eric Katzfey)

@Eric-Katzfey yeah i want to have in/output in one executable(tflite-server). So that i have better control and exception handling for these. I will try and integrate tflite-server in voxl-emulator.

## Reply by Philemon Benner · 2022-03-11 10:22:02 UTC

@Eric-Katzfey so tried compiling tflite-server in voxl-emulator, but when building it complains about everything. So i tried just integrating libuvc in tflite-server in voxl-cross. Installation works fine. But when building it's complaining about libuvc being incompatible. Is it because i'm trying to build it with arm64 instead of the way voxl-emulator does in arm32 ?(mentioned in the docs https://gitlab.com/voxl-public/utilities/voxl-docker) What would i have to change to build in voxl-cross?

Package Installation:
```
voxl-cross:~$ ./install_build_deps.sh dev
using dev IPK repo
Downloading http://voxl-packages.modalai.com/dev/Packages.gz.
Updated source 'dev'.
installing: 
libmodal-pipe libmodal-json voxl-opencv voxl-tflite libuvc
Installing libmodal-pipe (2.1.5) on root.
Downloading http://voxl-packages.modalai.com/dev/libmodal-pipe_2.1.5_202203110042.ipk.
Configuring libmodal-pipe.
Installing libmodal-json (0.4.0) on root.
Downloading http://voxl-packages.modalai.com/dev/libmodal-json_0.4.0_202203110044.ipk.
Configuring libmodal-json.
Installing voxl-opencv (4.5.5) on root.
Downloading http://voxl-packages.modalai.com/dev/voxl-opencv_4.5.5_202202082046.ipk.
Configuring voxl-opencv.
Installing voxl-tflite (2.2.3) on root.
Downloading http://voxl-packages.modalai.com/dev/voxl-tflite_2.2.3-1_202201270503.ipk.
Configuring voxl-tflite.

Done installing voxl-tflite

Installing libuvc (1.0.3) on root.
Downloading http://voxl-packages.modalai.com/dev/libuvc_1.0.3_202201232120.ipk.
Configuring libuvc.
/home/root

Done installing libuvc

Done installing dependencies
```
Build Output: 
```
voxl-cross:~$ ./build.sh 820
-- The C compiler identification is GNU 4.9.3
-- The CXX compiler identification is GNU 4.9.3
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc-4.9 - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++-4.9 - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/root/build64
[ 50%] Building CXX object src/CMakeFiles/voxl-tflite-server.dir/main.cpp.o
[ 50%] Building CXX object src/CMakeFiles/voxl-tflite-server.dir/inference_helper.cpp.o
[ 75%] Building C object src/CMakeFiles/voxl-tflite-server.dir/resize.c.o
In file included from /usr/aarch64-linux-gnu-2.23/include/features.h:367:0,
                 from /usr/aarch64-linux-gnu-2.23/include/stdio.h:27,
                 from /home/root/src/resize.c:1:
/usr/aarch64-linux-gnu-2.23/include/bits/stdlib.h:64:8: warning: no previous declaration for 'ptsname_r' [-Wmissing-declarations]
 __NTH (ptsname_r (int __fd, char *__buf, size_t __buflen))
        ^
/usr/aarch64-linux-gnu-2.23/include/sys/cdefs.h:57:59: note: in definition of macro '__NTH'
 #  define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct
                                                           ^
[100%] Linking CXX executable voxl-tflite-server
/usr/lib/gcc-cross/aarch64-linux-gnu/4.9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/../lib/libuvc.so when searching for -luvc
/usr/lib/gcc-cross/aarch64-linux-gnu/4.9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/../lib/libuvc.a when searching for -luvc
/usr/lib/gcc-cross/aarch64-linux-gnu/4.9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible //usr/lib/libuvc.so when searching for -luvc
/usr/lib/gcc-cross/aarch64-linux-gnu/4.9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible //usr/lib/libuvc.a when searching for -luvc
/usr/lib/gcc-cross/aarch64-linux-gnu/4.9/../../../../aarch64-linux-gnu/bin/ld: cannot find -luvc
collect2: error: ld returned 1 exit status
src/CMakeFiles/voxl-tflite-server.dir/build.make:128: recipe for target 'src/voxl-tflite-server' failed
make[2]: *** [src/voxl-tflite-server] Error 1
CMakeFiles/Makefile2:97: recipe for target 'src/CMakeFiles/voxl-tflite-server.dir/all' failed
make[1]: *** [src/CMakeFiles/voxl-tflite-server.dir/all] Error 2
Makefile:135: recipe for target 'all' failed
make: *** [all] Error 2
```

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-11 16:57:24 UTC (in reply to Philemon Benner)

@Philemon-Benner You can build a 64 bit version of libuvc with the dev branch on our libuvc project: https://gitlab.com/voxl-public/third-party/libuvc/-/tree/dev. Use the instructions to build for qrb5165 and it will produce 64 bit versions.

## Reply by Philemon Benner · 2022-03-11 17:46:20 UTC (in reply to Eric Katzfey)

@Eric-Katzfey Do i have to use the qrb-emulator for that or can i do it in voxl-emulator?

## Reply by Philemon Benner · 2022-03-11 18:33:18 UTC (in reply to Philemon Benner)

@Eric-Katzfey tried that getting the following errors:
```
/usr/lib/gcc-cross/aarch64-linux-gnu/4.9/../../../../aarch64-linux-gnu/bin/ld: warning: libusb-1.0.so.0, needed by /usr/lib/../lib/libuvc.so, not found (try using -rpath or -rpath-link)
/usr/lib/gcc-cross/aarch64-linux-gnu/4.9/../../../../aarch64-linux-gnu/bin/ld: warning: libjpeg.so.8, needed by /usr/lib/../lib/libuvc.so, not found (try using -rpath or -rpath-link)

```
when trying to build in tflite-server. I Built libuvc in qr-emulator. Installed the deb file in tflite-server without errors.

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-11 18:39:57 UTC (in reply to Philemon Benner)

@Philemon-Benner In voxl-cross?

## Reply by Philemon Benner · 2022-03-11 18:43:08 UTC

yeah i think i need to install libusb and libjpeg but wich exact verisions?

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-11 18:47:00 UTC (in reply to Philemon Benner)

@Philemon-Benner Now you are starting to see the problem with voxl-cross. It is a much faster way to compile code but for projects that have more complex dependencies it can be a real pain to get them setup. That is why some projects use voxl-emulator. It's much easier to setup dependencies there.

## Reply by Philemon Benner · 2022-03-11 18:47:20 UTC (in reply to Eric Katzfey)

@Eric-Katzfey yeah i see

## Reply by Philemon Benner · 2022-03-11 21:32:09 UTC (in reply to Philemon Benner)

Ok so i finally got it working if someone ever needs it, with installing:
```
sudo apt-get update
sudo apt-get install libusb-1.0-0:arm64
sudo apt-get install libjpeg-turbo8:arm64
```
For other third part libraries add the :arm64 architecture when building with 820, because in voxl-cross it will install amd64 by default. Still wondering what 820 exactly is:thinking_face: 

Thanks @Eric-Katzfey for the suggestion on the 64-Bit deb package.

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-11 22:37:35 UTC (in reply to Philemon Benner)

@Philemon-Benner 820 refers to the Qualcomm Snapdragon 820 SoC that is the heart of the Voxl product. https://www.qualcomm.com/products/snapdragon-820-mobile-platform

## Reply by Philemon Benner · 2022-03-11 22:43:21 UTC

@Eric-Katzfey Ok i ran into the next problem when trying to run tflite-server.
```
voxl:~/tflite-server(master)$ voxl-tflite-server -t -d
voxl-tflite-server: error while loading shared libraries: libuvc.so.0: cannot open shared object file: No such file or directory
```
Tried to install the 64-Bit BInary file but it's throwing the following error:
```
voxl:~/tflite-server(master)$ opkg install libuvc_1.0.3.deb
Collected errors:
 * pkg_extract_control_file_to_stream: Failed to extract control.tar.gz from package 'libuvc_1.0.3.deb'.
 * pkg_init_from_file: Failed to extract control file from libuvc_1.0.3.deb.
```
So i tried using this from ur code:
```
voxl:~/tflite-server(master)$ dpkg -i --force-downgrade --force-depends /data/libuvc_1.0.3.deb
-bash: dpkg: command not found
```
Normal installation from modalai dev branch still throws the same error after installation:
```
opkg install libuvc
```
Any suggestions?

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-11 23:05:22 UTC (in reply to Philemon Benner)

@Philemon-Benner You can only install a Debian package with dpkg, which we have on our qrb5165 based platform, but not on our 820 based Voxl. That only has opkg and you need ipk packages, not debian packages.

## Reply by Philemon Benner · 2022-03-14 08:49:07 UTC (in reply to Eric Katzfey)

@Eric-Katzfey Ok so i got working now but i am having issues with the Format. So when using UVC Server i got the response that frame format succeed on index 2. In your voxl-uvc-server code at the Top Frame Format 2 should be:
```
static enum uvc_frame_format supported_frame_format[NUM_SUPPORTED_FRAME_FORMATS] =
     {UVC_FRAME_FORMAT_YUYV, UVC_FRAME_FORMAT_UYVY, UVC_FRAME_FORMAT_NV12};
static int supported_mpa_frame_format[NUM_SUPPORTED_FRAME_FORMATS] =
     {IMAGE_FORMAT_YUV422, IMAGE_FORMAT_YUV422_UYVY, IMAGE_FORMAT_NV12};
```
supported mpa_frame_format = IMAGE_FORMAT_NV12 = 1 //  regarding to https://gitlab.com/voxl-public/modal-pipe-architecture/libmodal_pipe/-/blob/master/library/include/modal_pipe_interfaces.h
frame_format supported_frame_format = FRAME_FORMAT_NV12 = 17 

But still i am getting a real weird looking image(wrong colors) voxl-portal. Are the Configurations right that i use, or is it something else? Can't upload any pictures rn becuase of some server error.

## Reply by Philemon Benner · 2022-03-14 09:09:44 UTC

Ok so apparrently the Frame format stuff is alright when directly writing the frame from the callback to the pipe server. I think it's some fault in the code. One Question why are you using c instead of c++? I'm not an expert at c/c++ stuff but i was told that c++ is generally faster than c.

## Reply by Philemon Benner · 2022-03-14 09:35:20 UTC

Ok i got it working now.
@Eric-Katzfey i don't know anything of the qrb thing but in the dev libuvc branch, if you build it in 64-Bit version, why is it then copied in the 32-Bit dir in your make_package.sh L:87-89:
```
sudo mkdir -p $DATA_DIR/usr/lib
sudo cp build/libuvc.so.0.0.6 $DATA_DIR/usr/lib
sudo cp build/libuvc.a $DATA_DIR/usr/lib
``` 
an if else would be nice.
```
sudo mkdir -p $DATA_DIR/usr/lib64
sudo cp build/libuvc.so.0.0.6 $DATA_DIR/usr/lib64
sudo cp build/libuvc.a $DATA_DIR/usr/lib64
```
also had to add:
```
sudo cp /usr/lib/aarch64-linux-gnu/libjpeg.so.8 $DATA_DIR/usr/lib64
sudo cp /usr/lib/aarch64-linux-gnu/libjpeg.so.8.1.2 $DATA_DIR/usr/lib64
```
to make it work on voxl because voxl doesn't have it installed by default.

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-14 16:28:58 UTC (in reply to Philemon Benner)

@Philemon-Benner I'm not sure where those lines of code came from. The file make_package.sh in the dev branch has this for lines 87-89: 
```
	sudo mkdir -p $DATA_DIR/usr/lib
	sudo cp $BUILD_TYPE/libuvc.so.0.0.6 $DATA_DIR/usr/lib
	sudo cp $BUILD_TYPE/libuvc.a $DATA_DIR/usr/lib
```
Where BUILD_TYPE will be either build32 or build64. It looks like you are taking from lines 65-66 on the master branch.

## Reply by Philemon Benner · 2022-03-15 19:41:58 UTC (in reply to Eric Katzfey)

@Eric-Katzfey yeah that was mb it's the one from the dev branch, but still even if i'ts 64-Bit, files are copied to 32-Bit lib:
```
sudo mkdir -p $DATA_DIR/usr/lib
```
instead of:
```
sudo mkdir -p $DATA_DIR/usr/lib64
```
for 64-Bit. Correct me if i'm wrong.

## Reply by Eric Katzfey (ModalAI staff) · 2022-03-15 19:59:19 UTC (in reply to Philemon Benner)

@Philemon-Benner Our qrb5165 based platforms put 64 bit libraries into /usr/lib. On Voxl the 64 bit libraries go into /usr/lib64. So the 64 bit support is specifically for our qrb5165 based platforms (e.g. RB5 Flight).
