블로그 이미지
대갈장군

calendar

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

Notice

'OpenGL'에 해당되는 글 1

  1. 2009.05.16 DirectShow 필터로 동영상 추출하여 OpenGL로 렌더링 하기
2009. 5. 16. 01:23 프로그래밍/DirectShow
제목부터 아리까리하다. 내가 교수님으로부터 이상한 프로그램 하나를 건네 받고 그 놈을 요리조리 뜯어보다 보니 그 원리가 제목과 같더라...

잘은 모르지만 OpenGL에서 동영상 파일 재생은 매우 제한적이다. NeHe 홈페이지에 가보면 단순한 Mpeg 파일 재생 OpenGL 프로그램이 있기는 하지만 Mpeg 버전에 따라 되는 파일도 있고 안되는 파일도 있다. 한마디로 불완전하다.

수많은 형태의 동영상 재생 파일을 손쉽게 읽고 재생하기 위해서는 DirectShow 의 강력한 필터가 필요하다. 다만 OpenGL을 기반으로 프로그램을 작성하게 되면 DirectShow와 어떻게 연동해야 할지가 문제다.

물론 DirectX 기반으로 작성하면 (안해봤지만) 훠어얼씬 쉽겠지. VMR-9이라는 멎진 놈이 존재하기 때문에 텍스쳐 맵핑을 걱정할 필요가 없다.

하지만 죽으라는 법은 없다고 하지 않았던가... DirectShow의 필터중에 동영상 샘플 추출 필터가 있으니 바로 ISampleGrabber 를 이용하는 것이다.

이놈을 이용하게 되면 디코더를 지나자 마자 샘플 추출기 필터로 데이터가 흘러 들아가게 되고 샘플 추출기 필터는 새로운 데이터가 들어오면 SampleCB() or BufferCB() 함수를 콜백으로 호출하게 된다.

이 두 방식의 차이는 IMediaSample 인터페이스를 직접 넘겨주는가 그렇지 않는가에 있다. 뭐 중요한 차이는 아닌듯 싶다. 직접 넘겨주지 않는다면 클래스 멤버 변수에 따로 변수들을 저장해 두면 그만이고..

데이터가 넘어오면 그 길이와 주소를 이용해서 적당한 작업을 하면 된다. 하지만 주의할 것은 콜백 함수가 리턴 되기 전까지 필터는 흐름이 멈추게 된다. 고로 메모리 복사 작업 (텍스쳐 복사 작업)은 콜백 함수 내부에서 하면 성능 저하를 가져 올수도 있겠다는 생각이 든다.

하지만 막무가내로 리턴하고 다음 데이터를 받아버리면 공유된 버퍼 자원에 대한 자원 경쟁이 발생하거나 새로운 이미지 데이터가 업데이트 되는 도중에 텍스쳐 복사를 한다거나 하는 문제가 발생하지 않을까? 

만약 그렇다면 해결방법은 Critical Section을 이용해야 한다... 라면 성능에는 아무런 문제가 없을까?...

아무튼 현재 사용중인 프로그램은 이런 형태의 흐름을 가지고 있으며 이를 이용해 다양한 형태의 입력 파일들 (mpg, jpg, avi 등) 을 아주 손쉽게 OpenGL 텍스처로 입혀서 사용중이다.


posted by 대갈장군
prev 1 next