各位大侠:请问DirectShow中关于内存的一个奇怪有关问题
各位大侠:请教DirectShow中关于内存的一个奇怪问题
各位大侠:
最近我在做一个监控应用,当切换摄像头预览捕获的图像时,释放Graph并重建,发现其中部分内存并不回收并且累计应用程序使用空间越来越大.经过多次调试,发现只要不Run就没有问题,或者其中捕获图像的Filter(SampleGrabber)不加入也没有大的问题.
其代码如下:
class TestFilter
{
public:
TestFilter();
~TestFilter();
private:
CComPtr <IGraphBuilder> m_pGB;
CComPtr <IMediaControl> m_pMC;
CComPtr <IMediaEventEx> m_pME;
CComPtr <IPin> m_pVidOutPin;
CComPtr <IBaseFilter> m_pDF;
CComPtr <IBaseFilter> m_pSampleGrabberFilter;
CComPtr <IBaseFilter> m_pRenderFilter;
CComPtr <ISampleGrabber> m_pSamGrabber;
CComPtr <IPin> m_pGrabberInput;
CComPtr <IPin> m_pGrabberOutput;
CComPtr <IPin> m_pRenderInputPin;
BOOL BindVFilter(INT iDeviceId,IBaseFilter **pFilter);
void DelMediaType(AM_MEDIA_TYPE *pMt);
HRESULT InitVideoWnd(HWND hWnd,INT iWidth,INT iHeight);
void SetCrossBar(void);
void CloseInterface(void);
void Init();
};
构造函数调用Init()完成初始化和Run(),析构函数Stop和释放对象.
void TestFilter::Init(void)
{
AM_MEDIA_TYPE amt;
HRESULT hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void **)&m_pGB);
hr=CoCreateInstance(CLSID_NullRenderer,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(LPVOID*)&m_pRenderFilter);
hr=CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(LPVOID*)&m_pSampleGrabberFilter);
......
hr=m_pSampleGrabberFilter-> QueryInterface(IID_ISampleGrabber,(void**)&m_pSamGrabber);
ZeroMemory(&amt,sizeof(AM_MEDIA_TYPE));
amt.majortype =MEDIATYPE_Video;
amt.subtype =MEDIASUBTYPE_RGB32;
amt.formattype=FORMAT_VideoInfo;
hr=m_pSamGrabber-> SetMediaType(&amt);
hr=m_pGB-> QueryInterface(IID_IMediaControl,(void**)&m_pMC);
hr=m_pGB-> QueryInterface(IID_IMediaEventEx,(void**)&m_pME);
if (BindVFilter(g_selectcap,&m_pDF)) // bind通过全局变量g_selectcap选定的摄像头
return;
hr=m_pGB-> AddFilter(m_pDF,L "VSource ");
hr=m_pGB-> AddFilter(m_pSampleGrabberFilter,L "VideoGrabber ");
....
// 枚举出各个filter的pin
CComPtr <IEnumPins> pEnum;
m_pDF-> EnumPins(&pEnum);
hr=pEnum-> Reset();
各位大侠:
最近我在做一个监控应用,当切换摄像头预览捕获的图像时,释放Graph并重建,发现其中部分内存并不回收并且累计应用程序使用空间越来越大.经过多次调试,发现只要不Run就没有问题,或者其中捕获图像的Filter(SampleGrabber)不加入也没有大的问题.
其代码如下:
class TestFilter
{
public:
TestFilter();
~TestFilter();
private:
CComPtr <IGraphBuilder> m_pGB;
CComPtr <IMediaControl> m_pMC;
CComPtr <IMediaEventEx> m_pME;
CComPtr <IPin> m_pVidOutPin;
CComPtr <IBaseFilter> m_pDF;
CComPtr <IBaseFilter> m_pSampleGrabberFilter;
CComPtr <IBaseFilter> m_pRenderFilter;
CComPtr <ISampleGrabber> m_pSamGrabber;
CComPtr <IPin> m_pGrabberInput;
CComPtr <IPin> m_pGrabberOutput;
CComPtr <IPin> m_pRenderInputPin;
BOOL BindVFilter(INT iDeviceId,IBaseFilter **pFilter);
void DelMediaType(AM_MEDIA_TYPE *pMt);
HRESULT InitVideoWnd(HWND hWnd,INT iWidth,INT iHeight);
void SetCrossBar(void);
void CloseInterface(void);
void Init();
};
构造函数调用Init()完成初始化和Run(),析构函数Stop和释放对象.
void TestFilter::Init(void)
{
AM_MEDIA_TYPE amt;
HRESULT hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void **)&m_pGB);
hr=CoCreateInstance(CLSID_NullRenderer,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(LPVOID*)&m_pRenderFilter);
hr=CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(LPVOID*)&m_pSampleGrabberFilter);
......
hr=m_pSampleGrabberFilter-> QueryInterface(IID_ISampleGrabber,(void**)&m_pSamGrabber);
ZeroMemory(&amt,sizeof(AM_MEDIA_TYPE));
amt.majortype =MEDIATYPE_Video;
amt.subtype =MEDIASUBTYPE_RGB32;
amt.formattype=FORMAT_VideoInfo;
hr=m_pSamGrabber-> SetMediaType(&amt);
hr=m_pGB-> QueryInterface(IID_IMediaControl,(void**)&m_pMC);
hr=m_pGB-> QueryInterface(IID_IMediaEventEx,(void**)&m_pME);
if (BindVFilter(g_selectcap,&m_pDF)) // bind通过全局变量g_selectcap选定的摄像头
return;
hr=m_pGB-> AddFilter(m_pDF,L "VSource ");
hr=m_pGB-> AddFilter(m_pSampleGrabberFilter,L "VideoGrabber ");
....
// 枚举出各个filter的pin
CComPtr <IEnumPins> pEnum;
m_pDF-> EnumPins(&pEnum);
hr=pEnum-> Reset();