Hardkernel released their first Samsung Exynos 5422 octa-core board in July 2014 with ODROID-XU3, which at the time was really a powerful board, but also pricey at $179. Later that year, the company released a cheaper version ($99) called ODROID-XU3 Lite, which I had the chance to review with Ubuntu 14.04 and Android 4.4.
The company’s adventure with Exynos 5422 processor did not stop there, as in 2015 they released the smaller and even cheaper ($74) ODROID-XU4 board, and last year launched a fanless version of the board with ODROID-XU4Q featuring a large heatsink. More recently, the company also introduced ODROID-HC1 and ODROID-MC1 solutions for respectively network storage and clusters applications.
That’s the short history of Hardkernel Exynos 5422 boards as I remember it, and that means that since 2014, or nearly 4 years so far, the company has kept updating Ubuntu and Android firmware for their board, including the just released Ubuntu 18.04 (MATE) operating system, which I’m going to test on ODROID-XU4Q sample provided by the company in this review.
ODROID-XU4Q Unboxing
Let’s have a look at the hardware kit I got first. I received an ODROID cardboard package with two smaller white packages, an acrylic case, and a zip bag with some accessories.

List of accessories: 5V/4A power supply, acrylic enclosure and screws, the RTC battery, and a USB 3.0 to eMMC reader.

The board itself comes with a paper showing how to get started on ODROID-XU4 on one side…

… and a description of the board on the other side. My board was also fitted with a 32GB eMMC flash module pre-loaded with a beta version of their Ubuntu 18.04 MATE image.

Looking at the board, the large Blue heatsink stands out, and on one side we have Gigabit Ethernet, a USB 2.0 port, the DC jack, a micro SD card slot, and HDMI 1.4 output…

… while on the other side, we’ll find expansion headers, the power button, two USB3.0 ports, and on the right on the photo below header for the serial console and RTC battery.

ODROID-XU4Q Kit Assembly
Assembly of the kit is pretty straightforward, but you’ll still have some work to do, as the case is also designed for ODROID-XU4 board with fan, so I had to cut out the top of case with a cutter to leave room for the top of the heatsink.

I also had to connected the RTC battery, before closing the case, and securing it with two screws underneath.
If you plan on taking out the eMMC flash module often, you may consider cutting out the area on top of the module to avoid having to disassemble each time you want to flash the firmware. I’ll just use apt command to update the firmware, so I left that part of the case untouched.
USB 3.0 eMMC adapter vs micro SD card adapter

