IMFTransform::P rocessInput 方法 (mftransform.h)
将数据传送到此媒体基础转换 (MFT) 上的输入流。
语法
HRESULT ProcessInput(
[in] DWORD dwInputStreamID,
[in] IMFSample *pSample,
[in] DWORD dwFlags
);
参数
[in] dwInputStreamID
输入流标识符。 若要获取流标识符列表,请调用 IMFTransform::GetStreamIDs。
[in] pSample
指向输入示例的 IMFSample 接口的指针。 该示例必须至少包含一个包含有效输入数据的媒体缓冲区。
[in] dwFlags
保留。 必须为零。
返回值
该方法返回 HRESULT。 可能的值包括(但并不限于)下表中的项。
返回代码 | 说明 |
---|---|
|
方法成功。 |
|
无效的参数。 |
|
流标识符无效。 |
|
输入示例需要有效的采样持续时间。 若要设置持续时间,请调用 IMFSample::SetSampleDuration。
某些 MCT 要求输入样本具有有效的持续时间。 某些 MCT 不需要采样持续时间。 |
|
输入示例需要时间戳。 若要设置时间戳,请调用 IMFSample::SetSampleTime。
某些 MMFT 要求输入样本具有有效的时间戳。 某些 MCT 不需要时间戳。 |
|
转换目前无法处理更多输入。 |
|
媒体类型未在一个或多个流上设置。 |
|
DirectX 视频加速 (DXVA) 不支持媒体类型。 已启用 DXVA 的解码器可能会返回此错误代码。 |
注解
在大多数情况下,如果 方法成功,MFT 将存储示例,并在 IMFSample 指针上保留引用计数。 在 MFT 发布示例之前,请勿重复使用示例。 但是,MFT 可能会将示例数据复制到新的缓冲区中,而不是存储示例。 在这种情况下,MFT 应在 IMFTransform::GetInputStreamInfo 方法中设置MFT_INPUT_STREAM_DOES_NOT_ADDREF标志。
如果 MFT 已有足够的输入数据来生成输出示例,则它不接受新的输入数据, ProcessInput 将返回 MF_E_NOTACCEPTING。 此时,客户端应通过执行以下操作之一来清除挂起的输入数据:
- 通过调用 IMFTransform::P rocessOutput 生成新输出。
- 使用 MFT_MESSAGE_COMMAND_FLUSH 消息调用 IMFTransform::P rocessMessage来 刷新输入数据。
MFT 可以在 ProcessInput 方法中处理输入数据。 但是,大多数 MMFT 会等到客户端调用 ProcessOutput。
客户端在所有流上设置有效的媒体类型后,MFT 应始终处于以下两种状态之一:能够接受更多输入或能够生成更多输出。 它绝不应同时处于这两种状态或两种状态。 MFT 只应接受至少一个输出示例所需的输入,此时 ProcessInput 返回 MF_E_NOTACCEPTING。 当 ProcessInput 返回 MF_E_NOTACCEPTING时,客户端可以假定 MFT 已准备好生成输出。
如果 MFT 在输入数据中遇到非致命错误,它只需删除数据,并在获取更多输入数据时尝试恢复。 为了请求更多输入数据,MFT 从IMFTransform::P rocessOutput 方法返回MF_E_TRANSFORM_NEED_MORE_INPUT。 如果 MFT 删除了任何数据,则应在下一个输出示例中设置 MFSampleExtension_Discontinuity 属性属性,以通知调用方数据流中存在间隙。
如果在包括 mftransform.h 之前定义了 MFT_UNIQUE_METHOD_NAMES ,则此方法将重命名为 MFTProcessInput。 请参阅 创建混合 DMO/MFT 对象。
异步处理
前面的说明描述了 同步 处理模型。 若要支持异步处理,请参阅 异步 MCT。要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2008 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | mftransform.h |
Library | Mfuuid.lib |