[RAPA3기][4조][Fail-Operational TMR 기반 자율주행 차량 제어 시스템] AI-G 보드 tccvin_v4l2.c 관련 버그 여부 및 D3-G 브랜치 파일 적용/백포트 방향 문의

안녕하세요. 프로젝트 진행 간에 AI-G 보드에서 IMX219 캡처를 검증하는 과정에서 V4L2 멀티플레인 포맷 (sizeimage 등) 미설정으로 인해 userspace(GStreamer/v4l2-ctl) 캡처가 실패하는 이슈를 확인했습니다.

조사 중 D3-G 브랜치에는 해당 문제가 반영된 tccvin_v4l2.c가 존재하는 것을 확인하여, 본 이슈가 버그로 보는 것이 맞는지와 AI-G 기준으로 어떤 적용 방식이 정석인지 의견을 부탁드립니다.

  1. 환경
Board: AI-G

Kernel: 5.10.223-tcc

Sensor: IMX219

v4l2-ctl: 1.22.1

GStreamer: 1.20.7

Video device: /dev/video2 (driver: tccvin / videoinput2)
  1. 증상
DEV=/dev/video2
OUT=/tmp/imx219_720p.png

gst-launch-1.0 -e \
  v4l2src device=$DEV io-mode=mmap num-buffers=1 ! \
  video/x-raw,format=UYVY,width=1280,height=720,framerate=30/1 ! \
  videoconvert ! pngenc ! filesink location=$OUT

위와 같이 시도 했을 때 아래의 에러가 발생했었습니다.

에러:

Video device did not suggest any buffer size

streaming stopped, reason not-negotiated (-4)

GST_DEBUG(v4l2*:7) 확인 시, 드라이버가 VIDIOC_S_FMT/TRY_FMT 이후 VIDIOC_G_FMT(또는 set-format 결과)에서 sizeimage=0을 반환하는 것으로 관찰됩니다.

Got format ... stride 2560, sizeimage 0
...
Got sizeimage 0
...
error: Video device did not suggest any buffer size.


즉, userspace(GStreamer v4l2src)가 fmt의 sizeimage를 신뢰하여 버퍼풀 allocation을 진행하는데, sizeimage=0으로 인해 초기 allocation 단계에서 중단되는 형태로 생각 중에 있습니다.

  1. 원인 추측

V4L2 Multiplanar 포맷 설정 시 num_planes / bytesperline / sizeimage가 정상적으로 채워지지 않음

특히 fmt.pix_mp.plane_fmt[0].sizeimage == 0이 userspace에서 치명적(버퍼 사이즈 미제안)으로 동작

  1. 패치 진행

AI-G 기준 drivers/media/platform/tccvin2/tccvin_v4l2.c에 대해 아래 방향으로 패치를 적용하여 문제를 해결했습니다.

tccvin_fixup_pix_mp() 헬퍼 추가

num_planes / bytesperline / sizeimage가 0일 경우 width/height/pixfmt 기준으로 안전한 기본값 산출

tccvin_ioctl_s_fmt()

v4l2_fill_pixfmt_mp() 이후 tccvin_fixup_pix_mp() 적용 후 내부 포맷 저장

tccvin_ioctl_try_fmt()

포맷 지원 여부 확인 후 v4l2_fill_pixfmt_mp()로 누락 필드 채움

field/colorspace 기본값 세팅 + tccvin_fixup_pix_mp()로 최종 보정하여 유효한 fmt 반환

tccvin_queue_setup()

sizeimage==0인 경우 보정 로직을 통해 sizes[]를 구성하여 할당 실패 방지

5) 결과(패치 적용 후)

아래와 같이 PNG 프레임 다중 저장이 정상 동작함을 확인했습니다.

gst-launch-1.0 -e \
  v4l2src device=/dev/video2 io-mode=mmap num-buffers=10 ! \
  video/x-raw,format=UYVY,width=1280,height=720,framerate=30/1 ! \
  videoconvert ! multifilesink location=/tmp/t_%02d.png