My kit came with a USB 3.0 to eMMC reader, but previously I got Hardkernel’s microSD eMMC reader with ODROID-XU3 Lite board. The 32GB eMMC module works on both, but I was interested in whether performance would differ between the two. So I copied large files from my computer to the eMMC module to compare sequential write performance:
- 1.6GB file using USB 3.0 to eMMC reader: 1m 01s on USB 3.0 port, or 26.85 MB/s.
- 1.4 GB file using micro SD card adapter: 54 seconds on USB 2.0 port, or 26.54 MB/s.
So with that 32GB flash module at least, there’s no difference between the two, and the main criteria should be whether you prefer a USB interface, or using a micro SD card reader to flash firmware. Price is also different: $9.90 for the USB eMMC reader, and $1.50 for the micro SD adapter.
[Update: I’ve been told performance with the 32GB eMMC flash module should reach 50MB/s write speed, 80MB/s read speed. See comments.
After further checking, it looks like my computer fails switch to SuperSpeed mode when I insert the USB 3.0 eMMC reader to a USB 3.0 port:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[25828.614761] usb 9-2: new SuperSpeed USB device number 3 using xhci_hcd [25828.641972] usb 9-2: New USB device found, idVendor=05e3, idProduct=0749 [25828.641977] usb 9-2: New USB device strings: Mfr=3, Product=4, SerialNumber=2 [25828.641980] usb 9-2: Product: USB3.0 Flash Disk [25828.641983] usb 9-2: Manufacturer: Generic [25828.641985] usb 9-2: SerialNumber: 000000001538 [25828.642777] usb-storage 9-2:1.0: USB Mass Storage device detected [25828.642992] scsi host7: usb-storage 9-2:1.0 [25829.648050] scsi 7:0:0:0: Direct-Access Generic MassStorageClass 1538 PQ: 0 ANSI: 6 [25829.649033] sd 7:0:0:0: Attached scsi generic sg4 type 0 [25829.984563] sd 7:0:0:0: [sdd] 61071360 512-byte logical blocks: (31.3 GB/29.1 GiB) [25829.985178] sd 7:0:0:0: [sdd] Write Protect is off [25829.985183] sd 7:0:0:0: [sdd] Mode Sense: 21 00 00 00 [25829.985739] sd 7:0:0:0: [sdd] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [25829.989213] sdd: sdd1 sdd2 [25829.991209] sd 7:0:0:0: [sdd] Attached SCSI removable disk [25835.082974] usb 9-1: Device not responding to setup address. [25835.559047] usb 9-1: Device not responding to setup address. [25835.766595] usb 9-1: device not accepting address 4, error -71 [25835.766611] xhci_hcd 0000:02:00.0: Cannot set link state. [25835.766634] usb usb9-port1: cannot disable (err = -32) [25837.202852] usb 9-1: new SuperSpeed USB device number 5 using xhci_hcd [25837.233578] usb 9-1: New USB device found, idVendor=05e3, idProduct=0616 [25837.233580] usb 9-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [25837.233581] usb 9-1: Product: USB3.0 Hub [25837.233582] usb 9-1: Manufacturer: GenesysLogic [25837.235131] hub 9-1:1.0: USB hub found [25837.773274] hub 9-1:1.0: config failed, can't read hub descriptor (err -22) [25837.773396] xhci_hcd 0000:02:00.0: Cannot set link state. [25838.041943] usb 9-1: Failed to suspend device, error -32 [25838.222657] usb 9-1: USB disconnect, device number 5 |
So the main takeway is that both the micro SD card & eMMC flash readers are capable of good performance up to 80MB/s, but the actual results will depend on your host computer / micro SD card reader.]
Ubuntu 18.04 MATE on ODROID-XU4
The first thing you’ll want to do is to get the Ubuntu 18.04 image for ODROID-XU4/XU3, and flash it to the eMMC module or micro SD card using Etcher. If you already own a board running Ubuntu 16.04, you can easily upgrade from the command line instead:
|
1 2 3 |
sudo apt update sudo apt dist-upgrade sudo reboot |

