【发布时间】:2017-01-14 05:27:14
【问题描述】:
媒体基础变换对象 (MFT) 可以实现输出缓冲区分配模型,其中缓冲区由 MFT 对象在内部分配。
如果是这种情况,内部分配的缓冲区将通过传递给IMFTransform::ProcessOutput() 方法的MFT_OUTPUT_DATA_BUFFER 结构的pSample 成员返回。
来自MFT_OUTPUT_DATA_BUFFER structure 文档:
typedef struct _MFT_OUTPUT_DATA_BUFFER {
DWORD dwStreamID;
IMFSample *pSample;
DWORD dwStatus;
IMFCollection *pEvents;
} MFT_OUTPUT_DATA_BUFFER;
pSample
指向
IMFSample接口的指针。在拨打ProcessOutput之前, 将此成员设置为等于有效的IMFSample指针或NULL。看 备注了解更多信息。
来自IMFTransform::ProcessOutput 文档:
输出缓冲区
MFT 通过
pSample成员返回流的输出数据MFT_OUTPUT_DATA_BUFFER结构。该结构成员是 指向媒体样本的IMFSample接口的指针。 (见媒体 样本。)媒体样本由调用者或 MFT,取决于 MFT 的分配模型。 查找分配 模型,请致电IMFTransform::GetOutputStreamInfo并检查dwFlagsMFT_OUTPUT_STREAM_INFO结构的成员
...
如果
pSample是NULL并且dwFlags不包含MFT_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER,MFT提供样本 为输出数据。 MFT 设置pSample指向样本 它提供的。 MFT 可以分配新样本或重新使用 输入样本。
文档没有提到在这种情况下返回的IMFSample 接口是否应该被释放。 似乎情况并非如此,因为文档非常明确地表明任何事件都通过相同的方式返回struct 应该由调用者释放。
来自MFT_OUTPUT_DATA_BUFFER structure 文档:
pEvents
在调用
ProcessOutput之前,将此成员设置为NULL。输出时, MFT 可能会将此成员设置为有效的IMFCollection接口指针。指针表示一个集合,其中包含 零个或多个事件。要获取每个事件,请致电IMFCollection::GetElement并查询返回的IUnknown指针 对于IMFMediaEvent接口。 当ProcessOutput方法 返回,调用者负责释放IMFCollection如果指针不是NULL,则指针。
有人可以确认返回的IMFSample接口是否应该释放?
我认为,如果我们不应该释放返回的接口,则应该明确记录,因为这与我们使用完后释放接口的既定 COM 方式背道而驰。
【问题讨论】:
-
我确认文档不明确...这种宽松的情况会造成有关 COM 和释放资源的架构问题。
标签: c++ memory-management ms-media-foundation