Table of Contents

SJCAM SJ8 Pro Review

The SJCAM SJ8 Pro action camera was introduced in 2018, it features 4k video at 60 fps and gyroscope image stabilization. I purchaesd it in 2021 to work alongside my old Xiaomi Yi, mainly because I was interested in image stabilization.

The SJCAM SJ8 Pro mounted on the shoulder strap of a backpack

Unfortunately SJCAM does not support this camera very much: the latest firmware upgrade is from September 2020, despite there are some evident bugs and several aspects of the user interface which should be improved. Thirdy part support is poor: there is no waterproof case except the original one, which unfortunately has a plastic window. There is not much documentation about customizing the firmware or scripting using the Ambarella Scripting.

See also my other page about this camera:

Specs, Pros and Cons

Pros

Cons

Specs
Size 62.5 x 41.0 x 28.8 mm
Weight 85 g
Image Processor Ambarella H22 S85
Image Sensor Sony IMX377
Lens 170ᵒ ultra wide angle glass lens
Battery 1200 mA, about one hour recording
Storage Micro SD card up to 128Gb
Back screen Touch 2.33 inch, OLED

Video Formats

In the following table the information about the videos captured by the SJ8PRO for some of the available video modes.

4K (3840 x 2160) 60 FPS - Standard video quality
Format AVC
Profile Main@L5.2
GOP M=1, N=64
FPS 59.940 (60000/1001)
Size 3840 x 2160 pixels
Bit rate 60.0 Mb/s (variable)
4K (3840 x 2160) 30 FPS - Standard video quality
Format AVC
Profile Main@L5.2
GOP M=1, N=32
FPS 29.970 (30000/1001)
Size 3840 x 2160 pixels
Bit rate 40.0 Mb/s (variable)
1080 (1920 x 1080) 60 FPS - Standard video quality
Format AVC
Profile Main@L4.2
GOP M=1, N=64
FPS 59.940 (60000/1001)
Size 1920 x 1080 pixels
Bit rate 30.0 Mb/s (Variable)
1080 (1920 x 1080) 30 FPS - Standard video quality
Format AVC
Profile Main@L4.2
GOP M=1, N=32
FPS 29.970 (30000/1001)
Size 1920 x 1080 pixels
Bit rate 10.1 Mb/s (Variable)

4K resolution

You may wonder how much is improved the image quality using the 4K resolution; here you are two enlarged details, the first one acquired at full 4K, the second one aquired at 1080. As you can see the 4K gives you actually more details, but more details means that you can enlarge more the image and see more jpeg artifacts. I think you might want to increase the bitrate for the 4K, this can be accomplished customizing the firmware e.g. using the BitrateEditor software.

SJ8 Pro acquiring at 4K resolution

SJ8 Pro acquiring at 1080 resolution

Sharpness setting

The SJCAM SJ8 Pro has three levels of sharpness selectable from the Current Mode Settings menu: Strong, Standard and Soft. In my opinion the Standard mode is already rather sharp and the Strong setting does not change very much the result; on a cloudy day with low light you may not see any difference. On the contrary, the Soft mode is too much blurred that I suggest to not use it ever, unless you want to get a very particular effect.

Strong sharpness

Standard sharpness

Soft sharpness

Here you can view the full frames: Strong, Standard and Soft.

Here you are other three images, from footages taken outdoor on a sunny day; no appreciable differences from Strong to Standard, too much blurred with Soft:

Sharpness: Strong Sharpness: Standard Sharpness: Soft

White balance settings

The SJCAM SJ8 Pro camera has 5 settings for the white balance. I mostly set the Auto mode, letting the camera to autodetect the more appropriate white balance, but it seems that sometimes it gets fooled. In particular sometimes, with large portions of blue sky, it seems that the camera chooses the Underwater setting, because I get a strong yellow cast. In other conditions, for example in the woods under the foliage of the trees, the camera seems to select the Cloudy setting because I get a red cast.

In the following images you can view how the manual setting of the white balance will alter the footage of an outdoor sunny scene:

White Balance: Auto

White Balance: Sunny

White Balance: Cloudy

White Balance: Fluorescent

White Balance: Underwater

Color profiles

The SJCAM SJ8 Pro has two color profiles selectable from the Current Mode Settings menu: SJCAM - Vivid and Flat. At bootstrap the camera select another profile, let's call it Default, which is identical to SJCAM -Vivid, but it is stored in a different place into the firmware, so it can be customized separately.

