IMFTransform::P rocessOutput 메서드(mftransform.h)
현재 입력 데이터에서 출력을 생성합니다.
구문
HRESULT ProcessOutput(
[in] DWORD dwFlags,
[in] DWORD cOutputBufferCount,
[in, out] MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
[out] DWORD *pdwStatus
);
매개 변수
[in] dwFlags
_MFT_PROCESS_OUTPUT_FLAGS 열거형에서 0개 이상의 플래그의 비트 OR입니다.
[in] cOutputBufferCount
pOutputSamples 배열의 요소 수입니다. 값은 1 이상이어야 합니다.
[in, out] pOutputSamples
호출자가 할당한 MFT_OUTPUT_DATA_BUFFER 구조체 배열에 대한 포인터입니다. MFT는 이 배열을 사용하여 출력 데이터를 호출자에게 반환합니다.
[out] pdwStatus
_MFT_PROCESS_OUTPUT_STATUS 열거형에서 비트 OR(0개 이상의 플래그)를 받습니다.
반환 값
이 메서드는 HRESULT를 반환합니다. 가능한 값에는 다음 표에 있는 값이 포함되지만, 이에 국한되는 것은 아닙니다.
반환 코드 | Description |
---|---|
|
메서드가 성공했습니다. |
|
ProcessOutput 메서드는 이 메서드 호출을 기대하지 않는 비동기 MFT에서 호출되었습니다. |
|
하나 이상의 MFT_OUTPUT_DATA_BUFFER 구조체의 dwStreamID 멤버에 잘못된 스트림 식별자입니다. |
|
변환은 더 많은 입력 데이터를 받을 때까지 출력 데이터를 생성할 수 없습니다. |
|
출력 스트림에서 형식이 변경되었거나 새 기본 설정 형식이 있거나 새 출력 스트림이 있습니다. |
|
MFT의 하나 이상의 스트림에서 미디어 형식을 설정해야 합니다. |
설명
pOutputSamples 배열의 크기는 선택한 출력 스트림 수보다 크거나 같아야 합니다. 선택한 출력 스트림의 수는 총 출력 스트림 수에서 선택 취소된 스트림 수를 뺀 값과 같습니다. 스트림에 MFT_OUTPUT_STREAM_OPTIONAL 플래그가 있고 호출자가 미디어 형식을 설정하지 않거나 미디어 형식을 NULL로 설정하지 않으면 스트림이 선택 취소됩니다. 자세한 내용은 _MFT_OUTPUT_STREAM_INFO_FLAGS 열거형을 참조하세요.
이 메서드는 출력 샘플을 생성하고 이벤트를 생성할 수도 있습니다. 메서드가 성공하면 다음 조건 중 하나 이상이 true입니다.
- pOutputSamples 배열의 하나 이상의 샘플에는 출력 데이터가 포함되어 있습니다.
- pOutputSamples 배열의 하나 이상의 멤버에는 비어 있지 않은 이벤트 컬렉션이 포함되어 있습니다.
출력 버퍼
MFT는 MFT_OUTPUT_DATA_BUFFER 구조체의 pSample 멤버를 통해 스트림에 대한 출력 데이터를 반환합니다. 이 구조체 멤버는 미디어 샘플의 IMFSample 인터페이스에 대한 포인터입니다. ( 미디어 샘플을 참조하세요.) 미디어 샘플은 MFT의 할당 모델에 따라 호출자 또는 MFT에 의해 할당됩니다. 할당 모델을 찾으려면 IMFTransform::GetOutputStreamInfo를 호출하고 MFT_OUTPUT_STREAM_INFO 구조체의 dwFlags 멤버를 검사합니다.- MFT_OUTPUT_STREAM_PROVIDES_SAMPLES 플래그가 있는 경우 MFT는 미디어 샘플을 할당합니다.
- MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES 플래그가 있는 경우 호출자는 필요에 따라 미디어 샘플을 제공할 수 있습니다. pSample이 NULL인 경우 MFT는 미디어 샘플을 할당합니다.
- 이 두 플래그가 모두 없는 경우 호출자는 미디어 샘플을 할당해야 합니다.
호출자가 미디어 샘플을 할당하는 경우 미디어 샘플에는 출력 데이터를 저장할 수 있을 만큼 큰 버퍼가 포함되어야 합니다. 버퍼 요구 사항을 찾으려면 GetOutputStreamInfo를 호출합니다. MFT는 버퍼의 시작 부분에 출력 데이터를 기록하여 버퍼에 이미 있는 모든 데이터를 덮어씁니다.
MFT가 샘플을 할당하는 경우 MFT는 샘플에 대한 버퍼도 할당합니다.
MFT에 여러 출력 스트림이 있는 경우 스트림은 다른 속도로 출력을 생성할 수 있으므로 일부 스트림에는 출력이 있을 수 있지만 다른 스트림은 출력하지 않을 수 있습니다. 스트림이 출력을 생성하지 않은 경우 MFT는 해당 스트림에 대한 MFT_OUTPUT_DATA_BUFFER 구조체의 dwStatus 멤버에 MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE 플래그를 설정합니다. 이 경우 호출자가 pSample을 할당한 경우 샘플의 버퍼에 유효한 데이터가 포함되지 않습니다. 호출자가 pSample을 할당하지 않은 경우 MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE 플래그는 메서드가 반환된 후에도 pSample 이 여전히 NULL 임을 나타냅니다.
출력 스트림에 데이터가 없고 MFT에 반환할 이벤트가 없는 경우 ProcessOutput 은 MF_E_TRANSFORM_NEED_MORE_INPUT 반환합니다.
MFT는 ProcessOutput에 대한 단일 호출에서 스트림당 둘 이상의 샘플을 반환할 수 없습니다. ProcessOutput이 반환된 후 스트림에 사용할 수 있는 출력 데이터가 더 많은 경우 MFT는 해당 스트림에 대한 MFT_OUTPUT_DATA_BUFFER 구조체의 dwStatus 멤버에 MFT_OUTPUT_DATA_BUFFER_INCOMPLETE 플래그를 설정합니다.
MFT에 출력을 생성할 수 있는 충분한 데이터가 있는 경우 ProcessOutput 이 사용 가능한 모든 출력을 끌어올 수 있는 충분한 시간이 호출될 때까지 더 이상 입력 수락을 거부해야 합니다. ( 예외는 IMFTransform::GetOutputStreamInfo 메서드가 MFT_OUTPUT_STREAM_LAZY_READ 플래그를 반환하는 경우입니다. 일반적으로 여러 출력 스트림이 있는 MFT는 가능한 한 빨리 스트림에 대한 출력을 생성해야 하며 모든 스트림에 출력이 있을 때까지 기다리지 않아야 합니다.
대역 내 이벤트
MFT는 각 MFT_OUTPUT_DATA_BUFFER 구조체의 pEvents 멤버에 이벤트 개체 컬렉션을 반환할 수 있습니다. MFT는 컬렉션 개체와 이벤트를 모두 할당합니다.호출자에게 이벤트를 보내기 위해 MFT는 ProcessOutput 내에서 다음 단계를 수행합니다.
- MFCreateCollection을 호출하여 새 컬렉션 개체를 만듭니다.
- IMFCollection::AddElement를 호출하여 컬렉션에 하나 이상의 이벤트를 추가합니다.
- MFT_OUTPUT_DATA_BUFFER 구조체의 pEvents 멤버를 IMFCollection 포인터와 동일하게 설정합니다. MFT는 이 인터페이스에 대한 참조 수를 남깁니다. 호출자는 포인터를 해제해야 합니다.
ProcessOutput 메서드가 하나 이상의 이벤트와 0개의 출력 샘플을 반환하는 것이 유효합니다.
호출자는 MFT가 할당하는 모든 이벤트를 해제할 책임이 있습니다. 메서드가 반환되면 각 MFT_OUTPUT_DATA_BUFFER 구조체의 pEvents 멤버를 검사. 값이 NULL이 아닌 경우 호출자는 IMFCollection 인터페이스 포인터를 해제해야 합니다.
// Release the events that an MFT might allocate in IMFTransform::ProcessOutput().
void ReleaseEventCollection(DWORD cOutputBuffers, MFT_OUTPUT_DATA_BUFFER* pBuffers)
{
for (DWORD i = 0; i < cOutputBuffers; i++)
{
if (pBuffers[i].pEvents)
{
pBuffers[i].pEvents->Release();
pBuffers[i].pEvents = NULL;
}
}
}
MFT는 IMFMediaEventGenerator 인터페이스를 사용하여 대역 내 이벤트를 보내면 안 됩니다.
Stream 변경 내용
ProcessOutput 메서드는 출력 스트림에서 다음과 같은 변경 내용을 발생시킬 수 있습니다.- 출력 스트림의 삭제입니다. 스트림 삭제 신호를 표시하기 위해 MFT는 해당 스트림에 대한 MFT_OUTPUT_DATA_BUFFER 구조체의 dwStatus 멤버에 MFT_OUTPUT_DATA_BUFFER_STREAM_END 플래그를 설정합니다.
- 새 출력 스트림 만들기입니다. 새 출력 스트림을 알리기 위해 MFT는 pdwStatus 매개 변수에서 MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS 플래그를 설정합니다. 새 스트림은 삭제된 스트림과 동일한 스트림 식별자를 가질 수 있습니다.
- 출력 스트림의 형식 변경 형식 변경을 알리기 위해 MFT는 해당 스트림에 대한 MFT_OUTPUT_DATA_BUFFER 구조체의 dwStatus 멤버에 MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE 플래그를 설정합니다.
MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE 플래그는 출력 스트림에서 형식 변경 신호를 보냅니다. 이는 현재 미디어 형식이 유효하지 않거나 기본 설정 순서가 변경되어 보다 효율적인 형식을 사용할 수 있음을 의미할 수 있습니다. 후자의 경우 클라이언트가 원래 미디어 형식을 다시 설정할 수 있습니다. 무한 루프를 막기 위해 MFT는 다른 변경이 있을 때까지 MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE 플래그를 다시 설정해서는 안 됩니다. 또한 기본 설정 순서가 변경되었지만 현재 미디어 형식이 여전히 가장 선호되는 형식인 경우 이 플래그를 설정하지 마세요.
샘플 특성
입력 샘플에는 IMFAttributes 인터페이스를 통해 액세스되는 특성이 있을 수 있습니다. 특정 특성이 더 이상 적용되지 않는 한 모든 특성을 해당 출력 샘플에 복사해야 합니다. 특성 복사에 대한 책임은 다음과 같이 결정됩니다.- MFT의 MFPKEY_EXATTRIBUTE_SUPPORTED 속성 값이 VARIANT_TRUE 경우 MFT는 특성을 복사합니다.
- MFPKEY_EXATTRIBUTE_SUPPORTED 값이 VARIANT_FALSE 속성이 설정되지 않은 경우 클라이언트는 샘플 특성을 복사해야 합니다. 출력 샘플에서 MFT가 설정하는 특성을 덮어쓰지 마세요.
비동기 처리
이전 설명에서는 동기 처리 모델에 대해 설명합니다. 비동기 처리를 지원하려면 비동기 MFT를 참조하세요.요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2008 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | mftransform.h |
라이브러리 | Mfuuid.lib |