I connected my board to Ethernet, the HDMI port of my TV, added a USB 3.0 hard drive for good measure, the wireless USB dongle for my keyboard and mouse, and finally applied power, and within around 30 to 40 seconds, I got the Ubuntu 18.04 MATE desktop.
Here’s the Linux part of the boot log for reference:
|
1 |
Some system information:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
odroid@odroid:~$ uname -a Linux odroid 4.14.37-135 #1 SMP PREEMPT Sun Apr 29 23:34:43 -03 2018 armv7l armv7l armv7l GNU/Linux odroid@odroid:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS" odroid@odroid:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 927M 0 927M 0% /dev tmpfs 200M 6.3M 194M 4% /run /dev/mmcblk0p2 29G 3.7G 25G 13% / tmpfs 998M 0 998M 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 998M 0 998M 0% /sys/fs/cgroup /dev/mmcblk0p1 128M 18M 111M 14% /media/boot tmpfs 200M 40K 200M 1% /run/user/1000 /dev/sda3 245G 163G 82G 67% /media/odroid/USB3_EXFAT /dev/sda2 241G 163G 66G 72% /media/odroid/USB3_EXT4 /dev/sda4 200G 175G 24G 89% /media/odroid/USB3_BTRFS odroid@odroid:~$ free -m total used free shared buff/cache available Mem: 1994 290 1148 22 555 1626 Swap: 0 0 0 |
So that’s indeed Ubuntu 18.04 with Linux 4.14, 2GB RAM, and a 32GB flash with a 29GB rootfs partition. My USB drive partitions were also recognized, expcet the NTFS. But running ntfsfix on /dev/sda1 did resolve the issue, and all four file systems (NTFS, EXTFAT, EXT4, and BTRFS) used in my external drive worked.
I installed some of my favorite applications like Firefox and Gimp, and remove some I did need, but soon I realized Firefox would just crash at startup. Hardkernel told me it’s expected since Firefox 32-bit is not supported anymore, and I’d have to use a older version. Oh well, I kept using Chromium especially the image is supposed to support YouTube up to 720p, and WebGL.
I ran several tests to check of the supported features of Ubuntu 18.04 on the $60 board:
- Office applications – Open odt “word” file in LibreOffice, open large PDF (ODROID Magazine 2018) in Evince
- Emails with Thunderbird + Web browsing with Chromium – Opening multiple tab, Youtube 720p and 1080p, Candy Crush Saga (HTML5 games) in Facebook, and WebGL Quake demo
- 3D graphics – glmark2-es2 and es2gears
- H.264 Video Playback in Kodi 17.6 and ffplay (FFmpeg player)
- I/Os – WiringPi installation + test, RTC control
You can see the results in the video below. Sorry for the “grid effect” on parts of the video.
If you don’t have time to watch the 20-minutes video, basically considering the costs of the board, and 2GB RAM, I’m pleasantly surprised by the performance of the board with accelerated 3D graphics working well in demos and some webGL demos, H.264 hardware decoding in Kodi and FFmpeg working well up to 1080p, and Youtube up to 720p, fast program load times thanks to the eMMC flash module, and decent multi-tasking ability.
For the latter however, you must be aware of the 2GB RAM limitation, as if the memory is almost full (and virtual memory is not enabled), the system will still run, but very very slowly, almost as it had hung. Once I close one or two programs it run normally again. Some webGL application are not working well (e.g. Google Experiments), but I was told it could because they may be based on OpenGL instead of OpenGL ES. Youtube works well up to 720p in Chromium, but you can also select 1080p, but don’t – just don’t – do it as video will not be smooth. The worst experience in my little test was with Candy Crush Saga which took about 2 minutes 30 seconds to load the game and one level, but once you’ve started playing all is well. I was told it’s because of complex HTML5 code. In the past I played the game on Intel Bay Trail systems with 2GB RAM and 32GB storage, and it loaded reasonably fast, but it’s not directly comparable, as the game was still based on Adobe Flash at the time.
The heatsink gets fairly hot during use up to 80°C under load, and a little above 60 C at idle. That’s normal, and does not seem to affect performance much. So based on my short experience, if you have a sudden drop in performance, looks at the memory usage, rather than the CPU temperature.
GPIO Support
Let me provide a few more details about GPIO support. WiringPi is not installed by default, as few use GPIOs, but it’s easy enough to install.
|
1 2 3 4 |
sudo apt install git git clone https://github.com/hardkernel/wiringPi cd wiringPi sudo ./build |
We can now list supported GPIOs with the usual command line:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
gpio readall +------+-----+----------+------ Model ODROID-XU3/4 ------+----------+-----+------+ | GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO | +------+-----+----------+------+---+----++----+---+------+----------+-----+------+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 209 | 8 | I2C1.SDA | ALT5 | 1 | 3 || 4 | | | 5V | | | | 210 | 9 | I2C1.SCL | ALT5 | 1 | 5 || 6 | | | 0v | | | | 18 | 7 | GPIO. 18 | IN | 0 | 7 || 8 | 1 | ALT5 | UART0.TX | 15 | 172 | | | | 0v | | | 9 || 10 | 0 | ALT5 | UART0.RX | 16 | 171 | | 174 | 0 | GPIO.174 | ALT5 | 1 | 11 || 12 | 0 | ALT5 | GPIO.173 | 1 | 173 | | 21 | 2 | GPIO. 21 | IN | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 22 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 19 | 4 | 19 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 23 | 5 | 23 | | 192 | 12 | MOSI | ALT5 | 1 | 19 || 20 | | | 0v | | | | 191 | 13 | MISO | ALT5 | 1 | 21 || 22 | 0 | IN | GPIO. 24 | 6 | 24 | | 189 | 14 | SCLK | ALT5 | 0 | 23 || 24 | 1 | OUT | CE0 | 10 | 190 | | | | 0v | | | 25 || 26 | 1 | OUT | GPIO. 25 | 11 | 25 | | 187 | 30 | I2C5.SDA | ALT5 | 1 | 27 || 28 | 1 | ALT5 | I2C5.SCL | 31 | 188 | | 28 | 21 | GPIO. 28 | IN | 0 | 29 || 30 | | | 0v | | | | 30 | 22 | GPIO. 30 | IN | 0 | 31 || 32 | 0 | IN | GPIO. 29 | 26 | 29 | | 31 | 23 | GPIO. 31 | IN | 0 | 33 || 34 | | | 0v | | | | | 24 | POWER ON | | | 35 || 36 | 0 | IN | GPIO. 33 | 27 | 33 | | | 25 | AIN.0 | | | 37 || 38 | | | 1v8 | 28 | | | | | 0v | | | 39 || 40 | | | AIN.3 | 29 | | +------+-----+----------+------+---+----++----+---+------+----------+-----+------+ |
RTC Support
The board also support RTC, and my kit came with an RTC battery so even in case of power failure the time and date will be kept. I could check the date (from NTP), write it to the RTC, and read it back.
|
1 2 3 4 5 |
odroid@odroid:~/wiringPi$ date Sat May 5 14:46:26 +07 2018 odroid@odroid:~/wiringPi$ sudo hwclock -w odroid@odroid:~/wiringPi$ sudo hwclock -r 2018-05-05 14:46:38.322792+0700 |
Just to make sure, I did a quick test later on, by disconnecting the Ethernet cable, and rebooting the board:
|
1 2 3 4 5 6 7 |
odroid@odroid:~$ uptime 16:06:58 up 0 min, 1 user, load average: 1.53, 0.41, 0.14 odroid@odroid:~$ sudo mii-tool eth0 [sudo] password for odroid: eth0: no link odroid@odroid:~$ date Sat May 5 16:07:09 +07 2018 |
The date and time were still correct, meaning they were automatically retrieved from the RTC at boot time.
Performance Testing – Building the kernel, AV Transcoding, Storage and Network Performance
Just like I did for ODROID-XU3 Lite, I did some real-time test to give an idea of the performance for some tasks like building the Linux kernel, and transcoding a video.
The kernel compilation test also allows use to learn how to build the Linux 4.14 kernel used in the board. I just followed the instructions in the Wiki:
|
1 2 3 4 5 6 7 8 9 |
sudo apt install git gcc g++ build-essential libssl-dev git clone --depth 1 https://github.com/hardkernel/linux -b odroidxu4-4.14.y cd linux make odroidxu4_defconfig time make -j8 ... real 38m47.360s user 255m45.448s sys 23m35.780s |
So the kernel build itself took almost 39 minutes with the 32GB eMMC module. That’s much longer than when I built mainline Linux on ODROID-XU3 Lite a couple of years ago, but that’s easily explained because mainline does not have that many modules enabled by default. To complete the build, we also need to install the modules, zImage and the device tree files:
|
1 2 3 4 |
sudo make modules_install sudo cp -f arch/arm/boot/zImage /media/boot sudo cp -f arch/arm/boot/dts/exynos5422-odroid*dtb /media/boot sync |
For reference, the command to install modules processed 1,442 modules… At next reboot, you’ll be using your freshly built kernel.
The next test is (software) transcoding of an MPEG-2 video into MPEG-4.
|
1 2 3 |
sudo apt install libav-tools time avconv -i big_buck_bunny_1080p_MPEG2_MP2_25fps_6600K.MPG \ -vcodec libx264 -minrate 300k -maxrate 300k -bufsize 1835k bbb-h.264.avi |
The output will show some errors, and it will exit prematurely with the output video unplayable:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
ffmpeg version 3.4.2-2ubuntu3 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 7 (Ubuntu/Linaro 7.3.0-15ubuntu2) configuration: --prefix=/usr --extra-version=2ubuntu3 --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-v4l2_m2m --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared libavutil 55. 78.100 / 55. 78.100 libavcodec 57.107.100 / 57.107.100 libavformat 57. 83.100 / 57. 83.100 libavdevice 57. 10.100 / 57. 10.100 libavfilter 6.107.100 / 6.107.100 libavresample 3. 7. 0 / 3. 7. 0 libswscale 4. 8.100 / 4. 8.100 libswresample 2. 9.100 / 2. 9.100 libpostproc 54. 7.100 / 54. 7.100 [mpeg2_v4l2m2m @ 0x4d1630] driver 'exynos-gsc' on card 'exynos-gsc gscaler' Last message repeated 1 times [mpeg2_v4l2m2m @ 0x4d1630] driver 's5p-mfc' on card 's5p-mfc-enc' [mpeg2_v4l2m2m @ 0x4d1630] driver 's5p-mfc' on card 's5p-mfc-dec' [mpeg2_v4l2m2m @ 0x4d1630] Using device /dev/video10 [mpeg2_v4l2m2m @ 0x4d1630] driver 's5p-mfc' on card 's5p-mfc-dec' [mpeg2_v4l2m2m @ 0x4d1630] output POLLERR Input #0, mpeg, from 'big_buck_bunny_1080p_MPEG2_MP2_25fps_6600K.MPG': Duration: 00:00:44.77, start: 0.240000, bitrate: 7155 kb/s Stream #0:0[0x1e0]: Video: mpeg2video, nv21(progressive), 1920x1080, 25 fps, 25 tbr, 90k tbn, 50 tbc Stream #0:1[0x1c0]: Audio: mp2, 44100 Hz, stereo, s16p, 160 kb/s [mpeg2_v4l2m2m @ 0x503ca0] driver 'exynos-gsc' on card 'exynos-gsc gscaler' Last message repeated 1 times [mpeg2_v4l2m2m @ 0x503ca0] driver 's5p-mfc' on card 's5p-mfc-enc' [mpeg2_v4l2m2m @ 0x503ca0] driver 's5p-mfc' on card 's5p-mfc-dec' [mpeg2_v4l2m2m @ 0x503ca0] Using device /dev/video10 [mpeg2_v4l2m2m @ 0x503ca0] driver 's5p-mfc' on card 's5p-mfc-dec' Stream mapping: Stream #0:0 -> #0:0 (mpeg2video (mpeg2_v4l2m2m) -> h264 (libx264)) Stream #0:1 -> #0:1 (mp2 (native) -> mp3 (libmp3lame)) Press [q] to stop, [?] for help [mpeg2_v4l2m2m @ 0x503ca0] output POLLERR [mpeg2_v4l2m2m @ 0x503ca0] capture: driver decode error [libx264 @ 0x50d900] using cpu capabilities: ARMv6 NEON [libx264 @ 0x50d900] profile High, level 4.0 Output #0, avi, to 'bbb-h.264.avi': Metadata: ISFT : Lavf57.83.100 Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), nv21, 1920x1080, q=-1--1, 25 fps, 25 tbn, 25 tbc Metadata: encoder : Lavc57.107.100 libx264 Side data: cpb: bitrate max/min/avg: 300000/0/0 buffer size: 1835000 vbv_delay: -1 Stream #0:1: Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p Metadata: encoder : Lavc57.107.100 libmp3lame [mpeg2_v4l2m2m @ 0x503ca0] capture: driver decode error Last message repeated 12 times frame= 7 fps=2.3 q=0.0 size= 10kB time=00:00:07.94 bitrate= 10.0kbits/s Try -max_interleave_delta 0 as a possible workaround. [avi @ 0x59da10] Packets poorly interleaved, failed to avoid negative timestamp -6 in stream 0. Try -max_interleave_delta 0 as a possible workaround. frame= 9 fps=0.5 q=-1.0 Lsize= 944kB time=00:00:44.85 bitrate= 172.3kbits/s dup=0 drop=1073 speed=2.41x video:192kB audio:701kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 5.649683% [libx264 @ 0x50d900] frame I:2 Avg QP:28.58 size: 43574 [libx264 @ 0x50d900] frame P:4 Avg QP:39.34 size: 21861 [libx264 @ 0x50d900] frame B:3 Avg QP:46.59 size: 7300 [libx264 @ 0x50d900] consecutive B-frames: 55.6% 0.0% 0.0% 44.4% [libx264 @ 0x50d900] mb I I16..4: 22.8% 75.1% 2.0% [libx264 @ 0x50d900] mb P I16..4: 29.4% 32.6% 1.8% P16..4: 7.8% 0.8% 0.5% 0.0% 0.0% skip:27.0% [libx264 @ 0x50d900] mb B I16..4: 3.2% 3.1% 0.1% B16..8: 14.2% 1.0% 0.1% direct: 1.9% skip:76.4% L0:65.6% L1:32.7% BI: 1.7% [libx264 @ 0x50d900] 8x8 transform intra:61.1% inter:90.2% [libx264 @ 0x50d900] coded y,uvDC,uvAC intra: 28.9% 36.5% 10.9% inter: 3.9% 8.4% 1.7% [libx264 @ 0x50d900] i16 v,h,dc,p: 43% 22% 9% 26% [libx264 @ 0x50d900] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29% 14% 35% 4% 4% 4% 5% 3% 3% [libx264 @ 0x50d900] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 39% 19% 15% 4% 5% 8% 5% 3% 2% [libx264 @ 0x50d900] i8c dc,h,v,p: 72% 12% 14% 2% [libx264 @ 0x50d900] Weighted P-Frames: Y:0.0% UV:0.0% [libx264 @ 0x50d900] ref P L0: 75.1% 5.7% 14.9% 4.3% [libx264 @ 0x50d900] ref B L0: 90.7% 9.3% [libx264 @ 0x50d900] ref B L1: 83.1% 16.9% [libx264 @ 0x50d900] kb/s:34.96 real 0m20.407s user 0m10.716s sys 0m3.639s |
It looks like aconv (ffmpeg) is attempting to use some hardware decoding / encoding for the transcoding before falling back to “Armv6 NEON”. The transcoding was done at around 7 fps which is close enough to the 8 fps I got last time with ODROID-XU3 Lite. I tried again transcoding MPEG4 to H.264, and this time it worked:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
time avconv -i big_buck_bunny_1080p_MPEG4_MP3_25fps_7600K.AVI -vcodec libx264 -minrate 300k -maxrate 300k -bufsize 1835k bbb-h.264.avi ffmpeg version 3.4.2-2ubuntu3 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 7 (Ubuntu/Linaro 7.3.0-15ubuntu2) configuration: --prefix=/usr --extra-version=2ubuntu3 --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-v4l2_m2m --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared libavutil 55. 78.100 / 55. 78.100 libavcodec 57.107.100 / 57.107.100 libavformat 57. 83.100 / 57. 83.100 libavdevice 57. 10.100 / 57. 10.100 libavfilter 6.107.100 / 6.107.100 libavresample 3. 7. 0 / 3. 7. 0 libswscale 4. 8.100 / 4. 8.100 libswresample 2. 9.100 / 2. 9.100 libpostproc 54. 7.100 / 54. 7.100 [mpeg4_v4l2m2m @ 0x536520] driver 'exynos-gsc' on card 'exynos-gsc gscaler' Last message repeated 1 times [mpeg4_v4l2m2m @ 0x536520] driver 's5p-mfc' on card 's5p-mfc-enc' [mpeg4_v4l2m2m @ 0x536520] driver 's5p-mfc' on card 's5p-mfc-dec' [mpeg4_v4l2m2m @ 0x536520] Using device /dev/video10 [mpeg4_v4l2m2m @ 0x536520] driver 's5p-mfc' on card 's5p-mfc-dec' [mpeg4_v4l2m2m @ 0x536520] output POLLERR Input #0, avi, from 'big_buck_bunny_1080p_MPEG4_MP3_25fps_7600K.AVI': Metadata: encoder : SUPER(C) - by eRightSoft artist : created.with.SUPER(C).v2011.bld.49 Duration: 00:00:44.88, start: 0.000000, bitrate: 7746 kb/s Stream #0:0: Video: mpeg4 (Simple Profile) (MP4V / 0x5634504D), nv21, 1920x1080 [SAR 1:1 DAR 16:9], 7634 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 112 kb/s File 'bbb-h.264.avi' already exists. Overwrite ? [y/N] y [mpeg4_v4l2m2m @ 0x54f8e0] driver 'exynos-gsc' on card 'exynos-gsc gscaler' Last message repeated 1 times [mpeg4_v4l2m2m @ 0x54f8e0] driver 's5p-mfc' on card 's5p-mfc-enc' [mpeg4_v4l2m2m @ 0x54f8e0] driver 's5p-mfc' on card 's5p-mfc-dec' [mpeg4_v4l2m2m @ 0x54f8e0] Using device /dev/video10 [mpeg4_v4l2m2m @ 0x54f8e0] driver 's5p-mfc' on card 's5p-mfc-dec' Stream mapping: Stream #0:0 -> #0:0 (mpeg4 (mpeg4_v4l2m2m) -> h264 (libx264)) Stream #0:1 -> #0:1 (mp3 (native) -> mp3 (libmp3lame)) Press [q] to stop, [?] for help [mpeg4_v4l2m2m @ 0x54f8e0] output POLLERR [mpeg4_v4l2m2m @ 0x54f8e0] capture: driver decode error [libx264 @ 0x53ad50] using cpu capabilities: ARMv6 NEON [libx264 @ 0x53ad50] profile High, level 4.0 Output #0, avi, to 'bbb-h.264.avi': Metadata: IART : created.with.SUPER(C).v2011.bld.49 ISFT : Lavf57.83.100 Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), nv21, 1920x1080, q=-1--1, 25 fps, 25 tbn, 25 tbc Metadata: encoder : Lavc57.107.100 libx264 Side data: cpb: bitrate max/min/avg: 300000/0/0 buffer size: 1835000 vbv_delay: -1 Stream #0:1: Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p Metadata: encoder : Lavc57.107.100 libmp3lame [mpeg4_v4l2m2m @ 0x54f8e0] capture: driver decode error Last message repeated 13 times frame= 15 fps=0.0 q=0.0 size= 10kB time=00:00:01.07 bitrate= 74.4kbits/s[mpeg4_v4l2m2m @ 0x54f8e0] capture: driver decode error Last message repeated 16 times frame= 32 fps= 31 q=0.0 size= 10kB time=00:00:01.75 bitrate= 45.5kbits/s[mpeg4_v4l2m2m @ 0x54f8e0] capture: driver decode error Last message repeated 13 times frame= 46 fps= 18 q=0.0 size= 10kB time=00:00:02.32 bitrate= 34.3kbits/s[mpeg4_v4l2m2m @ 0x54f8e0] capture: driver decode error Last message repeated 5 times frame= 238 fps= 13 q=53.0 size= 266kB time=00:00:10.18 bitrate= 213.7kbits/s video:1742kB audio:702kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 3.148138% real 1m34.676s user 7m10.305s sys 0m5.370s |
Time for some storage benchmark, first the eMMC flash with iozone:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
sudo apt install iozone3 sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 Iozone: Performance Test of File I/O Version $Revision: 3.429 $ Compiled for 32 bit mode. Build: linux random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 13831 15703 15634 16201 15143 14801 102400 16 37731 40324 44864 44447 43462 40251 102400 512 48610 50688 129402 135539 132188 71911 102400 1024 68949 68284 137609 140847 137855 69597 102400 16384 50237 56800 194593 194663 175027 59117 |
So that means up to 68MB/s sequential write, 194MB/s sequential read, and pretty high values for random I/Os too (175MB/s & 69.5MB/s).
I’ve also tested USB 3.0 sequential speed using a hard drive starting with NTFS:
|
1 2 3 4 5 6 7 8 9 |
cd /media/odroid/USB3_NTFS sudo iozone -e -I -a -s 1000M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 4 11245 12654 31984 31968 1024000 16 34708 38383 69621 71604 1024000 512 89577 98049 103395 104637 1024000 1024 91108 93261 104096 104645 1024000 16384 94559 98031 101223 104292 |
We can see the board can max out the performance achivable with a mechanical drive (around 100 MB/s) both for write and read speed. Using an SSD should yield even better results.
Final benchmark: iperf to test full duplex Gigabit Ethernet.
|
1 2 3 4 5 6 |
Client connecting to 192.168.0.116, TCP port 5001 TCP window size: 416 KByte (WARNING: requested 867 MByte) ------------------------------------------------------------ [ 6] local 192.168.0.104 port 34246 connected with 192.168.0.116 port 5001 [ 6] 0.0-60.0 sec 2.81 GBytes 402 Mbits/sec [ 5] 0.0-60.0 sec 6.03 GBytes 863 Mbits/sec |
Performance is not too bad, but during a full duplex transfer one direction is limited to around 400 Mbits/sec. Let’s repeat the test but only for
- Download
|
1 2 3 4 5 6 |
Client connecting to 192.168.0.116, TCP port 5001 TCP window size: 85.0 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.0.104 port 39602 connected with 192.168.0.116 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-60.0 sec 6.39 GBytes 915 Mbits/sec |
- Upload
|
1 2 3 4 5 6 |
Client connecting to 192.168.0.104, TCP port 5001 TCP window size: 43.8 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.0.116 port 52492 connected with 192.168.0.104 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-60.0 sec 6.41 GBytes 917 Mbits/sec |
It cannot get much better than that.
Checking out Ubuntu 18.04 MATE on ODROID-XU3 Lite
So far, we’ve test Ubuntu 18.04 on ODROID-XU4Q board that released last year. It’s one thing to support a one year old board, and another to support a board launched nearly four years ago. But if we look at the eMMC module’s boot partition we can find dtb files for all Exynos 5422 boards.
So I took out the eMMC flash module from ODROID-XU4Q, dusted out my old ODROID-XU3 Lite board, and insert the module in place of the 16GB one I had.

