dxtrans.h 에러dxtrans.h 에러

Posted at 2011.08.10 15:28 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License

 예전에는 dx 8.0x 버전까지만 나오고 이후 버전에 없었기 때문에 예전 버전을 썻지만 요즘에는 WPF에 함께 설치가 되어 확실히 간편해 졌다.

하지만

#include <dshow.h> 와
#include <qedit.h>

헤더를 인클루드 시키고, lib 파일을 추가한 다음에 컴파일을 했더니

fatal error C1083: 포함 파일을 열 수 없습니다. 'dxtrans.h': No such file or directory

 이런 에러가 떳다..... 응? ... 내부적인 에러였다.. 머 검색을 좀 하다보니 최신 버전으로 바뀌며 먼가 안맞아 져서 수정을 해야한다는데......

결국 해결책을 찾았다.

해결책은

#include <dshow.h> 와
#include <qedit.h> 사이에

#pragma include_alias( "dxtrans.h", "qedit.h" )
#define __IDxtCompositor_INTERFACE_DEFINED__
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
#define __IDxtJpeg_INTERFACE_DEFINED__
#define __IDxtKey_INTERFACE_DEFINED__

이 부분을 추가해주면 끝.

저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

영상 해상도 변경 필터 (Scale Filter)영상 해상도 변경 필터 (Scale Filter)

Posted at 2011.07.27 16:52 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License


 기본적으로 Direct show에서는 해상도를 변경할수 있는 Filter를 제공해 주지 않는다.
검색을 해 봐도 웹캠에서 받아온 영상의 해상도를 변경하거나, 랜더링 할때 출력되는 해상도를 변경하는 방법밖에 나오지 않는다.

집요한 구글링 끝에 이미 구현되어 있는 해상도 변경 필터를 찾아냈다.

필터에 대한 자세한 설명은 아래 링크 참조.

http://wirelessafrica.meraka.org.za/wiki/index.php/Real-Time_Video_Coding

저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

[DirectShow 레퍼런스] IMediaFilter 인터페이스[DirectShow 레퍼런스] IMediaFilter 인터페이스

Posted at 2011.06.28 02:25 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License

1. 이름 : IMediaFilter 
2. 설명 : 시간에 기반한 데이터를 제공하는 모든 멀티미디어 콤포넌트들이 제공해야 하는 인터페이스.
           콤포넌트의 실행 상태 제어와 상태를 다른 객체와 동기화 시키는 방법을 제공하기 위해 사용함.
3. 상속 : IPersist 
4. 구현 : 모든 filter에서 구현되어야 함. CBaseFilter를 사용해서 구현 가능 
5. 사용 : 보통은 IMediaFilter를 상속한 IBaseFilter를 많이 사용하기 때문에, 직접 어플리케이션에서 사용되는
           경우는 거의 없음. 필터그래프 매니저가 사용하며, 플러그인 배급자에 의해 필터그래프 매니저가
           노출시킨 IMediaFilter의 메소드들이 호출되는 경우가 있음.
 
6. 메소드 : 
- IUnknown 메소드들 : COM객체니까 당연히 지원해야 함 
- IMediaFilter 메소드들 : 
  * Stop : 필터를 정지상태로 전이시킴 
  * Pause : 필터를 일시중지 상태로 전이시킴 
  * Run : 필터를 플레이 상태로 전이시킴 
  * GetState : 현재 상태를 반환 
  * SetSyncSource : 동기화를 위한 클럭을 지정 
  * GetSyncSource : 필터에 지정되어 있는 클럭을 반환

저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

[DirectShow 레퍼런스] IBaseFilter Interface[DirectShow 레퍼런스] IBaseFilter Interface

Posted at 2011.06.28 02:24 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License
1. 이름 : IBaseFilter 
2. 설명 : DirectShow의 모든 필터가 필수적으로 노출해야 하는 인터페이스이다. 
3. 상속 : IMediaFilter 
4. 구현 : 모든 DirectShow필터는 이 인터페이스를 구현해야 함. CBaseFilter클래스를 사용해 구현할 수 있음 
5. 사용 : 필터그래프 매니저가 일반적으로 사용. 어플리케이션은 핀이나 벤더관련 정보를 얻는데
           사용할 수 있음.
 