There is a firmware bug that prevent you changing the color profile if the Gyro Stabilizer is enabled, and the color profile choiche is not remebered after power off. In my opinion the vivid profile is too much saturated, specially it enhances too much the contrast from the blue sky and the white clouds, even when the sky is mainly gray and cloudy (as in the frames below). On the contrary the flat profile is too much washed out that you will hardly want to use it.

Color Profile SJCAM - Vivid Color Profile Flat

You can edit the three color profiles SJCAM - Vivid, Flat and Default using BitrateEditor (required version 10.7 - Nov 3, 2021).

Flat vs SJCAM - Vivid

Here are other examples of Flat vs SJCAM - Vivd color profile. As said above, in my opinion, they are both too exagerated. The flat mode lacks contrast, everything appears to be wrapped in a sheen of gray. On the other hand, the vivid profile exagerates the colors too much and contrast is pushed high too much, going too easly to turn black or white and creating colour banding in the sky. The vivid profile also produces yellowish images too often (but this can be a problem with auto white balance).

My old Xiaomi Yi camera have by far more natural colors.

SJ8 Pro Flat Colors SJ8 Pro Vivid Colors

SJ8 Pro Flat Colors SJ8 Pro Vivid Colors

Field of view

The Sjcam 8 Pro has two nice feature: Gyro Stabilizer and Distortion Correction that can be enabled from the settings. The first is used to compensate shaking of the camera, to obtain a more stable footage. The second is used to mitigate the fish-eye effect of the lens, which causes straight lines to become curved, especially at the edge of the frame.

That options require to crop a portion of the image. As you can expect, combining them both, causes larger cropping. The images below are taken with the 4 possible combinations: full frame, gyro stabilizer, distortion correction and finally the combined gyro and distortion:

Full Frame Gyro Stabilizer Distortion Correction Gyro Stabilizer and Distortion Correction

The following image show roughly how much of the full frame is lost for each setting (the frames shoul actually have curved borders!):

Image cropping

The "Ultra" viedeo modes

Touching the Resolution Options when in video mode, you can access the Video Mode Menu. Here the various options are almost self-eplanatory: you can choose the video resolution (e.g. 3840×2160, 2720×1520, 2560×1440, 1920×1080, etc.) and the framerate (24, 25, 30, 50, 60 or 120 frames per second). But some video modes have the ultra attribute which is not explained into the manual nor into the FAQ.

The ultra video modes just mean that all the surface of the sensor is used to capture the video, i.e. you get a wider field of view. A wider viewing angle means more distortions at the edges of the frame.

There are two other settings that affect the field of view: Gyro Stabilizer and Distortion Correction, so may wonder how that options combines up together. As a rule of thumb you can think that the options Gyro Stabilizer and Distortion Correction will reduce the field of view, whereas the Ultra option will enlarge it:

Here some personal notes about the 8 possibile combinations:

Ultra Mode Gyro Stabilizer Distortion Correction Note
On Off Off Maximum field of view and maximum image distortion.
Off On On Minimum field of view and minimum distortion.
On On Off Best compromise for hand-held camera, wide angle.
Off On Off Best compromise for hand-held camera, narrow angle.
On Off On Too much stretched horizontally.

Maximum field of view (Ultra On, Gyro Off, Distortion Off):

Ultra On, Gyro Off, Distortion Off

Minimum field of view (Ultra Off, Gyro On, Distortion On):

Ultra Off, Gyro On, Distortion On

Best setting for hand held camera (Ultra Off, Gyro On, Distortion Off):

Ultra Off, Gyro On, Distortion Off

Ultra vs Normal Video Mode

The figure below shows approximately how much the ultra mode affects the field of view:

Ultra Mode

SJCAM Zone Android App

I installed the SJCAM Zone app version 5.9.4 for Android (July 2021), the app archive is about 90 Mb in size and it occupy about 192 Mb once installed. Like other similar apps, it required me to turn off internet data on my smartphone, otherwise the WiFi pairing with the cam fails.

On the SJ8 Pro I have firmware 1.3.2, the app have some severe problems: the more severe is that I cannot browse the videos stored on the camera because the camera reboots itself whenever I tap the gallery icon on the app. Sometimes the app does not start the image preview.

SJCAM SJ8 Pro Main Screen

The remote control

I think that SJCAM missed a great opportunity to make this camera a perfect choice by designing a remote control which is almost useless. The remote control can be mounted on a wrist strap or used like a nice button tag, the five buttons are:

