Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否应该释放内部分配的MFT输出缓冲区的返回IMFSample? 媒体基础转换对象(MFT)可以实现输出缓冲区分配模型,其中缓冲区由MFT对象内部分配。_C++_Memory Management_Ms Media Foundation - Fatal编程技术网

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将分配媒体样本
  • 如果这两个标志都不存在,则调用者必须分配媒体样本
请注意,文档中没有提到调用方提供示例指针,MFT将其替换为自己的示例指针的场景

(尽管代码并不完美,只是引用计数的一个示例;如果存在样本是调用方的先验信息,那么当然不需要执行附加/分离操作)

CComPtr示例;
//pSample是否为空
MFT_输出_数据_缓冲区;
Buffer.pSample=pSample.Detach();
// ...
const HRESULT nResult=ptTransform->ProcessOutput(…,&Buffer,…);
附加(Buffer.pSample);
//pSample保存一个有效的正确引用的指针
//无需使用下面的Buffer.pSample

我确认文档不清楚……这种允许的情况会在COM和资源发布方面产生架构问题。