6. 메소드 : 
- IUnknown 메소드들 : COM객체니까 당연히 지원해야 함 
- IMediaFilter 메소드들 : IMediaFilter메소드를 살펴볼 것 
- IBaseFilter에서 선언된 메소드들 
   * EnumPins : 필터가 제공하는 핀들을 나열 
   * FindPin : 특정 ID에 해당하는 핀을 찾음 
   * QueryFilterInfo : 필터 정보를 얻음 
   * JoinFilterGraph : 필터 그래프에 연결된 경우 이를 필터에 알려줌 
   * QueryVendorInfo : 벤더가 제공하는 정보를 얻음
저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

[DirectShow기초] 필터와 핀[DirectShow기초] 필터와 핀

Posted at 2011.06.28 02:22 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License

 여러번 반복해서 지겨운 생각도 들겠지만, DirectShow구조는 필터들을 연결해서 데이터가 흘러가게 하고,
필터그래프 매니저가 데이터의 흐름을 제어하는 구조로 되어있다. 
 
 그렇다면 필터와 필터는 어떻게 연결할 수 있을까? 이 연결을 위한 객체가 바로 핀(pin)이다.
 
 IC에 핀이 있어서 다른 소자와 연결할 수 있는 것 처럼 필터에도 핀이 있어 다른 필터와 연결을
할 수 있는 것이다.
 IC마다 핀의 종류와 성격이 다르 듯, 필터의 성격에 따라 하나의 핀만을 노출할 수도 있고, 둘 이상의 핀을
노출할 수도 있다. 
 
 MSDN의 설명에 따르면, 핀은 필터에 의해 생성되는 COM 객체로써, 필터에 대한 단방향 데이터 스트림
(unidirectional data stream)의 연결점 역활을 한다. 
 
 입력핀은 데이터를 필터 안으로 읽어들일 때 사용하며, 출력핀은 데이터를 다른 필터에 전달할 때 사용한다.
소스필터는 파일에서 읽은 개개의 스트림마다 각각 하나의 출력핀을 제공한다. 코덱과
(compression/decompression을 줄여서 codec이라 함)같은 전형적인 변환필터는 하나의 입력핀과
출력핀을 가진다.
 마찬가지로 렌더러 필터는 보통 하나의 입력핀만을 가지는 경우가 많다. 
 
 핀의 이름은 필터를 작성하는 사람이 마음대로 붙일 수 있다. 만약 핀의 이름이 ~로 시작되면, 필터그래프는
그 핀을 IGraphBuilder::RenderFile을 어플리케이션이 호출했을 때, 자동으로 처리하지 않는다. 따라서, ~로
시작되는 핀 이름은 렌더링을 원하지 않고 정보만 제공하고 싶은 경우에 사용할 수 있다.
 ~가 핀의 이름의 첫글자로 들어가는것은 IGraphBuilder::RenderFile과 인텔리전트 연결
(IGraphBuilder::Connect)에만 영향을 끼친다.
 만약 ~로 시작되는 핀을 인텔리전트 연결에 사용하고 싶으면, IPin::Connect메소드를 해당 핀에 구현해주면
된다.
 
 필터는 최소한 IBaseFilter인터페이스는 노출을 시켜야 한다. 이 인터페이스는 필터가 제공하는 핀들을
뒤질 수 있도록 하는 메소드를 제공하고, 필터에 대한 정보를 제공한다. 또한, 이 인터페이스는
IMediaFilter에서 상속한 메소드를 함께 제공한다.
 이런 메소드에는 필터의 상태를 처리하는 것이나(플레이/일시중지/정지), 동기화 관련된 메소드들이 있으며,
필터 그래프 매니저에 의해 주로 호출되게 된다. 
 
 당연한 말이지만, 필터가 처리하는 미디어의 종류나 작업에 따라 이 인터페이스 외에 필요한 인터페이스를
