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。 可能的值包括 (但不限於) 下表中的這些值。

傳回碼 描述
S_OK
此方法已成功。
E_UNEXPECTED
ProcessOutput 方法是在未預期此方法呼叫的異步 MFT 上呼叫。
MF_E_INVALIDSTREAMNUMBER
一或多個MFT_OUTPUT_DATA_BUFFER結構之 dwStreamID 成員中的數據流標識碼無效。
MF_E_TRANSFORM_NEED_MORE_INPUT
轉換在收到更多輸入數據之前,無法產生輸出數據。
MF_E_TRANSFORM_STREAM_CHANGE
格式在輸出數據流上已變更,或有新的慣用格式,或有新的輸出數據流。
MF_E_TRANSFORM_TYPE_NOT_SET
您必須在 MFT 的一或多個資料流上設定媒體類型。
 
注意 如果您要將 DirectX 媒體物件 (DMO) 轉換成 MFT,請注意 ,S_FALSE 不是 IMFTransform::P rocessOutput 的有效傳回碼,與 IMediaObject::P rocessOutput 方法不同。
 

備註

pOutputSamples 陣列的大小必須等於或大於選取的輸出數據流數目。 選取的輸出數據流數目等於輸出數據流總數減去 已取消選取 數據流的數目。 如果數據流具有 MFT_OUTPUT_STREAM_OPTIONAL 旗標,而且呼叫端不會 (設定媒體類型,或將媒體類型設定為 NULL) ,則會取消選取數據流。 如需詳細資訊,請參閱 _MFT_OUTPUT_STREAM_INFO_FLAGS 列舉。

這個方法會產生輸出範例,也可以產生事件。 如果方法成功,則至少符合下列其中一個條件:

  • pOutputSamples 陣列中的一或多個範例包含輸出數據。
  • pOutputSamples 陣列的一或多個成員包含非空的事件集合。
如果在包含 Mftransform.h 之前定義 MFT_UNIQUE_METHOD_NAMES ,這個方法會重新命名 為 MFTProcessOutput。 請參閱 建立混合式 DMO/MFT 物件

輸出緩衝區

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旗標 存在,則呼叫端可以選擇性地提供媒體範例。 如果 pSampleNULL,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 內執行下列步驟:

  1. 呼叫 MFCreateCollection 來建立新的集合物件。
  2. 呼叫 IMFCollection::AddElement,將一或多個事件新增至集合。
  3. 將 MFT_OUTPUT_DATA_BUFFER 結構的 pEvents 成員 設定 為等於 IMFCollection 指標。 MFT 會在此介面上留下參考計數;呼叫端必須釋放指標。
事件沒有時間戳。 呼叫端應該先處理事件,再處理輸出範例。 換句話說,事件發生在數據流中,緊接在先前呼叫 ProcessOutput 之後,以及從目前 ProcessOutput 呼叫傳回的任何輸出樣本之前。

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旗標。
這三個動作都可能是單一呼叫 ProcessOutput 所產生。 呼叫端必須依照此處所列的順序來響應它們,先刪除再新增,然後設定格式變更。

MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE旗標會發出輸出數據流上的格式變更訊號。 這可能表示目前的媒體類型已失效,或喜好設定順序已變更,而且有更有效率的格式可供使用。 在後者的情況下,用戶端可能會重新設定原始媒體類型。 若要防範無限迴圈,MFT 不應該再次設定 MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE 旗標,直到有另一項變更為止。 此外,如果喜好設定順序變更,但目前的媒體類型仍是最慣用的類型,請避免設定此旗標。

範例屬性

輸入範例可能有透過 IMFAttributes 介面存取的屬性。 除非不再套用特定屬性,否則所有屬性都應該複製到對應的輸出範例中。 複製屬性的責任取決於: 如需範例屬性的清單,請參閱 範例屬性

異步處理

上述備註描述 同步 處理模型。 若要支援異步處理,請參閱 異步 MFT

規格需求

需求
最低支援的用戶端 Windows Vista [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2008 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 mftransform.h
程式庫 Mfuuid.lib

另請參閱

IMFTransform

媒體基礎轉換