C# 长时间保存在图形中的介质样本(累积效应)
几个月前,我在DirectShow图形上写了一篇关于缓冲区不足的文章 饥饿问题通过实现一个自定义分配器来解决,该分配器在饥饿时会扩展大小。然而,这仅仅缓解了真正的问题如果有足够的时间,图表中保存的样本数量会过多,并且不断扩展的池会造成内存不足的情况。 以下是我收集到的一些事实:C# 长时间保存在图形中的介质样本(累积效应),c#,c++-cli,directshow,C#,C++ Cli,Directshow,几个月前,我在DirectShow图形上写了一篇关于缓冲区不足的文章 饥饿问题通过实现一个自定义分配器来解决,该分配器在饥饿时会扩展大小。然而,这仅仅缓解了真正的问题如果有足够的时间,图表中保存的样本数量会过多,并且不断扩展的池会造成内存不足的情况。 以下是我收集到的一些事实: 该图基本上是将MPEG2-TS流转码为MP4文件,以及提取音频和视频数据以进行实时DSP处理 该流以UDP多播流的形式出现。这条溪流有14个不同的SD节目 我正在使用从DsNetwork示例派生的自定义筛选器读取UDP流
过滤器确实是“黑匣子”的幻觉需要小心,因为线程沿着图流动,下游过滤器上的问题可能会在上游过滤器中显示为错误问题。首先,所描述的行为听起来像一个bug。也就是说,意外行为会造成不必要的影响。但是,我同意尝试解决问题的做法是要求对罪犯进行鉴定,并对登记的问题进行详细调查 由于视频在与延迟样本相关的数量上相对滞后于音频,并且没有其他副作用(例如,像丢失的帧),我同意挑战在于找到谁准确地持有媒体样本 我可以提出两种方法
void MulticastMediaSample::Initialize(MulticastSourceFilter* pFilter, MulticastSourceFilter::UDPBuffer* pBuffer) {
_props.pbBuffer = pBuffer->Data;
_props.lActual = pBuffer->payloadSizeInBytes;
_pBuffer = pBuffer;
// Network packet should be a multiple of a TS packet length (188 bytes)
int tsPacketCount = pBuffer->payloadSizeInBytes / 188;
if( pBuffer->payloadSizeInBytes % 188 != 0 ) {
printf("Invalid TCP packet, length is not multiple of 188\r\n");
exit(-8828);
}
BYTE* pPacket = pBuffer->Data;
UINT header;
for( int i = 0; i < tsPacketCount; i++ ) {
if( pPacket[0] != 0x47 ) {
printf("Lost Sync!\r\n");
exit(-12423);
}
UINT pId = (pPacket[1] & 0x1f) << 8 | pPacket[2];
if( pId != 0x1fff ) { // ignore "filler" packets
UINT afc = (pPacket[3] & 0x30) >> 4;
BYTE cc = pPacket[3] & 0xf;
auto it = pFilter->_ccMap.lower_bound(pId);
if( it != pFilter->_ccMap.end() && !(pFilter->_ccMap.key_comp()(pId, it->first)) ) {
// PID key exists in map, check continuity
if( afc != 2 ) { // don't check for packets carrying no payload
BYTE expected = (it->second + 1) & 0xf;
if( cc != expected ) {
printf("Continuity check error for pId %d: expected %d, got %d\r\n", pId, expected, cc);
SetDiscontinuity(TRUE);
}
}
// update key
it->second = cc;
} else {
// key does not exist, insert first time
pFilter->_ccMap.insert(it, std::map<UINT16, BYTE>::value_type(pId, cc));
}
}
pPacket += 188;
}
#ifdef DEBUG
ASSERT(pBuffer->payloadSizeInBytes <= sizeof pBuffer->DataCopy);
memcpy(pBuffer->DataCopy, pBuffer->Data, pBuffer->payloadSizeInBytes);
#endif
_pBuffer->AddRef();
ASSERT(_refCnt == 1);
}