진행중인 프로젝트에서 캡처 보드로 부터의 영상을 프로그램에 보여주기 위한 모듈을 별도의 dll로 제작하였다. 하나의 View만 사용할 때는 문제가 없다가 동시에 두개 이상의 View를 보여주기 위해 dll을 수정하고 디버깅을 하던중 다음의 창을 보게 되었다.
첫번째 View를 초기화 완료하고 두번째 View를 똑같은 과정으로 초기화 하는중에 영상 출력 Graph를 생성하는 루틴에서 문제의 다음 창과 조우하였다.
이 문제와 관련은 없지만 참고로 DirectShow나 DirectX의 Dubug용 Library를 로드하기 위해서는 다음의 함수를 사용해야 한다. (그러나 아래 설명에서 처럼 대부분의 DirectShow 응용 프로그램이 Strmbase.lib 을 사용하기 때문에 별도로 DbgInitialise를 할 필요는 없어 보인다.)
DbgInitialise
Initializes the debug library. Ignored in retail builds.
Syntax
void DbgInitialise(
HINSTANCEhInst);
Parameters
hInst
Handle to the module instance.
Remarks
In an executable, call this method before using the DirectShow debug facilities. Before the executable quits, call the DbgTerminate function to clean up the debug library.
In a DLL that links to the base-class library (Strmbase.lib), it is not necessary to call this function. The function is called automatically when the DLL is loaded.
구체적으로 다음의 함수에서 Protection Error가 발생했다.
ICaptureGraphBuilder2::RenderStream
The RenderStream method connects an output pin on a source filter to a sink filter, optionally through an intermediate filter.
현재 DirectShow를 근간으로 하는 프로젝트도 진행중이다. 주 용도는 외부 영상기기의 Video 캡처와 관련이 있는데 Interlacing이 화제에 올라 예전 DirectShow 관련 프로젝트에서 문제가 되어 해결을 위해 De-Interlace Filter를 사용했던 기억과 함께 관련 자료를 링크해 두었던 것이 생각나 글을 쓴다.
이번에 알고 싶은 것은 위의 현상에 대한 정확하고 명쾌한 기술적 설명이다. 한번 찾아볼까?
화면에 줄이 가는 현상(Interlace현상)은 일반 TV나 캠코더에서 사용하는 비월주사방식(interlace)과 컴퓨터에서 사용하는 순차주사 방식(progressive scan)의 차이에서 오는 현상입니다. 움직임이 많은 화면에서 옆으로 줄이가는것처럼 보이기도 하고, 잔상이 남는것처럼 보이기도 하는 현상으로, 일반TV와 컴퓨터 모니터의 주사방식이 다르기때문에 나타나는 것입니다. 하드디스크에 저장된 영상은 원본의 것과 동일한 것이며, 단지 컴퓨터 모니터상으로 Preview되는 화면이 인터레이스현상으로 인해 화면에 줄이 가는것처럼 보이는 것입니다.
다음의 글은 약 60 Frames(60Hz)의 Progressive 주사 방식을 갖는 Dispaly(컴퓨터 모니터)에서 Interlaced 소스를 Display했을 때 발생할 수 있는 현상을 비교적 잘 설명하고 있습니다.
문제점: Frame/Field 모드와 Interlaced/Non-Interlaced 모드의 관계는 무엇입니까?
솔루션: "Interlaced" 방식과 "Non-Interlaced" 방식은 아날로그 카메라 같은 장치로부터 비디오 라인이 출력되는 방식을 말합니다. interlaced 모드에서는 한 번에 수평 라인의 절반씩이 출력됩니다. 즉, 홀수 라인들이 먼저 출력되고, 이후 짝수라인들이 출력됩니다. "Frame"과 "Field"는 이미지 수집 보드가 수집한 라인들을 이미지로 복원하는 방법을 의미합니다. 예를 들어, Frame은 홀수와 짝수 라인들을 모두 받아서 이미지로 만드는 것이고, Field는 홀수 혹은 짝수 라인들이 들어왔을때 즉각적으로 이미지로 만드는 것을 의미합니다.
즉 NTSC Interlaced 30fps 는 초당 30 Frames를 의미하는 것으로 Interlaced 임으로 초당 60 fields로 구성됩니다.