The two deadly sins committed by designers are:

Using the camera without the touchscreen

When the camera is into the waterproof case you can operate it only with the buttons, the touch screen does not work. My camera was shipped with a spare case back, which is thin enough to let operate the touchscreen; mind that mounting that back cover you loose the 30 meters waterproof feature, the case becomes only splash resistant.

Poweoff
Power button (3 seconds) Power On
Video Mode Menu, with screen on
Power button (short) Mode Select Menu
Power button (2 seconds) Power Off
Shutter button Start recording
Video Mode Menu, with screen off
Power button Screen On
Shutter button Screen On
Options Menu
Power button Next option
Shutter button Select/Confirm
Power button (2 seconds) Power Off

As far I know, there is no way to get the go back function to fully navigate the menu system.

Firmware Bugs

Despite the installation of the latest 1.3.2 firmware (dated 2020-06-08), several problems are unresolved.

Upgrading the Firmware

The built-in help can be accessed from General System Settings (gear icon) ⇒ Q/A icon (bottom-right corner of the screen).

Official Website address: https://sjcam.com

I tried the Option B:

Custom Firmwares

There are many hackers who produce modified versions of the original firmware. In general they distribute the original firmware patched in several places, mainly to customize framerates, exposure parameters, etc.

I created a custom firmware to improve some video codec settings and to improve image quality (mainly color balance and saturation). You can find it here: SJCAM SJ8 Pro Custom Firmware.

Generally there is no access to the source code, so patching the firmware binary is a rather delicate task, requiring to know the exact offset of the data into that specific version of the firmware, the structure and the lenght of the data and eventually how to update the embedded checksums. SJCAM does not facilitate the task, because it distribute different versions of the firmares marked with the same version number.

The best approach is to use the BitrateEditor, a graphical Java program which facilitates the task of editing various parameters in form of easy readable tables. The program contains several configuration files, so it can check that you are actually editing the proper version of the firmware (it can do check of particular strings at particular offset, calculate regions checksums, etc.). The program has the capability to re-pack the firmware image after the edits, updating the checksums so that the file will be flashable into the camera.

You can refer to the page How to customize the Ambarella firmware of the SJCAM SJ8 Pro with my notes about customizing the SJ8 Pro firmware using BitrateEditor. You can also refer to the program I wrote which can extract files and partitions from the firmware files: ambarella-h22-firmware-tools.

SD Card partitioning and formatting with GNU/Linux

The SJ8 Pro cannot create the required partition onto the SD card: you have to provide an already partitioned one. The recommended filesystem for the partition should be exFAT, which is optimized for SD cards and it can host files with size grather than 4 Gb. For cards with size of 32 Gb or more, the exFAT should be the default filesystem provided by the manufacturer.

The Linux kernel introduced native exFAT support with the 5.4 release, in Debian you have to install the exfat-utils and exfat-fuse packages. To prepare an SD card from scratch using GNU/Linux, it is advisable to zeroes the first 64 Mb of the card, to remove any existing partitioning information on it:

dd if=/dev/zero of=/dev/sdb bs=1M count=64

the parted program is used to create the partition:

parted /dev/sdb

We create a legacy MSDOS partition table and a single partition starting from sector 32768 (thus leaving a free space of 16 Mb at the begin of the card):

mklabel msdos
unit s
mkpart primary ntfs 32768 100%
quit

Using mkfs.exfat we create the partition filesystem, assigning a label to it:

mkfs.exfat -n "action_cam" /dev/sdb1

In addition to parted, we can use also fdisk -l /dev/sdb to view the existing partition:

Device     Boot Start       End   Sectors  Size Id Type
/dev/sdb1       32768 123596799 123564032 58,9G  7 HPFS/NTFS/exFAT

Using fsck.exfat we can verify the the filesystem is without errors:

fsck.exfat /dev/sdb1

When the SD card is into the camera, it is possible to format it creating a new filesystem into the partition; just select the menu SettingsFormat. Beware that this operation will erase all the files on the SD card, including eventyally the autoexec.ash file. Also the volume label will be erased.

In some case you may prefer to use the legacy FAT filesystem (e.g. if you have an old PC, which si unable to read exFAT), you can use the following command to prepare the filesystem on GNU/Linux:

mkfs.vfat -F 32 -s 64 -R 1024 /dev/sdb1