I connected the micro HDMI cable, and power supply, and within a few seconds the MATE desktop showed up, and after some short tests everything seemed in order. The following output from the terminal shows Ubuntu 18.04 running on ODROID-XU3 hardware:
|
1 2 3 4 5 6 7 8 9 |
odroid@odroid:~$ uname -a Linux odroid 4.14.37-135 #1 SMP PREEMPT Sun Apr 29 23:34:43 -03 2018 armv7l armv7l armv7l GNU/Linux odroid@odroid:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS" cat /proc/cpuinfo | grep -i hard Hardware : ODROID-XU3 |
Not bad for an “old” board.
All in all Ubuntu 18.04 on ODROID-XU4Q board was a fairly satisfying experience, despite some performance issues with Candy Crush Saga, in most cases the system performed well and reliably with fast programs loading times, H.264 hardware video coding, 3D graphics acceleration for OpenGL ES (3.1), and most features working as expected. As we’ve seen there are limitations, but this is to be expected for a low cost board.
ODROID-XU4Q can be purchased for $59 and up plus shipping on Hardkernel, Amazon, Ameridroid, and other distributors. You may also consider accessories like power supply, enclosure, eMMC reader, and RTC battery.

Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress. We also use affiliate links in articles to earn commissions if you make a purchase after clicking on those links.



