관리 메뉴

KorSA

영상 frame 관리 본문

Development Experience/Video Streaming

영상 frame 관리

Praiv. 2020. 12. 15. 17:04
320x100

[ 증상 ]

영상 frame streaming에서 원형 큐를 사용하여 frame을 관리하고 있었다. frame이 Queue의 size만큼 수신되면 원형 큐는 가득차게 되는데, 다음 frame을 받기 위해 나는 Queue에 존재하는 맨 처음 frame과 맨 마지막 frame의 시간 차가 일정 간격(period A라 하자)이상 차이가 나면 맨 앞의 frame을 버리는 정책을 취하였다.  하지만 이 과정에서 한 가지 버그가 발생하였는데, 이는 Queue에 frame이 가득차는 시간이 period A 보다 짧게 걸릴 경우, 맨 앞의 frame은 절대 버려지지 않는 것이었다. 이로 인해 새로 수신되는 frame들도 꽉찬 Queue에 들어가지 못하는 현상이 발생하였다. 

[ 해결 ]

그래서 나는 매 frame을 수신할 때마다 이 frame의 시간을 별도의 멤버 변수로 저장하였다. 그리고 Queue에서 frame을 버리는 정책을 실행할 때, 멤버 변수로 저장된 frame 시간 값을 사용하였다. 이 frame 시간 값은 가장 최근에 수신한 frame이기 때문에 frame이 수신되는 한 계속 업데이트되고, 이 시간 값과 Queue에 저장된 맨 앞의 frame의 시간 값의 차이는 자동으로 벌어진다. 이 시간 값이 period A 보다 클 경우 frame을 버리는 정책을 취하자 Queue에 frame이 가득 찬 상황에서도 오래된 frame을 버리고 새로운 frame을 수신하는 과정을 계속 진행할 수 있었다. 물론 Queue에 있는 오래된 데이터가 주기 함수(Abandon 함수라 하자)의 호출을 통해 버려질때까지 시간이 걸리므로 최근 수신한 frame들 중 일부는 유실될 가능성이 있다. 이로 인해 영상이 끊겨보이는 증상이 나올 가능성이 있다. 그래서 우선적으로는 Queue의 사이즈를 충분히 넓혔다. 이 조치로 인해 Queue에 frame이 가득 차는 시간은 왠만해서는 period A 보다 오래 걸릴 것이다.  만약 Queue의 사이즈를 조절하지 못하는 상황이었다면 Abandon 함수의 호출 간격을 기존 1초에서 더 짧게 하는 등의 조치가 필요했을 것 같다.

728x90
728x90

'Development Experience > Video Streaming' 카테고리의 다른 글

Bitmap Create / Draw 시 lock을 걸 때  (0) 2020.08.26
영상 Delay 이슈  (0) 2020.08.26
MSDN WIC 의 Pixel Format 정리  (0) 2020.04.22
Comments