See this page Manipulate storage devices with D-Bus udisks2 if you want to mount the SD card in GNU/Linux without the exec bit set.

Dual operating system: GNU/Linux and RTOS

The SJ8 Pro camera runs two operating systems: a small version of GNU/Linux and a RTOS (Real Time Operating System) based on ThreadX.

GNU/Linux is responsible for operations like WiFi connection, API interface over the TCP protocol for remote control (using the SJCAM Zone app), etc. It is possibile to have access using the telnet protocol, once the camera is connected via WiFi. The Linux environment is equipped with busybox, a powerful command line tool.

RTOS is responsible for actual camera operations (video recording, etc.). As far I know there is not possibility to access that operating system interactively, but you can execute a script at camera bootstrap, called autoexec.ash. The RTOS is equipped by some commands knwon as Ambarella Scripting, which can be used into the autoexec.ash script. Is is also possibile some limited interacion between GNU/Linux and RTOS, see below for details.

Activate WiFi from RTOS autoexec.ash

This script will activate the WiFi as a station, joining your LAN access point:

sleep 5000
t app wifi mode sta
t app wifi sta_essid MyHomeAP
t app wifi sta_password Password
t app wifi restart

The sleep command (5000 milliseconds) causes the subsequent actions to be executed about 15 seconds after power on. On your DHCP server you will see the DHCPREQUEST from a MAC address with the d4:12:43 prefix (AMPAK Technology, Inc.).

The WiFi is enabled despite the WiFi icon does not appear on the camera screen.

Telnet into GNU/Linux as root

Once the camera gets its IP address, you can telnet it as root, no password required:

telnet 10.0.1.226
AmbaLink login: root
~# 

If the camera have a power-off timer, it will be turned off even if you have accessed it via telnet. Here are the mounted partitions:

~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                10496     10496         0 100% /
devtmpfs                 25996         0     25996   0% /dev
tmpfs                    34348         0     34348   0% /dev/shm
tmpfs                    34348        16     34332   0% /tmp
tmpfs                    34348        12     34336   0% /run
c:                    31248384    102688  31145696   0% /tmp/SD0
tmpfs                    34348        16     34332   0% /pref

Here are the memory usage:

~# cat /proc/meminfo 
MemTotal:          68696 kB
MemFree:           31016 kB
MemAvailable:      45712 kB
Buffers:            5068 kB
Cached:            10284 kB
SwapCached:            0 kB
Active:            15416 kB
...

The CPU information:

~# cat /proc/cpuinfo 
processor       : 0
BogoMIPS        : 102.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
BogoMIPS        : 102.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
BogoMIPS        : 102.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

SendToRTOS and RecvFromRTOS

There are two specific commands to interact with the RTOS, the other operating system running on the camera. The two commands are rather limited:

usage: SendToRTOS <event type> [further info]
<event type>:
   "boot_done": Linux boot done.
   "net_ready" <type>: network ready as specified type.
       <type>:
           0: AP mode.
           1: STA mode.
           2: P2P mode.
   "net_off": network turned-off.
   "photo": Capture photo with bluetooth shutter.
   "record": Record with bluetooth shutter.
usage: RecvFromRTOS [-f]
    Paramters:
        "-f": same as "en_fg", to run at fore-ground.

Ambarella Scripting in RTOS

As said above, the RTOS Real Time Operating System is not accessbile using an interactive shell. You have instead to create a file named autoexec.ash into the root directory of the SD card: this file can contain Ambarella Scripting and it will be executed at bootstrap.

WARNING: the autoexec.ash file must have Unix newlines, including on the last line, otherwise it will not be executed.

The Ambarella "t" commands

The most versatile command in Ambarella Scripting is the t command, you can browse the strings contained in /dev/mtdblock1 partition to have some ideas of the existing commands and syntax.

The RTOS can execute a program under the GNU/Linux operating system via the t ipc command:

t ipc rpc clnt exec2 '<command> <arg1> ...'

E.g. you can start the recording by sending back (from Linux to RTOS) the record command:

t ipc rpc clnt exec2 '/usr/bin/SendToRTOS record'

Or you can execute a script saved into the SD card:

t ipc rpc clnt exec2 '/tmp/SD0/myscript.sh'

Configure WiFi as Access Point: ESSID, password, channel:

sleep 5000
t app wifi mode ap
t app wifi ap_ssid MyActionCamAP
t app wifi ap_passwd PassWord
t app wifi ap_c 0
t app wifi restart

