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列舉中零個或多個旗標的位 OR。
[in] cOutputBufferCount
pOutputSamples 陣列中的項目數目。 此值必須至少為 1。
[in, out] pOutputSamples
呼叫端所配置 之MFT_OUTPUT_DATA_BUFFER 結構的陣列指標。 MFT 會使用此陣列,將輸出資料傳回給呼叫端。
[out] pdwStatus
從_MFT_PROCESS_OUTPUT_STATUS列舉接收零個或多個旗標的位 OR。
傳回值
方法會傳回 HRESULT。 可能的值包括 (但不限於) 下表中的這些值。
傳回碼 | 描述 |
---|---|
|
此方法已成功。 |
|
ProcessOutput 方法是在未預期此方法呼叫的異步 MFT 上呼叫。 |
|
一或多個MFT_OUTPUT_DATA_BUFFER結構之 dwStreamID 成員中的數據流標識碼無效。 |
|
轉換在收到更多輸入數據之前,無法產生輸出數據。 |
|
格式在輸出數據流上已變更,或有新的慣用格式,或有新的輸出數據流。 |
|
您必須在 MFT 的一或多個資料流上設定媒體類型。 |
備註
pOutputSamples 陣列的大小必須等於或大於選取的輸出數據流數目。 選取的輸出數據流數目等於輸出數據流總數減去 已取消選取 數據流的數目。 如果數據流具有 MFT_OUTPUT_STREAM_OPTIONAL 旗標,而且呼叫端不會 (設定媒體類型,或將媒體類型設定為 NULL) ,則會取消選取數據流。 如需詳細資訊,請參閱 _MFT_OUTPUT_STREAM_INFO_FLAGS 列舉。
這個方法會產生輸出範例,也可以產生事件。 如果方法成功,則至少符合下列其中一個條件:
- 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 flag.) 一般情況下,具有多個輸出數據流的 MFT 應該會儘快產生數據流的輸出,而不要等待所有數據流都有輸出。
頻內事件
MFT 可以傳回每個MFT_OUTPUT_DATA_BUFFER結構之 pEvents 成員中的事件物件集合。 MFT 會配置集合物件和事件。若要將事件傳送給呼叫端,MFT 會在 ProcessOutput 內執行下列步驟:
- 呼叫 MFCreateCollection 來建立新的集合物件。
- 呼叫 IMFCollection::AddElement,將一或多個事件新增至集合。
- 將 MFT_OUTPUT_DATA_BUFFER 結構的 pEvents 成員 設定 為等於 IMFCollection 指標。 MFT 會在此介面上留下參考計數;呼叫端必須釋放指標。
ProcessOutput 方法可以傳回一或多個事件和零個輸出範例。
呼叫端負責釋放 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 |