더 노출할 수 있다.
 예를 들어 ISpecifyPropertyPages 인터페이스를 통해 프로퍼티 페이지를 제공해서, 필터의 프로퍼티를
설정할 수 있도록 할수도 있다. 
 
 핀은 다른 핀과의 연결과 데이터의 전송을 책임진다. 핀 인터페이스는 다음 기능을 지원한다.

* 공유메모리 혹은 다른 자원을 사용한 타임스탬프가 찍힌 정보의 전달
* 핀대핀 연결에 있어 데이터 포맷의 협상
* 데이터 복사 최소화화 처리 성능 향상을 위한 버퍼 관리와 버퍼 할당 관리 협상

 핀 인터페이스는 그 핀이 입력핀인지 출력핀인지에 따라 약간씩 다르다. 
출력핀은 일반적으로 다음 인터페이스들을 노출한다.

* IPin의 메소드들은 핀, 연결, 그리고 데이터 타입 정보에 대한 질의에 응답하도록 하며,
 필터그래프가 정지될 때, 플러쉬 통지를 다운스트림으로 보내는데 사용된다.
* IMediaSeeking의 메소드들은 스트림의 길이, 시작시간, 그리고 종료시간을 렌더러로 전달하도록 한다.
 렌더러는 미디어의 위치를 업스트림으로 보내서, 스트림이 적절한 위치로 위치하도록 하는 책임을 지닌
 필터 (일반적으로는 소스필터)가 위치 변경을 처리할 수 있도록 한다.
* IQualityControl의 메소드들은 렌더러에서 업스트림쪽으로 품질 컨트롤을 위한 메시지를 전달하도록 하는데
 사용된다. 입력핀은 다음 인터페이스들을 노출한다.
* IPin은 핀이 출력핀에 연결될 수 있도록 하고, 핀의 정보와 연결 정보를 제공하도록 한다.
* IMemInputPin은 핀이 자신의 메모리 할당자를 제안하고, 메모리 할당자에게 출력핀이 데이터를 제공하고
 있음을 통지하고, 미디어 샘플을 설정된 할당자를 통해 전달할 수 있도록 한다. 또한, 버퍼의 플러쉬 기능도
 제공한다. 이 인터페이스는 연결된 핀이 전송을 위한 메모리 할당자를 제공하지 않는다면,
 공유메모리 할당자를 생성할 수 있다. 
저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

[DirectShow기초] 필터와 필터 그래프[DirectShow기초] 필터와 필터 그래프

Posted at 2011.06.28 02:20 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License

필터란? MSDN에 따르면 다음과 같다. 

 A key component in the DirectShow architecture, a filter is a COM object that supports
DirectShow interfaces or base classes. It might operate on streams of data in
a variety of ways, such as reading, copying, modifying, or writing the data to a file.
 Sources, transform filters, and renderers are all particular types of filters.
 A filter contains pins that it uses to connect to other filters.

 필터란 DirectShow구조의 핵심 콤포넌트로서, DirectShow interface나 베이스 클레스를 지원하는
COM객체이다. 필터는 데이터 스트림에 대해 다양한 방식으로 작업을 하게 된다. 예를 들면 스트림을 읽거나,
복사하거나, 변경하거나, 파일에 쓰는 일과 같은 작업이 있다. 소스, 변환필터, 렌더러는 필터의 특정한 형태들이다.
 필터는 다른 필터와 연결하기 위한 핀을 가지고 있다. 
 
 위에 있는데로, 필터는 DirectShow 구조의 핵심 콤포넌트다.
또한, 필터는 COM객체이다.  COM에 대해서는 Inside COM등 다른 COM책을 참조하면 될것 같다.
(너무 이야기가 길어져서 생략한다.) 
 
 필터는 다른 필터와 연결되기 위해 핀(pin)을 가진다. 반도체IC에 달려있는 핀을 생각하면 된다.
