Summary
On an OAK-FFC-4P-POE (RVC2 / Myriad X) with four OAK-FFC AR0234 (2-lane) modules — one in each socket (CAM_A, CAM_B, CAM_C, CAM_D) — all four cameras enumerate, but when streaming all four simultaneously the 4th camera (CAM_D / socket 3) yields 0 frames, while CAM_A/B/C stream normally. Any 3 of the 4 sockets work (including both 4-lane sockets A+D together); only the 4th, whichever is allocated last (CAM_D), fails.
Hardware
- Board: OAK-FFC-4P-POE — EEPROM
productName=OAK-FFC-4P-POE, boardName=NG2093, boardRev=R4M1E4, MXID 14442C10414E91D700, bootloader 0.0.28, platform RVC2.
- 4× OAK-FFC AR0234 (2-lane, 1920x1200), one per socket A/B/C/D.
- PoE, point-to-point (device at link-local
169.254.1.222).
Goal
Stream all 4 cameras simultaneously (MJPEG), full resolution 1920x1200, ~20 fps each.
Symptom
getConnectedCameraFeatures() returns all four AR0234.
- Pipeline with one
Camera→VideoEncoder(MJPEG) per socket: CAM_D delivers 0 frames; CAM_A/B/C deliver 20 fps.
- Dropping any one camera → the remaining 3 all stream fine (tested A+C+D, D+A+B — both include the two 4-lane sockets).
Reproduced identically across
- Python (depthai v3.7.1, release device firmware
8d6a04d380ce182e0cb3a4694309426370295a9f) — single-consumer and thread-per-camera pollers.
- C++ built from
develop (device firmware 45274630e27b04617985d3e80360f15052a99686).
- With and without
BoardConfig.mipi4LaneRgb = false (no effect; it also appears unused in host code).
- Power-cycling the board does not change it.
What this rules out
Related but not identical: #857 (CAM_D not detected — fixed) and luxonis/depthai-python#1007 (ToF, shared-I2C-limited to 3).
Minimal reproducer (C++)
Built against depthai-core (BUILD_SHARED_LIBS=ON, DEPTHAI_OPENCV_SUPPORT=ON). Prints per-socket frame counts over 12 s; CAM_D shows 0.
#include <atomic>
#include <chrono>
#include <cstdio>
#include <map>
#include <memory>
#include <string>
#include <thread>
#include <vector>
#include "depthai/depthai.hpp"
int main() {
auto dev = std::make_shared<dai::Device>(dai::DeviceInfo("169.254.1.222"));
std::printf("connected %s fw-driven test\n", dev->getDeviceName().c_str());
std::vector<std::pair<std::string, dai::CameraBoardSocket>> socks = {
{"CAM_A", dai::CameraBoardSocket::CAM_A},
{"CAM_B", dai::CameraBoardSocket::CAM_B},
{"CAM_C", dai::CameraBoardSocket::CAM_C},
{"CAM_D", dai::CameraBoardSocket::CAM_D}};
dai::Pipeline p(dev);
std::map<std::string, std::shared_ptr<dai::MessageQueue>> qs;
for (auto& [name, s] : socks) {
auto cam = p.create<dai::node::Camera>()->build(s);
auto* out = cam->requestOutput({1920, 1200}, dai::ImgFrame::Type::NV12,
dai::ImgResizeMode::CROP, 20.0f);
auto enc = p.create<dai::node::VideoEncoder>();
enc->setDefaultProfilePreset(20.0f,
dai::VideoEncoderProperties::Profile::MJPEG);
enc->setQuality(80);
out->link(enc->input);
qs[name] = enc->out.createOutputQueue();
}
p.start();
std::atomic<bool> stop{false};
std::map<std::string, std::atomic<int>> counts;
for (auto& [name, s] : socks) counts[name] = 0;
std::vector<std::thread> ths;
for (auto& [name, q] : qs) {
ths.emplace_back([&, name, q] {
while (!stop.load()) {
bool to = false;
auto f = q->get<dai::EncodedFrame>(std::chrono::milliseconds(200), to);
if (!to && f) counts[name]++;
}
});
}
std::this_thread::sleep_for(std::chrono::seconds(12));
stop = true;
for (auto& t : ths) t.join();
std::printf("=== 4 cams @20 q80, develop firmware ===\n");
for (auto& [name, s] : socks)
std::printf(" %s: %d frames (%.1f fps)\n", name.c_str(),
counts[name].load(), counts[name].load() / 12.0);
return 0;
}
Example output (device IP hard-coded above):
connected OAK-FFC-4P-POE fw-driven test
=== 4 cams @20 q80, develop firmware ===
CAM_A: 241 frames (20.1 fps)
CAM_B: 235 frames (19.6 fps)
CAM_C: 235 frames (19.6 fps)
CAM_D: 0 frames (0.0 fps)
Questions
- Is streaming 4 cameras simultaneously supported on the OAK-FFC-4P (RVC2), or is there a hard limit on the number of simultaneous MIPI camera streams on the Myriad X for this board?
- If supported, what is the correct way to enable it (BoardConfig, flashed board/calibration config, GPIO, or a firmware build)? Is there a way to force the 4-lane sockets (A/D) to operate in 2-lane mode so all four fit?
- If it is a hardware limit, which board supports 4 concurrent 2-lane cameras (OAK-FFC-6P, or an RVC4-based board)?
Thanks!
Summary
On an OAK-FFC-4P-POE (RVC2 / Myriad X) with four OAK-FFC AR0234 (2-lane) modules — one in each socket (CAM_A, CAM_B, CAM_C, CAM_D) — all four cameras enumerate, but when streaming all four simultaneously the 4th camera (CAM_D / socket 3) yields 0 frames, while CAM_A/B/C stream normally. Any 3 of the 4 sockets work (including both 4-lane sockets A+D together); only the 4th, whichever is allocated last (CAM_D), fails.
Hardware
productName=OAK-FFC-4P-POE,boardName=NG2093,boardRev=R4M1E4, MXID14442C10414E91D700, bootloader0.0.28, platform RVC2.169.254.1.222).Goal
Stream all 4 cameras simultaneously (MJPEG), full resolution 1920x1200, ~20 fps each.
Symptom
getConnectedCameraFeatures()returns all four AR0234.Camera→VideoEncoder(MJPEG)per socket: CAM_D delivers 0 frames; CAM_A/B/C deliver 20 fps.Reproduced identically across
8d6a04d380ce182e0cb3a4694309426370295a9f) — single-consumer and thread-per-camera pollers.develop(device firmware45274630e27b04617985d3e80360f15052a99686).BoardConfig.mipi4LaneRgb = false(no effect; it also appears unused in host code).What this rules out
developfirmware.Related but not identical: #857 (CAM_D not detected — fixed) and luxonis/depthai-python#1007 (ToF, shared-I2C-limited to 3).
Minimal reproducer (C++)
Built against depthai-core (
BUILD_SHARED_LIBS=ON,DEPTHAI_OPENCV_SUPPORT=ON). Prints per-socket frame counts over 12 s; CAM_D shows 0.Example output (device IP hard-coded above):
Questions
Thanks!