md5sum /tmp/t_*.pngSetting pipeline to PAUSED ...
Pipeline is [ 1188.577006] tccvin videoinput2: [ERROR][VIN] tccvin_get_rect_by_target - target(0x00000002) is not supported
live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLA[ 1188.594567] tcc-isp 16080000.isp0: [ERROR][tcc-isp] tcc_isp_cmm_read_file(36) - request_firmware(tcc-isp-fw) returned error(-2)
YING ...
New clock: GstSystemCl[ 1188.608329] tcc-isp 16080000.isp0: [ERROR][tcc-isp] tcc_isp_load_fw(485) - FAIL - loading firmware(tcc-isp-fw)
ock
[ 1188.621072] tcc-isp 16080000.isp0: [ERROR][tcc-isp] tcc_isp_init(465) - tcc_isp_load_fw returned -2
[ 1188.630539] tcc-cap-media-drv tcc_cap_media: [ERROR][tcc-cap-media-drv] tcc_cap_media_call_sd_init(377) - init of tcc-isp-0 returned -2
Redistribute latency...
Got EOS from element "pipeline0".
EOS received - stopping pipeline...
Execution ended after 0:00:00.462105334
Setting pipeline to NULL ...
Freeing pipeline ...


md5sum /tmp/t_*.png
85f61cfc7d5ce478afdacb302480567e  /tmp/t_00.png
24b8d6b6c512f9ac264097c029ce1963  /tmp/t_01.png
516931daa00ba9e99c13b6e58da5a757  /tmp/t_02.png
0175ce8fe77a9cbd3b5708ed16de3019  /tmp/t_03.png
bd13e3a02c69dff9c06731e501ae5c06  /tmp/t_04.png
abeb48eede980f0f872432d3d9ddb182  /tmp/t_05.png
1f6e6585fd8bc4e5029a64b07a565734  /tmp/t_06.png
a5fc7049a5f904029d7d6849e60bf2b0  /tmp/t_07.png
035d4bcff1e204170f515a2431a7a7f1  /tmp/t_08.png
7e6e61fceb3f75ddac2834ece32d419b  /tmp/t_09.png

6) 문의 사항

  1. 본 이슈(멀티플레인 캡처에서 sizeimage=0 반환 → userspace allocation 실패)는 드라이버 관점에서 버그로 보는 것이 맞을까요?
    • 의도된 정책/설계(예: userspace가 계산해야 하는 형태)가 있는지 확인 부탁드립니다.
  2. D3-G 브랜치에는 수정이 반영된 tccvin_v4l2.c가 존재하는 것으로 확인 했습니다.
    AI-G 기준으로는 다음 중 어떤 방식이 정석일까요?
    • (A) 제가 적용한 패치 유지

    • (B) D3-G 브랜치에서 릴리즈된 tccvin_v4l2.c로 교체.

7) 패치 파일

.patch, .zip이 업로드 되지 않아, txt 파일로 첨부드립니다.

tccvin_v4l2.txt (25.2 KB)

확인 부탁드리며, 의견 주심에 따라 권장 방식으로 진행 및 공유 하도록 하겠습니다.

감사합니다.

안녕하세요, 검토 후 답변드리도록 하겠습니다.
감사합니다.

안녕하세요.
tccvin2의 내부 로직에서 setting값 반환이 잘못되어 image size가 0으로 나오는 문제가 있습니다.
먼저 코드 수정 및 패치로 테스트하여 정상 동작 확인 후 패치파일 공유 드리도록 하겠습니다.

감사합니다!

우선 첨부해주신 patch파일은 지우고 clean build 부탁드립니다.(수정하셨던 부분 빼고 원래 소스로 빌드)
tccvin-bugfix-patch.txt (14.5 KB)
첨부드린 패치파일에서 tccvin쪽 패치만 수정하셔서 적용하시면 됩니다.(imx219 diff내용도 들어있는데 무시하고 tccvin쪽만 수정해주세요)

캡처 방법은 아래와 같습니다.

v4l2-ctl --device 2 --set-fmt-video width=1640,height=1232,pixelformat=RGB4 --stream-mmap --stream-to ./1640x1232.RGB4 --stream-count 5

이후 scp로 캡처한 파일을 local pc로 옮긴 후 개발서버에서 ffmpeg으로 png로 변환하여 사용하시면 됩니다.
ffmpeg으로 변환 시 pixelformat은 rgba로 하시면 됩니다.
uyvy로 진행하실 경우에는 ffmpeg으로 변환 시 pixelformat은 uyvy422로 진행해주시면 됩니다.
ex)

ffmpeg -f rawvideo -pixel_format rgba -video_size 1280x720 -i 1280x720.RGB4 -frames:v 5 output_%03d.png

감사합니다.

1 Like

안녕하세요, 답변 해주셔서 감사합니다.

말씀 주신 내용으로 적용 후 댓글로 경과 말씀드리도록 하겠습니다.

감사합니다!

1 Like

적용 결과 문제 없이 동작하는 것을 확인했습니다!

감사합니다~

2 Likes