Disable recording of LRV (Low Resolution Video) files:

t app test record duals 0

WiFi management:

t app wifi start
t app wifi stop
t app wifi restart

Stop execution for some milliseconds:

sleep 5000

This command simulates pressing a button:

t app key <key>

where <key> can be one of this:

    up            One step up in main settings or page up in options.
    up_rel
    down          One step down in main settings or page down in options.
    down_rel
    left          One step up in options.
    left_rel
    right         One step down in options.
    right_rel
    zoomin
    zoomin_rel
    zoomout
    zoomout_rel
    set           OK/Confirm. Start recording in video mode.
    focus
    focus_rel
    shutter       Take photo in still mode, go back from settings.
    shutter_rel   
    record        Start/stop video recording.
    mode          Switch between recording and playback modes.
    menu          Go to settings from any mode, "press" again to go back to shooting mode.
                  NOTICE: Does not work: causes a reboot instead.
    power         Turn the camera off.
    del
t app test bb <option>
    Test option list:
        user
        file <filename>
        file2 <filename> <SrcChannelMode> <SrcSampleRate> <DstSampleRate>
t app test np <option>
    Test option list:
        open <num>
        play
        stop
        pause
        resume
        next
t app wifi  <option>
    option list:
        start
        stop
        restart
        status
        mode sta/ap
        ap_ssid [ssid]
        ap_passwd [passwd]
        sta_essid [essid]
        sta_password [password]
        dump
t app edit <option>
    option list:
        init
        complete
        clip starttime endtime filenameout
t app test graph <option>
    save_osd [chanId]
    rotation [chanId] [degree]
    convclut
t app msg <msg> <param1> <param2>
t app jack <jack> <event>
    Jack list:
        hdmi
        cs
    Event list:
        in
        out
t app test chg_res [resolution ID]
t app test chg_bitrate c [BitRateAvg]
t app test chg_bitrate v [BitRateAvg][BitRateRatioMin][BitRateRatioMax]
t app test <option>
    Test option list:
        chg_res
        chg_bitrate
        chg_LCD
        chg_mode
        chg_app
        chg_usbmode
        graph
        freq
        extenc [on | off | set_freq | sw]
        texttrack [on | off | sw]
        wakeup [alarm time(sec)]
        bb
        enc
        wdt
        vf [on | off | sw]
        rtsp [on | off | show]
        rec [av | v | show]
        ps
        idr
        np
        usbdbg [start | 2uart | 2usb]
        record
        fdmo [0 | 1]

FIXME Check if it is possible to play a beep from AmbaShell:

t app test playbeep <index> <times>

The TCP API

See the page SJCAM SJ8 Pro WiFi Ambarella API about the programming interface (API) offered by the SJCAM SJ8 Pro over the WiFi connection or even in localhost. The interface is offered on port TCP/7878.

The interface is based on JSON messages: you can exchange them over the WiFi connection as the official app SJCAM Zone does between the Android device and the camera. You can also connect a PC to the camera via WiFi and use any programming language supporting TCP sockets.

You can also send messages from the camera itself: the RTOS operating system provides the telnet command which can ben used to talk to the GNU/Linux operating system running on the same camera, which handles the API requests (the camera actually runs two operating system simultaneusly: RTOS and Linux). In this scenario I was able to talk to the API but with no interaction: I used telnet to only send messages but I did not find any way to read the answers.

Connecting to GNU/Linux via USB

If you connect the SJ8 Pro camera to a GNU/Linux computer using an USB cable, the Linux kernel will detect it, this is the lsusb output:

Bus 001 Device 006: ID 070a:4026 Oki Electric Industry Co., Ltd A9 Platform 

The kernel inform also that the device is available as USB Mass Storage:

usb 1-1.1: new high-speed USB device number 6 using ehci-pci
usb 1-1.1: New USB device found, idVendor=070a, idProduct=4026, bcdDevice= 0.01
usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.1: Product: A9 Platform 
usb 1-1.1: Manufacturer: AmbarellaInc
usb 1-1.1: SerialNumber: 0001
usb-storage 1-1.1:1.0: USB Mass Storage device detected
scsi host6: usb-storage 1-1.1:1.0
scsi 6:0:0:0: Direct-Access     SJCAM    SJ8PRO           1000 PQ: 0 ANSI: 0
sd 6:0:0:0: Attached scsi generic sg3 type 0

Tips

Web References