따라서, 핀에는 입력핀과 출력핀이 있으며, 필터의 종류에 따라 입력핀은 있고, 출력핀은 없거나(렌더링 필터),
출력핀은 있고, 입력핀은 없는 경우(소스필터)가 있으며, 입출력핀을 모두 갖춘 필터도 있다(변환필터). 
 
위에 요약된 것과 같이, 필터의 종류는 크게 세가지로 나눌 수 있다.

1) 소스 필터 : 파일/디스크/인터넷/위성 등에서 소스 데이터를 받아서 필터 그래프로 전해주는 필터
2) 변환 필터 : 데이터 스트림을 입력으로 받아, 작업을 수행한 후, 그 결과를 출력스트림으로 보내주는 필터
3) 렌더링 필터 : 입력 스트림을 받아서 최종 출력 형태로 변환해 출력해 주는 필터. 일반적으로는 화면에
                    보여주거나, 스피커를 통해 소리로 전달하게 되지만, 메모리나 디스크 파일에 전송할
                    수도 있다.

 필터들이 연결된 네트웍을 필터 그래프라 하며, 데이터는 필터 그래프를 일반적으로 소스필터에서
렌더링필터 방향으로 흘러가게 된다. 이 데이터의 흐름을 기준으로 순방향쪽에 있는 필터를
다운스트림필터라 하며, 역방향쪽에 있는 필터를 업스트림필터라 한다. 다른말로 어떤 필터를
기준으로 그 필터에게 데이터를 전달해 주는 쪽을 업스트림필터라 하고, 데이터를 전송받는 쪽을
다운스트림 필터라 한다.
(업다운 구분은 물의 흐름을 생각하면 쉬울듯 하다. 위에서 아래로 물이 흐르니까..) 
 
 예를 들어 필터가 A-B-C-D순으로 연결된다고 해보자. A는 소스필터이고, D는 렌더링필터이고,
B,C는 변환필터라 하자. 이때, A는 B의 업스트림필터이고, B는 C의 업스트림필터이며,
D는 C의 다운스트림필터이다. 
 
 우리가 플레이할 미디어와 관련된 데이터스트림은 다운스트림쪽으로 흘러가지만,
다른 제어정보 등은 역방향으로도 전달될 수 있다는 점을 언급해 두고 넘어가도록 하겠다. 
 
 필터그래프의 생성은 어플리케이션에 의해 각 필터간의 핀을 연결함으로써 수동으로(?)이루어질 수도 있으며,
필터그래프 매니저에 의해 자동으로 이루어질수도 있다. 필터그래프 매니저는 특정 미디어 타입에 따라
적절한 필터그래프를 생성할 수 있는 능력을 가지고 있으며, 레지스트리에서 적절한 클래스를 찾아서
미디어 타입이나 인코등 스킴에 따라 렌더링이나 디코딩을 수행하는 적절한 필터를 찾아서 필터그래프의 생성과
미디어 데이터 처리를 진행할 수 있다.

저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

[DirectShow기초] File Play[DirectShow기초] File Play

Posted at 2011.06.28 02:12 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License

이 예는 MSDN에 나온 샘플 DirectShow어플리케이션이다. 
 
앞에서 말했던 DirectShow 어플리케이션 작성의 4가지 스텝을 다시 기억해 보자.

1. 필터그래프 매니저의 인스턴스 생성
2. 매니저를 이용해서 필터 그래프 생성
3. 매니저를 이용해서 필터그래프에서 데이터를 처리하도록 함
4. 사용이 끝나면 리소스 반환

1. 인스턴스 생성
 앞에서 이야기했듯이 매니저나 필터 모두 COM객체이기 때문에, 우선 COM라이브러리를 초기화 해야 한다.
이 작업은 CoInitialize를 호출함으로써 이루어진다.
 

HRESULT hr = CoInitialize(NULL); 

if (FAILED(hr)) { 

         // 에러처리 코드(간단하게 하기 위해 생략) 

}



 에러처리는 생략했으며, 필요한 분은 COM책을 들여다 보시면 다 있다.
