C++ 我是否应该释放内部分配的MFT输出缓冲区的返回IMFSample? 媒体基础转换对象(MFT)可以实现输出缓冲区分配模型,其中缓冲区由MFT对象内部分配。
如果是这种情况,内部分配的缓冲区将通过传递给C++ 我是否应该释放内部分配的MFT输出缓冲区的返回IMFSample? 媒体基础转换对象(MFT)可以实现输出缓冲区分配模型,其中缓冲区由MFT对象内部分配。,c++,memory-management,ms-media-foundation,C++,Memory Management,Ms Media Foundation,如果是这种情况,内部分配的缓冲区将通过传递给imfttransform::ProcessOutput()方法的MFT\u OUTPUT\u DATA\u buffer结构的pSample成员返回 从文件中: typedef struct _MFT_OUTPUT_DATA_BUFFER { DWORD dwStreamID; IMFSample *pSample; DWORD dwStatus; IMFCollection *pEvents;
imfttransform::ProcessOutput()
方法的MFT\u OUTPUT\u DATA\u buffer
结构的pSample
成员返回
从文件中:
typedef struct _MFT_OUTPUT_DATA_BUFFER {
DWORD dwStreamID;
IMFSample *pSample;
DWORD dwStatus;
IMFCollection *pEvents;
} MFT_OUTPUT_DATA_BUFFER;
pSample
指向IMFSample
接口的指针。调用ProcessOutput
之前,
将此成员设置为有效的IMFSample
指针或NULL
。看见
有关更多信息,请参见备注
从文件中:
typedef struct _MFT_OUTPUT_DATA_BUFFER {
DWORD dwStreamID;
IMFSample *pSample;
DWORD dwStatus;
IMFCollection *pEvents;
} MFT_OUTPUT_DATA_BUFFER;
输出缓冲区
MFT通过pSample
成员返回流的输出数据
MFT_输出_数据_缓冲区的结构。此结构件是一个
指向媒体样本的IMFSample
接口的指针。(见媒体)
示例。)媒体示例由调用者或
MFT,取决于MFT的分配模型。查找分配
模型,调用IMFTTransform::GetOutputStreamInfo并检查
dwFlags
MFT\U输出流信息结构的成员
如果pSample
为NULL
且dwFlags
不包含
MFT\u处理\u输出\u丢弃\u当\u没有缓冲区时
,MFT提供一个样本
对于输出数据。MFT将pSample
设置为指向样本
它所提供的。MFT可以分配新样本或重复使用
输入样本
文档没有提到在这种情况下是否应该释放返回的IMFSample
接口。似乎不是这样,因为文档非常明确,调用方应该释放通过同一结构返回的任何事件
从文件中:
typedef struct _MFT_OUTPUT_DATA_BUFFER {
DWORD dwStreamID;
IMFSample *pSample;
DWORD dwStatus;
IMFCollection *pEvents;
} MFT_OUTPUT_DATA_BUFFER;
pEvents
在调用ProcessOutput
之前,请将此成员设置为NULL
。在产出方面,
MFT可能会将此成员设置为有效的IMFCollection
接口指针。指针表示包含
零个或多个事件。要获取每个事件,请调用
IMFCollection::GetElement
并查询返回的IUnknown
指针
用于IMFMediaEvent
接口当处理输出
方法
返回,调用方负责释放IMFCollection
如果指针不是NULL
有人能确认返回的IMFSample
接口是否应该释放吗?
我认为,如果我们不应该释放返回的接口,它应该被明确地记录下来,因为这与我们使用完接口后释放接口的既定COM方式背道而驰。如果MFT使用非空值初始化指针,则调用方负责释放样本(与调用者分配的缓冲区相反——在这种情况下,MFT使用它,但不需要在结构中添加它) 下面的代码片段适用于所有三种型号:
- 如果MFT_输出_流_提供_样本标志存在,则MFT分配媒体样本
- 如果存在MFT_输出_流_可以提供_样本标志,则调用者可以选择提供媒体样本。如果pSample为NULL,则MFT将分配媒体样本
- 如果这两个标志都不存在,则调用者必须分配媒体样本
CComPtr示例;
//pSample是否为空
MFT_输出_数据_缓冲区;
Buffer.pSample=pSample.Detach();
// ...
const HRESULT nResult=ptTransform->ProcessOutput(…,&Buffer,…);
附加(Buffer.pSample);
//pSample保存一个有效的正确引用的指针
//无需使用下面的Buffer.pSample
我确认文档不清楚……这种允许的情况会在COM和资源发布方面产生架构问题。