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

IAsyncReader::Request

Request 메서드는, 비동기 데이터 요구를 큐에 넣는다.

구문

HRESULT Request(
  IMediaSample *pSample,
  DWORD_PTR dwUser
);

파라미터

pSample

호출원이 제공하는 미디어 샘플의 IMediaSample 인터페이스에의 포인터.

dwUser

[in] 요구가 완료했을 때에 돌려주어지는 임의의 값을 지정한다.

반환값

HRESULT 값을 돌려준다. 가능한 값은 다음과 같다.

귀가 코드 설명
S_OK 성공.
VFW_E_BADALIGN 버퍼는 올바르고 alignment되지 않다.
VFW_E_SAMPLE_TIME_NOT_SET 샘플에 타임 스탬프가 설정되지 않았다.
VFW_E_WRONG_STATE 핀이 플래시 하고 있다.
HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) 요구된 시작 위치는 파일의 말미를 넘고 있다.
E_OUTOFMEMORY 메모리 부족.

주의

이 메서드를 호출하기 전에, 핀의 할당자로부터 미디어 샘플을 얻어온다 일. 요구하고 있는 바이트 오프셋(offset) (최초와 마지막 바이트를 포함해 10,000,000 을 건 값)로 샘플에 타임 스탬프를 설정한다. 바이트 오프셋(offset)는, 스트림의 시작으로부터의 상대값이다.

시작 위치와 정지 위치는, 핀이 접속되었을 때에 결정할 수 있던 alignment와 일치하고 있는 것. 일치하지 않는 경우는, 메서드는 VFW_E_BADALIGN 를 돌려준다. 합의한 alignment가 스트림의 실제의 alignment보다 엉성할 때는, 정지 위치는 실제의 시간폭을 넘는 경우가 있다. 그 경우, 메서드는 정지 위치를 실제의 alignment에 말다.

기술적으로는 COM 예 위반이지만, 호출원래는, 미처리의 참조 카운트를 샘플에 남길 필요가 있다. Request 메서드는,AddRef 또는 Release 를 호출하지 않기 때문에, 샘플을 액티브하게 보관 유지해 두기 위해서(때문에)는, 참조 카운트가 필요하다.

요구가 완료하기 전에, 호출해 원래로 제어가 되돌려진다. 요구를 대기하려면 ,IAsyncReader::WaitForNext 메서드를 호출하는 것. 요구가 미처리 때는, 원의 미디어 샘플을 재이용해서는 안 된다. WaitForNext 메서드는, 원의 샘플에의 포인터를 돌려준다. 요구가 성공하면(자), 샘플에는 요구된 데이터가 포함된다. WaitForNext 메서드도,dwUser 인수로 지정된 값을 돌려준다. 호출원래는, 이 값을 사용해 샘플을 식별할 수 있다.

샘플 코드

이하의 예는, 입력 핀이 요구를 큐에 넣기 위해서(때문에) 사용할 수 있는 헬퍼-함수를 나타낸 것이다.

CMyPin::QueueSample(long cbFirst, long cbLast, DWORD dwuser)
{
    IMediaSample* pSample;
    HRESULT hr = m_pAlloc->GetBuffer(&pSample, NULL, NULL, 0);
    if (FAILED(hr)) { return hr; }

    LONGLONG tStart = cbFirst * 10000000, tStop = cbLast * 10000000;
    pSample->SetTime(&tCurrent, &tStopThis);
    hr = m_pReader->Request(pSample, dwuser);
    if (FAILED(hr))
    {
        pSample->Release();
    }
    return hr;
}

참조

↑TOP