IMX477 camera no live preview on Jetson Orin NX: broken v4l2-fix and RG10 unsupported

Hey everyone, I’m stuck trying to get a live preview working with my dual IMX477 setup on a Jetson Orin NX 16GB. Running the arducam_displayer.py script throws this:

ModuleNotFoundError: No module named 'v4l2_fix'

That GitHub repo they link to — https://github.com/ArduCAM/python_v4l2.git — just gives a 404. So I can’t even get the module from source.

I tried OpenCV as a fallback — cv2.VideoCapture(0) — but that fails with a bunch of GStreamer pipeline errors. Then I tried ffplay directly and got:

Dequeued v4l2 buffer contains corrupted data (24660480 bytes)

From what I can tell the camera is outputting RG10 Bayer format and nothing seems to handle that for live preview without custom demosaicing.

My setup:

  • Jetson Orin NX 16GB on an Auvidea JNX42 carrier board
  • Dual IMX477 cameras via Arducam Multi-Camera Adapter B0265N (TCA9548A I2C mux)
  • Ubuntu 22.04, JetPack 5.1.2 (L4T 35.6.1, Kernel 5.15.148-tegra)
  • Python 3.10

Has anyone gotten live preview working with this hardware combo? Or at least know where to find a working v4l2_fix module?

Quick follow-up with the commands I’ve been using for switching channels and capturing:

# Switch camera channel via I2C (bus 9, address 0x24)
i2cset -y 9 0x24 ...

# Raw capture works fine
v4l2-ctl --device=/dev/video0 --stream-mmap --stream-count=1 --stream-to=img1.raw

# These all fail with the v4l2_fix import error
python3 arducam_displayer.py --channel 1
PYTHONPATH=$HOME/.local/lib/python3.10/site-packages python3 arducam_displayer.py --channel 1

Here’s the v4l2-ctl output for /dev/video0:

Driver name: tegra-video
Card type: vi-output, imx477 9-001a
Bus info: platform:tegra-capture-vi:2
Driver version: 5.15.148
Width/Height: 4056/3040
Pixel Format: 'RG10' (10-bit Bayer RGRG/GBGB)
Bytes per Line: 8112
Size Image: 24660480
Frames per second: 10.000 (10/1)

So the camera is definitely there and the I2C switching seems to work (resolution changes per channel), but live preview is a dead end so far.

Spent the afternoon trying to fix the v4l2_fix import. Here’s everything I tried:

  • pip3 install v4l2-fix — installs without errors but…
  • pip3 install v4l2-fix --user — same deal
  • sudo pip3 install v4l2-fix — still nothing

After install, I checked ~/.local/lib/python3.10/site-packages/ and there’s no actual v4l2_fix/ folder or any Python source files — just some metadata .dist-info stuff. The pip package seems completely broken or empty.

I also tried setting PYTHONPATH explicitly before running the script, but obviously if the module code isn’t there, no amount of path tweaking will help.

So the situation right now:

  • Raw capture with v4l2-ctl: works
  • I2C channel switching: works
  • Live preview: totally blocked because v4l2_fix doesn’t exist and RG10 Bayer isn’t handled by standard tools

Thanks for the detailed breakdown — this is really helpful. Let me summarize what I’m seeing and where things stand.

What’s working:
The I2C multiplexer (TCA9548A on bus 9, address 0x24) is switching channels correctly. Your v4l2-ctl captures produce valid raw frames at full resolution (4056x3040, RG10, 10fps). The hardware path — cameras → adapter → Jetson VI — is functional.

Root cause of the two failures:

  1. v4l2_fix module is essentially unavailable right now. The pip package v4l2-fix installs only metadata — there’s no actual Python module code in it. And the GitHub repo (python_v4l2) returns a 404. Until Arducam republishes the source or provides a proper wheel, the displayer script simply can’t import what it needs.

  2. RG10 Bayer is the second problem. Even if v4l2_fix were working, tools like OpenCV’s VideoCapture, ffplay, and standard GStreamer pipelines don’t know how to debayer RG10 (10-bit packed Bayer). The 24660480-byte “corrupted data” error from ffplay is expected — it’s receiving raw Bayer when it expects an encoded or RGB format.

Interim workaround:
For now, your raw capture command is the reliable path:

v4l2-ctl --device=/dev/video0 --stream-mmap --stream-count=1 --stream-to=img1.raw

You can capture per-channel frames that way. To actually view them, you’d need a custom Python script that reads the RG10 raw data and does the Bayer demosaicing yourself (e.g., using numpy to unpack the 10-bit packed format, then something like OpenCV’s cvtColor with the right Bayer pattern after converting to 16-bit).

Could you also post some photos of your hardware setup — the carrier board, the multi-camera adapter, and how the cameras are connected? I want to rule out any physical layer issues before we go deeper into software workarounds.

I appreciate the analysis, but I want to push back a little — the issues I’m hitting seem entirely software-side. The hardware is clearly working (I2C switching works, raw frames capture fine at full res). What I actually need:

  1. Where can I get a working version of v4l2_fix? The GitHub link from the docs (https://github.com/ArduCAM/python_v4l2.git) is a 404. Is there a mirror or updated repo?

  2. Is there a proper setup.py or .whl file for Jetson devices to install v4l2_fix correctly?

  3. Is there an updated arducam_displayer.py that works with Jetson Orin and Python 3.10?

  4. Is there any alternative live preview tool you provide that handles RG10 Bayer format?

That said, I went ahead and took photos of the hardware anyway — here they are:

IMG_6929.JPG
IMG_6928.JPG
IMG_6926.JPG

Fair points, and thanks for the photos — the physical setup looks correct, which confirms the hardware path is solid. You’re right that this is a software-side problem. Let me address each question directly.

On v4l2_fix availability:
I’ve checked internally and it appears the python_v4l2 repository was taken down or moved and hasn’t been relisted yet. The pip package v4l2-fix on PyPI is unfortunately incomplete — as you discovered, it’s just metadata with no actual module code. I don’t have an immediate alternative public repo to point you to right now, which I know is frustrating.

On setup.py / wheel for Jetson:
There isn’t a pre-built wheel targeting Jetson + Python 3.10 at the moment. The original arducam_displayer.py and v4l2_fix were developed for earlier JetPack releases, and the move to Orin + L4T 35.x + Python 3.10 has clearly exposed some gaps.

On an updated arducam_displayer.py:
I’ve sent you a private message with the files I have available. Please check your inbox — there should be a working copy of the v4l2_fix source module and an updated displayer script. Try placing v4l2_fix.py (or the v4l2_fix/ folder) into your project directory alongside arducam_displayer.py and see if the import resolves.

On RG10 live preview alternatives:
This is the harder problem. Even with a working v4l2_fix, the display pipeline needs to handle 10-bit packed Bayer → viewable RGB. If the updated script I sent doesn’t handle this, you’re looking at writing a custom demosaicing pipeline. The rough approach would be:

  1. Grab raw RG10 buffers via V4L2 (which you can already do)
  2. Unpack the 10-bit packed data into a 16-bit numpy array
  3. Run cv2.cvtColor(raw_16bit, cv2.COLOR_BayerRG2RGB) (or BG, GB, GR — whichever matches the IMX477’s Bayer pattern)
  4. Display with cv2.imshow() in a loop

I know that’s more work than just running a script, but it’ll get you live preview while the official tooling catches up. Let me know if the files I sent resolve the import issue at least — that’s the first domino.