1. 2015.03.20 [DirectShow] FORMAT_VideoInfo2
  2. 2015.03.20 [DirectShow] SetProperties()에서 E_FAIL 발생

[DirectShow] FORMAT_VideoInfo2

Video Renderer와 연결은 되고 영상 출력이 되지 않았다

 

현재 작업중인 필터에서 output핀 타입을 input핀 타입과 동일하게 만들어서 영상을 출력하고 있었는데

변환 필터에서 Input으로 받은 FormatType VideoInfo2일 때

출력 핀의 미디어 FormatTypevideoInfo2 이면 영상 출력이 되지 않았다

 

처음에는 단순히  Input FormatType VideoInfo2일 때 필터 연결을 해서 발생한 문제인줄 알았는데,

Input Format Type VideoInfo2이더라도, output mtOut->FormatType() 을 체크하지 않으면

Format TypevideoInfo로 변환되고 정상적으로 출력 되었다

 

HRESULT CEZrgb24::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)

{

           HRESULT hr;     

           hr = CheckInputType(mtIn);

           if (FAILED(hr))

                     return hr;

 

           //// format must be a VIDEOINFOHEADER

           //if (*mtOut->FormatType() != FORMAT_VideoInfo2)//FORMAT_VideoInfo)

           //        return E_INVALIDARG;

 

           //formats must be big enough

           if (mtIn->FormatLength() < sizeof(VIDEOINFOHEADER) || mtOut->FormatLength() < sizeof(VIDEOINFOHEADER))

                     return E_INVALIDARG;

 

           return S_OK;

}

 




-       Input 포맷 타입은 FORMAT_VIDEOINFO2


-       Output 포맷 타입은 FORMAT_VIDEOINFO 

 

videoInfo 타입과 videoInfo2 타입이 무엇인지 확인해보았다

 

videoInfo2

https://msdn.microsoft.com/en-us/library/windows/desktop/dd407324(v=vs.85).aspx

 

VMR-7, VMR9 VIDEOINFOHEADER2를 즉시 제공한다 VMR 에 접속할 때 최상의 포맷을 제시한다. 이전 Video Renderer filter

VIDEOINFOHEADER2를 지원하지 않는다.

Video Renderer filter에서 VIDEOINFOHEADER2를 사용하기 위해서는 Overlay Mixer를 그래프 안에 삽입해야 한다.

 

1. decoder filter output 핀에 미디어 타입을 나열한다(EnumMediaType 메소드 이용)

2. 나열된 배열에서 첫 번째 미디어 타입을 확인한다

3. 포맷 타입이 FORMAT_VideoInfo2일 경우 output pin Overlay Mixer에 접속한다  그리고 나서 Overlay Mixer video renderer에 접속 한다

 

 

내용을 읽어보니까 그냥 Video Renderer Filter에서 videoInfo2 타입을 사용을 하려면

overlay Mixer 필터를 통해서 영상을 출력하라는 것 같다

 

아니면 VMR9을 쓰던가

 

하….

근데 VideoInfo2Overlay Mixer 연결도 안되고,

Video Mixing Renderer9으로 연결하면 연결은 되는데 화면이 안나온다

 

'media > directshow' 카테고리의 다른 글

[DirectShow] SetProperties()에서 E_FAIL 발생  (0) 2015.03.20

[DirectShow] SetProperties()에서 E_FAIL 발생

변환 필터 제작 중

 

INPUT 핀 타입을 RGB에서 YUY2로 변경 하였다

Current Media Type

Majortype

MEDIATYPE_Video

Subtype

MEDIASUBTYPE_YUY2

formattype

FORMAT_VIDEOINFO2

 

 

기존 방식과 동일하게 input으로 받는 핀의 정보를 output 핀 형식과 동일하게 사용하려는데,

 

DecideBufferSize 함수에서

할당자를 설정하는 부분인 setProperties에서 계속 E_FAIL을 반환하여

Video Renderer Output 핀 연결이 되지 않았다

 

나랑 같은 문제여서 참고함

http://microsoft.public.win32.programmer.directx.video.narkive.com/8rcTkAL3/can-t-get-yv12-media-type-to-negotiate-in-transform-filter

 

CheckTransform 함수에서 Input , output 핀의 FormatLength를 체크 함?

이걸로 문제가 해결 됨… 왜지??

 

-       Old

HRESULT CheckTransForm(const CMediaType *mtIn, const CMediaType *mtOut)

{

    if (*mtIn == *mtOut)

   return S_OK;

 return E_FAIL;

} 

 

- Now

HRESULT CheckTransForm(const CMediaType *mtIn, const CMediaType *mtOut)

{

      HRESULT hr;

hr = CheckInputType(mtIn);

if (FAILED(hr))

return hr;


// format must be a VIDEOINFOHEADER

if (*mtOut->FormatType() != FORMAT_VideoInfo)

return E_INVALIDARG;


//formats must be big enough

if (mtIn->FormatLength() < sizeof(VIDEOINFOHEADER) || mtOut->FormatLength() < sizeof(VIDEOINFOHEADER))

return E_INVALIDARG;


return S_OK; 

}


'media > directshow' 카테고리의 다른 글

[DirectShow] FORMAT_VideoInfo2  (0) 2015.03.20