DirectShow DirectShow 레퍼런스 인터페이스 IAMStreamConfig GetStreamCaps [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
GetStreamCaps 메서드는, 포맷 기능 세트를 얻어온다.
구문
HRESULT GetStreamCaps(
int iIndex,
AM_MEDIA_TYPE **pmt,
BYTE *pSCC
);
파라미터
iIndex
[in] 얻어온다 포맷 기능을 지정한다. 이것은 제로로부터 인덱스 된다. 핀이 지원 하는 기능의 수를 얻어오려면,IAMStreamConfig::GetNumberOfCapabilities 메서드를 호출한다.
pmt
[out] AM_MEDIA_TYPE 구조체의 포인터 주소. 이 메서드는 구조체를 할당해 미디어 타입을 묻는다.
pSCC
[out] 호출 바탕으로야는 할당된 바이트 배열의 포인터. 비디오의 경우는,VIDEO_STREAM_CONFIG_CAPS 구조체를 사용한다. 오디오의 경우는,AUDIO_STREAM_CONFIG_CAPS 구조체를 사용한다. 필요한 배열의 사이즈를 조사하려면 ,GetNumberOfCapabilities 메서드를 호출한다.
반환값
HRESULT 값을 돌려준다. 가능한 값은 다음과 같다.
반환 코드 | 설명 |
S_FALSE | 지정된 인덱스의 값이 너무 크다. |
S_OK | 성공. |
E_INVALIDARG | 무효인 인덱스. |
E_OUTOFMEMORY | 메모리 부족. |
E_POINTER | NULL 포인터값. |
VFW_E_NOT_CONNECTED | 입력 핀이 접속되지 않다. |
주의
이 메서드는, 이하의 2 개의 정보를 돌려준다.
출력 핀이 이 포맷을 사용하도록(듯이) 설정하려면 ,IAMStreamConfig::SetFormat 메서드를 호출해,pmt 의 값을 건네준다.
SetFormat 를 호출하기 전에,pSCC 의 정보를 사용해,pmt 내의 AM_MEDIA_TYPE 구조체를 수정할 수 있다. 예를 들어, 오디오 핀은, 기존의 미디어 타입으로서 44 kHz, 16 비트 스테레오등을 pmt 인수에 돌려준다. AUDIO_STREAM_CONFIG_CAPS 구조체에 돌려받는 값에 근거해,SetFormat 를 호출하기 전에, 이 포맷을 8 비트 단청의 등에 변경할 수 있다.
이 메서드는,pmt 인수에 돌려받는 AM_MEDIA_TYPE 구조체의 메모리를 할당한다. 호출원래는, 포맷 블록을 포함해 메모리를 릴리즈 할 필요가 있다. base class 라이브러리의 헬퍼-함수 DeleteMediaType 를 사용할 수 있다. 호출원래는,pSCC 인수에 메모리를 할당할 필요가 있다.
몇개의 압축 필터에서는, 필터의 입력 핀이 접속되지 않은 경우, 이 메서드는 실패한다.
필터 개발자의 주의점 : 이 메서드의 처리의 더 자세한 정보는, 「캡춰 포맷과 압축 포맷의 공개」를 참조할것.
샘플 코드
이하의 샘플 코드는, 비디오 출력 핀상에서 지원 되는 최초의 포맷 (인덱스 제로)을 얻어온다. 그 후, 핀이 그 포맷에 최소의 출력 사이즈를 사용하도록(듯이) 설정한다. 이것을 실행하기 위해서, 포맷 블록의 BITMAPINFOHEADER 구조체를 수정해 새로운 폭과 높이를 설정해, 새로운 샘플 사이즈에 AM_MEDIA_TYPE 구조체의 lSampleSize 멤버를 설정한다. 샘플 사이즈를 결정하는 요인의 1 개는, 미디어 서브 타입에 의해 정해지는 비트 깊이이다. (간략화를 위해, 이 예에서는, UYVY 포맷의 경우만을 나타낸다. 또, 핀이 비디오 출력을 생성하고 있는 것을 호출원이 이미 인식하고 있는 것으로 한다. )
int iCount, iSize;
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmt;
hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);
if (sizeof(scc) != iSize)
{
// 이것은 예상하고 있던 구조체는 아니다.
return E_FAIL;
}
// 최초의 포맷을 얻어온다.
hr = pConfig->GetStreamCaps(0, &pmt, reinterpret_cast<BYTE*>(&scc));
if (hr == S_OK)
{
// VIDEOINFOHEADER 와 UYVY 인가.
if (pmt->formattype == FORMAT_VideoInfo &&
pmt->subtype == MEDIASUBTYPE_UYVY)
{
// 최소 출력 사이즈를 찾아낸다.
LONG width = scc.MinOutputSize.cx;
LONG height = scc.MinOutputSize.cy;
LONG cbPixel = 2; // UYVY 의 픽셀 근처의 바이트수.
// 포맷 블록을 수정한다.
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
pVih->bmiHeader.biWidth = width;
pVih->bmiHeader.biHeight = height;
// 샘플 사이즈와 이미지 사이즈를 설정한다.
// 이미지의 폭을 DWORD 경계에 말다.
pmt->lSampleSize = pVih->bmiHeader.biSizeImage =
((width + 3) & ~3) * height * cbPixel;
// 여기서, 포맷을 설정한다.
hr = pConfig->SetFormat(pmt);
if (FAILED(hr))
{
MessageBox(NULL, TEXT("SetFormat Failed\n"), NULL, MB_OK);
}
DeleteMediaType(pmt);
}
}
참조