自定义directshow中的内存分配机制

在Wince6.0上的DM365平台,使用DirectShow进行音视频录制时,由于硬件编码器对内存要求,需要定制内存分配器。本文介绍了如何实现自定义内存分配器,包括修改CMemAllocator的Alloc和ReallyFree函数,并在CBaseInputPin::GetAllocator中插入自定义的内存分配器实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     最近一直在DM365平台上进行音视频录制的开发工作, 由于系统为wince6.0,所以采用了directshow实现。视频编码模块封装成单独的filter, 由于硬编码器的输入缓冲区要求物理地址连续(TI提供了一个叫CMEM的模块)这就需要重新实现directshow的内存管理机制。

 

一、实现自己的内存分配器

 

1.  内存管理的几个相关接口及类有:

  1).IMemAllocator
  2).CBaseAllocator
  3).CMemAllocator

 

2.  实际的内存分配相关函数是在CMemAllocator中实现,涉及3个函数:
1).HRESULT CMemAllocator::Alloc(void), 此函数进行内存分配,代码如下:


2).void CMemAllocator::Free(void),此致函数体为空,有一个注释如下
// in our case, we keep the memory until we are deleted, so
// we do nothing here. The memory is deleted in the destructor by
// calling ReallyFree()
3).void CMemAllocator::ReallyFree(void),这才是真正的内存释放函

 

3. 要实现自己的MemAllocator,只需要对CMemAllocator中的,Alloc、RellyFree函数中内存分配与释放进行修改。由于RellyFree不是虚函数,不能继承CmemAllocator。我们可以从CBaseAllocator继承一个类,其实现参考CMemAllocator。

 

二、自定义内存分配器的调用

1.directshow中内存分配器的调用流程

   

2. 从上述调用过程可以发现,我们只需要重新实现CBaseInputPin::GetAllocator即可,我的实现如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值