(참고로, MSDN에 따르면, DirectShow는 free-threading model이기 때문에,
COINIT_MULTITHREADED옵션을 사용해도 된다고 한다.이때는 CoINitializeEx를 사용하라.)
 이제 필터그래프매니저를 생성해야 한다. COM에서는 객체 생성을 위해 CoCreateInstance를 사용한다.

IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); 


 CLSID_FilterGraph는 필터그래프매니저의 클래스ID이다.
(뭔소린지 모르는 분은 COM책을 보시라. 앞으로 설명할 내용에서 나오는 용어들도 마찬가지).
 또한, 이 예제에서는 inprocess DLL로 사용하기 때문에, CLSCTX_INPROC_SERVER로
실행 컨택스트를 정해준다. IID_IGraphBuilder는 우리가 사용할 인터페이스 ID이다. 이 인터페이스는
그래프 생성시 사용할 메소드들이 정의되어 있다. pGraph의 주소를 void**로 넘겨주는것은
CoCreateInstance함수가 그렇게 정의되어 있기 때문이다.
 CoCreateInstance함수는 pGraph에다 생성된 COM객체의 인터페이스에 대한 포인터를 넘겨주게 된다.
 
이제 IGraphBuilder인터페이스를 얻었고, 다른 두개의 인터페이스를 얻을 차례이다.

- IMediaControl은 스트리밍을 콘트롤한다. 그래프의 작동을 시작하고, 중지하는 메소드를 포함하고 있다.
- IMediaEvent는 필터그래프매니저에서 발생하는 이벤트를 얻기 위한 메소드를 제공한다.
 
두 인터페이스 모두 IGraphBuilder에다 QueryInterface를 해서 얻는다.
 
IMediaControl *pControl;
IMediaEvent *pEvent;

hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); 
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

 
2. 그래프 생성
 이제 필터그래프를 만들수 있게 되었다. 파일을 플레이하기 위한 필터그래프는 다음 메소드를
호출해서 할 수 있다.
 
hr = pGraph->RenderFile(L"C:\\Example.avi", NULL);
 

 IGraphBuilder::RenderFile 메소드는 지정한 파일을 읽을 수 있는 필터그래프를 생성한다.
첫번째 파라미터는 wide character타입이다. 따라서, L"C:\\Example.avi"을 사용했다.
두번째 파라미터는 항상 NULL이어야 한다.

이 메소드는 파일이 없거나, 파일의 포맷을 알아낼 수 없을 경우 실패한다. 
메소드에서 성공하게 되면, 그래프 생성이 완료된 것이고, 파일의 플레이를 시작할 수 있게 된 것이다. 
 
3. 그래프 동작 
 필터그래프 생성후, IMediaControl::Run을 호출하면 그래프가 동작하게 된다.
즉, 파일을 플레이하게 된다는 것이다. 다음과 같이 호출한다.
 
hr = pControl->Run();
 

 필터 그래프가 동작하게 되면, 데이터가 필터 그래프를 통해 흘러서 비디오와 오디오가 렌더링되게 된다.
이때 비디오/오디오의 플레이는 독립된 쓰레드로 진행된다.  
 플레이의 완료까지 기다리려면 IMediaEvent::WaitForCompletion메소드를 호출함으로써 기다릴 수 있다.  
 
long evCode = 0;
pEvent->WaitForCompletion(INFINITE, &evCode);
 
 
 이 메소드는 플레이가 종료되거나, 지정한 시간이 지날 될 때까지 블럭되며,
이벤트를 evCode에 넘겨주게 된다. 어플리케이션은 이벤트코드를 보고 어떤 이유로
WaitForCompletion이 리턴했는지를 알수 있다.
 
4. 리소스 해제 
사용이 끝난 COM객체는 release해주고, COM라이브러리도 반환해야 한다. 다음과 같다. 
 
pControl->Release(); 
pEvent->Release(); 
pGraph->Release(); 
CoUninitialize(); 
 


* 링크 및 실행 방법
다음 파일은 항상 Include 해야 한다.

