初学者求解决有关directshow filter的一些初级问题...
初学者学习DirectShow Filter开发实在艰深,想不出办法解决,希望高手能来指点一下...
我使用ffdshow来解码视频,然后在myfilter里增加效果
我的解码器是这样连接的:ffdshow->myfilter->OverlayMixer->VideoRenderer,视频分辨率是720x576(比例为16:9),现在主要的问题是图象花屏,呈条纹状。
找了一些资料说是Render为了加速渲染而更改了分辨率,实际输出的分辨率为768x576,我后来用代码一行一行地复制解码后的数据,显示是正确了,但发现这样非常慢。
但如果不插进myfilter的话,ffdshow是能自动检测出目标分辨率为768x576然后按此分辨率输出到render的,请问该怎么才能将render的改变分辨率请求传给ffdshow呢?
[解决办法]
链接filter,协商的时候设置成720×576就可以
[解决办法]
1.overlay使用了硬件加速,所以copy数据太多就显的慢了,因为可能直接对显存进行了写操作.
2.这是ds的媒体格式动态改变的问题.也就是说,连接的时候是720的,但是一run,渲染器就会请求格式改变为768.你的问题就在于,对这个格式改变请求,你的filter没有做响应.你应该同意,并且把这个改变请求继续向你的上游filter(也就是ffdshow)发送.让它也跟着改变格式为768.这样你们就都以新的格式768运行了
[解决办法]
以前做项目的时候遇到过这种问题。你一行一行复制到地有多慢啊?关键我这边都是一行一行复制处理的,我几路1080P的视频测试也没觉得效率低多少。通知上游解决按道理说上游同样是一行一行复制给你的,在D3D渲染中,除了视频,很多纹理数据复制都是按pitch复制的,意思就是一行一行的复制。这个加速分辨率改变我记得是d3d设备申请纹理的时候返回的,意味着不管是谁,总要有一个人要一行一行复制改变你自己数据的分辨率,如果你觉得慢,你检查下你的复制函数是不是汇编操作,或者是不是在复制的时候做什么其他操作影响速度了
[解决办法]
最简单的方法是在CheckTransform()函数中拒绝动态改变。如果支持动态改变,需要你在Transform函数中每次取mediatype判断是否改变。