Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Visual Studio

V4L2 Multithreaded Capturing 본문

Computer Engineering

V4L2 Multithreaded Capturing

emacser 2022. 6. 20. 03:36

회사에서 Video I/O 병목을 해결하기 위해

V4L2 인터페이스를 사용해서 멀티 쓰레드로 Frame Grabbing을 할 일이 있었는데,

힌트가 되었던 정보들도 죄다 영어였기 때문에 읽는데 오래 걸렸고,

관련 정보가 너무나 적어 어려움을 겪었던 기억이 난다.

사실 멀티 쓰레드로 카메라 버퍼 액세스가 가능하다는 것도 구글링해서는 알수 없었고,

제조사에서 제공하는 다른 제품군의 프레임워크가 멀티 쓰레드로 동작한다는 사실로부터

알아냈다.

 

그래서 내가 해결한 방법을 공유해 한 사람이라도 도움이 되었으면 좋겠다는 생각이 들었다.

 

간단히 핵심만 얘기하면, V4L2는 여러 개의 내부 버퍼를 가져 마치 렌더링 엔진에서의

다중 버퍼링처럼 동작할 수 있는데, ioctl로 카메라의 버퍼에서 메모리에 있는

버퍼로 긁어오는 과정을 워커 쓰레드 여러개로 처리하게 하면 병목을 크게 완화할 수 있다.

 

내부 버퍼가 여러개 있기 때문에, 각 쓰레드에서 버퍼를 요청할 때마다 current buffer index가 증가한다.

예를 들어 내부 버퍼 갯수가 4이면 버퍼를 요청할 때마다

0 -> 1 -> 2 -> 3 -> 0 -> 1 -> ...

와 같이 current buffer index가 변하기 때문에 ioctl 콜만 thread-safe함을 보장하면 손쉽게 각각의 쓰레드가

서로 다른 버퍼를 동시에 로드하도록 할 수 있다.

 

+ 각 Capture Thread가 버퍼 인덱스 순서대로 output buffer에 넣는 것을 보장할 수 없기 때문에,

Push Thread를 따로 만들어서 Capture Thread가 Push Thread에  push를 요청하고,

Push Thread는 다음 버퍼 인덱스에 해당하는 요청만 처리하도록 해야 한다.