Dshow.h

링크시에는 다음을 참조해 필요한 라이브러리는 함께 링크해야 한다.

Strmiids.lib : 모든 DirectShow 어플리케이션에 필요.
Quartz.lib : AMGetErrorText 메서드의 호출에 필요.
Strmbase.lib :DirectShow의 base classes를 사용할 경우만 필요

 dshow.h를 사용하기 위해서는 platform SDK를 깔아야 하며, directX SDK도 함께 깔아야 한다.
두 파일은 모두 MS의 다운로드 페이지나 naver자료실에서 다운로드 받을 수 있다.

저작자 표시 비영리 변경 금지
신고
  1. 소후
    잘 정리하신 글 고맙게 잘 읽었습니다. 다이렉트 쇼에 대한 인터넷에 너무 자료가 없네요
  2. 비밀댓글입니다

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

[DirectShow기초] Indroduction[DirectShow기초] Indroduction

Posted at 2011.06.28 02:05 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License

- Filter, Filter Graphs 
 DirectShow의 기본 빌딩 블럭은 filter라 불리는 콤포넌트이다. 필터는 멀티미디어 스트림을 
어떤 연산을 해서, 내용을 변화시킨 후 출력해 주는 콤포넌트라 할 수 있다. 
 
 예를 들면 파일을 읽는 필터는 HDD에서 파일을 읽어서, 해당 파일을 스트림으로 만들어서
출력으로 내놓게 된다. 디코더나 출력장치로 출력하는 콤포넌트도 DirectShow에서는 필터라 부른다. 
 
 DiretShow에서는 이런 필터를 연결해서 필요한 작업을 진행한다. 예를 들어 파일필터의 출력을 디코더 필터의
입력에 연결하고, 디코더필터의 출력을 렌더러에 연결하고 하는 식이다. 당연한 이야기지만, 한 필터의 출력이
두개 이상의 필터에 입력으로 연결될 수도 있고, (아마도) 둘 이상의 필터의 출력을 한 필터에서 입력으로 받아서
처리할 수도 있을 것이다. 따라서, 필터간의 연결상태는 단순한 선형이 아닌 그래프 구조를 띄게 되며,
이런 연결된 필터들의 집합을 필터그래프라 한다. 
 
다음 예는 MSDN에 나온 필터그래프의 예이다.


 HDD의 파일을 FileSource필터가 읽어서, AVI Splitter에 전달하면, AVI Splitter는 그 데이터를 비디오 스트림과
오디오 스트림으로 만들어서 각각 AVI Decompressor와 Default DirectSound Device에 전달한다.
 AVI Decompressor는 비디오 스트림을 디코드하고, 그 결과를 Video Renderer에 전달하게 되며,
최종적으로 VideoRenderer는 DirectDraw나 GDI를 이용해 비디오 프레임을 화면에, DirectSound Device는
소리를 DirectSound를 이용해 스피커에 출력하게 된다. 
 
 어플리케이션 작성시에는 이러한 필터 그래프 생성을 위해 Filter Graph Manager를 사용하게 된다.
Filter Graph Manager는 필터들을 서로 연결할 수 있는 메소드를 제공하고, 스트림의 흐름을 제어하는
메소드와 각 필터에서 발생할 수 있는 이벤트를 전달하는 구조를 가지고 있다. 
 
DIrectShow 어플리케이션의 동작은 다음과 같은 절차를 거쳐 이루어진다. 

1. Filter Graph Manager의 인스턴스 생성
2. Filter Graph Manager를 통한 Filter Graph의 생성
3. Filter Graph Manager를 통한 스트림의 제어와 이벤트의 처리
4. 동작 완료 후엔 사용했던 필터와 manager를 해제

 다음 그림은 이 과정을 도식화한 것이다.


각 필터와 Graph Filter Manager는 COM객체이다. 따라서, 객체의 생성과 해제도 COM의 규칙에 따라
이루어지게 된다.
저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

Visual Studio 2008 에서 DirectShow 개발환경 구축하기Visual Studio 2008 에서 DirectShow 개발환경 구축하기

