Skip to content

[BUG] OAK-FFC-4P-POE (RVC2): 4th camera (CAM_D/socket 3) yields 0 frames streaming 4x AR0234 #1887

Description

@siyuanfeng-lbm

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 CameraVideoEncoder(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

  1. 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?
  2. 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?
  3. If it is a hardware limit, which board supports 4 concurrent 2-lane cameras (OAK-FFC-6P, or an RVC4-based board)?

Thanks!

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions