이상하다 왜 디코딩 하다가 죽었을까?

동영상 관련 장비가 죽었는데 스택덤프를 보고 일단 그 상황에 대한 처리를 해두긴 했지만 왜 그렇게 죽었는지 아직 이해가 안 되고 있는 중이다.

실시간 동영상 처리를 하기 때문에 패킷로스가 나서 깨진 스트림도 디코딩을 해서 화면을 최대한 복원하고, 없는 부분은 이전 영상으로 대체하는 기능이 있다. (일반적인 VOD는 버퍼링을 길게 하고 TCP로 받기 때문에 이럴일이 없다. HD방송을 공중파로 보시는 분은 가끔 화면의 한 라인 정도가 망가지는 것을 보셨을듯 그런 기능이다.) 이 부분이 어려운 게, 패킷이 깨져서 정상적이지 않은 스트림도 디코딩을 해야 하는데, 압축된 코드에서 스트림이 깨졌음을 확인하고, 바로 다음 시작점으로 가서 깨진 부분은 건너 뛰고 디코딩을 해줘야 한다(건너뛰는 단위는 프레임 내에서 다음 마커 까지이다). 비정상적인 압축 코드가 들어가기 때문에 원래는 나올수 없는 코드들이 나오기도 한다. 예를 들어 0 ~ 4의 레인지를 가진 값이 5가 나온다든지 해서 참조 테이블의 배열을 넘어가서 죽는 다든지 하는 문제들이 생겨서 그런 경우에 모든 오류 처리를 해 둔다. 초기에 패킷로스를 모델링 해서 각종 경우에 대해서 전부 테스트를 해서 패킷로스에는 죽지 않는 코덱이라고 자신있게 말했었다. 테스트는 일주일씩 테스트를 걸었었고, 거의 매일 집에 갈때 걸어뒀기 때문에 3년여간 문제가 없었다.

그런데 그저께 디코더에서 죽었다. 거기는 네트웍 상황이 안 좋아서 패킷 손실이 심하다고 한다. 스택 덤프 내용을 들여다 보다가 우연히 비디오 사이즈의 가로 세로 값이 엄청 큰 값이 나와 있는 것을 보았다. 그런데 이게 좀 말이 안 된다. 일단 RTP 패킷은 손실 되기는 해도 변형되지는 않는다고 한다. 피지컬 단에서 체크섬 등을 통해 변형 되었으면 버린다고 한다. 그러면 중간에 짤리기는 했어도 스트림 자체는 코덱이 만든 스트림이라는 얘기이다. 그런데 코덱의 헤더에는 시작 코드라는게 있는데 이 시작코드가 코덱 내에서는 나올수 없는 패턴으로 이루어져 있다. 즉, 해당 스타트 코드가 나오면 무조건 그 해당 하는 내용이 다음에 있도록 비트스트림이 디자인 되어 있다. 그런데 어떻게 가로 세로 사이즈가 정상적이지 않은 값이 읽힌거지..??

아무리 해봐도 재현을 시킬수가 없는 경우이니 이건 뭐; 미스터리다; 메모리가 깨져서 그쪽 메모리에 누가 이상한 값을 쓴건가;

by Lohengrin | 2009/07/03 10:58 | 개발 | 트랙백 | 덧글(2)

트랙백 주소 : http://lohengrin.egloos.com/tb/1924447
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by FromNil at 2009/07/03 13:26
송신측 메모리가 깨져서에 조심스레 한 표 던져 봅니다. (__) 고생이 많으셔요~
Commented by Lohengrin at 2009/07/06 09:48
흐 원인은 좀 다른 쪽인것 같더군요;

:         :

:

비공개 덧글

 

◀ 이전 페이지다음 페이지 ▶