Posted at 2011.06.28 01:51 | Posted in About Programing/07. Direct Show
크리에이티브 커먼즈 라이선스
Creative Commons License

출처 : http://hyukmini.tistory.com/15

 시중에 나온 DirectShow 서적을 보면 예제가 모두 Visual C++ 6.0 기반으로 작성되어 있고 개발환경을 구축하는
방법 역시 VC++ 6.0 기준으로 되어있다. 따라서 이 글은 초보자가 최신 환경에서 DirectShow Filter를 개발할 수
있도록 개발환경을 구축하는 정보를 제공하기 위해 작성되었다.


 DirectShow를 기반으로 한 애플리케이션을 개발하기 위해서는 일반적으로 아래와 같은 파일들이 필요하다.
 하지만 아래 파일들이 버전이 바뀌어 감에 따라 이리저리 옮겨가고 심지어는 직접 빌드해서 사용해야 하기 때문에
사용자들에게 혼란을 주고 초보자가 개발환경을 구축하는데 어려운 점이 발생해 흔히 말하는 '삽질'을 하게 된다.

 DirectShow는 DirectX에 포함되어 배포되어 왔으나 DirectX 9.0 SDK (February 2005)를 마지막으로 이후부터
Windows SDK에 포함되기 시작하였다. 따라서 February 2005 이후 버전의 개발환경을 설정을 하려면 다른 방법을
사용해야만 한다.

기준 환경 : Windows 7, Visual Studio 2008 SP1

1. Microsoft SDKMicrosoft DirectX 를 다운로드 받는다.
2. Microsoft SDK 와 Microsoft DirectX 를 설치한다.
3. Visual Studio 2008에 포함파일(Include File)과 라이브러리 파일(Library File) 경로를 등록해 준다.

 Visual Studio 2008 메뉴에서 도구 < 옵션 < 프로젝트 및 솔루션 < VC++ 디렉토리에서
포함파일(Include File)을 선택한 후 아래의 경로를 추가해 준다.

설치된 Microsoft SDK 경로\Windows\v7.1\Samples\multimedia\directshow\baseclasses
설치된 Microsoft DirectX SDK 경로\Include
설치된 Microsoft SDK 경로\Windows\v7.1\Include

 라이브러리 파일(Library File)을 선택한 후 아래의 경로를 추가해 준다.

설치된 Microsoft DirectX SDK 경로\Lib\x86
설치된 Microsoft SDK 경로\Windows\v7.1\Lib

4. BaseClasses 빌드
 이전 버전의 DirectShow에서는 strmbasd.lib 파일이 함께 포함되어 있지만 Windows SDK로 옮겨진 후에는
이 파일을 등록된 라이브러리 디렉토리 안에서 찾을 수 없다. 따라서 아래 경로에 있는 BaseClasses 샘플을
빌드하여 라이브러리 디렉토리로 옮겨서 사용하여야만 한다.
 먼저 설치된 Microsoft SDK 경로\Windows\v6.0\Samples\Multimedia\DirectShow\BaseClasses 경로에
있는 프로젝트를 연다.

 Debug 모드로 빌드 후 아래와 같이 Debug 디렉토리 내 strmbasd.lib 파일이 생성된 것을 확인 할 수 있다.
Release 모드로 빌드한 경우 역시 Release 디렉토리 내 strmbase.lib 파일이 생성되어 있을 것이다.

 각각 두 파일의 용도는 서로 다르다. 디버그 모드에서 라이브러리를 링크할 때는 strmbasd.lib, 릴리즈 모드에서
라이브러리를  링크할 때는  strmbase.lib를 사용하면 된다.


 strmbasd.lib 파일과 strmbase.lib 파일을 "설치된 Microsoft SDK 경로\Windows\v6.0\Lib" 로 옮긴다.
2~3까지 과정은 VS 2008의 VC++ 모든 프로젝트에 해당되므로 한번만 작업해주면 된다.
저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

티스토리 툴바