DirectShow DirectShow 레퍼런스 인터페이스 IAMStreamConfig GetStreamCaps   [목차열람] [주소복사] [슬롯비우기]
IAMStreamConfig::GetStreamCaps
 
Microsoft DirectX 9.0

IAMStreamConfig::GetStreamCaps

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);
    }
}

참조

↑TOP