散分,Transform(IMediaSample *pIn, IMediaSample *pOut)里伸缩代码的异常
发布时间:2011-06-27 19:28:10 文章来源:www.iduyao.cn 采编人员:星星草
散分,Transform(IMediaSample *pIn, IMediaSample *pOut)里伸缩代码的错误?
我写了个resizer filter ,在函数CheckInputType(const CMediaType *mtIn)里指定了只接受RGB24,所以input output 针都是 RGB24 格式的.但分辨率和 biSizeImage 不同. 输出后出现花屏或花屏,求指点?
HRESULT CMyTransformFilter::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
CheckPointer(pIn,E_POINTER);
CheckPointer(pOut,E_POINTER);
BYTE *pDibBitsIn,*pDibBitsOut;
HGDIOBJ OldObjectIn,OldObjectOut;
HDC hdcIn,hdcOut,hdc;
BYTE *pBufferIn,*pBufferOut;
VIDEOINFOHEADER* pVIIn = (VIDEOINFOHEADER*)m_pInput->CurrentMediaType().Format( );
VIDEOINFOHEADER* pVIOut=(VIDEOINFOHEADER*)m_pOutput->CurrentMediaType().Format();
pVIOut->rcTarget.right=(LONG)m_iWidth;pVIOut->rcTarget.bottom=(LONG)m_iHeight;
pIn->GetPointer(&pBufferIn);
pOut->GetPointer(&pBufferOut);
hdcIn=CreateCompatibleDC(NULL);
hdcOut=CreateCompatibleDC(NULL);
HBITMAP hDIBIn=CreateDIBitmap(hdcIn,&pVIIn->bmiHeader,CBM_INIT,(void*)pBufferIn,(BITMAPINFO*)&pVIIn->bmiHeader,DIB_RGB_COLORS);
HBITMAP hDIBOut=CreateDIBitmap(hdcOut,&pVIOut->bmiHeader,0,NULL,NULL,DIB_RGB_COLORS);
OldObjectIn=SelectObject(hdcIn,hDIBIn);
OldObjectOut=SelectObject(hdcOut,hDIBOut);
StretchBlt(hdcOut,0,0,m_iWidth,m_iHeight,hdcIn,0,0,m_iWidthIn,m_iHeightIn,SRCCOPY);
SelectObject(hdcIn,OldObjectIn);
SelectObject(hdcOut,OldObjectOut);
GetDIBits(hdcOut, hDIBOut, 0, m_iHeight, (PVOID)pBufferOut,(BITMAPINFO *)&pVIOut->bmiHeader, DIB_RGB_COLORS);
DeleteObject(hDIBIn);
DeleteObject(hDIBOut);
DeleteDC(hdcIn);
DeleteDC(hdcOut);
pOut->SetActualDataLength((long)pVIOut->bmiHeader.biSizeImage);
REFERENCE_TIME TimeStart, TimeEnd;
if (NOERROR == pIn->GetTime(&TimeStart, &TimeEnd)) {
pOut->SetTime(&TimeStart, &TimeEnd);
}
LONGLONG MediaStart, MediaEnd;
if (pIn->GetMediaTime(&MediaStart,&MediaEnd) == NOERROR) {
pOut->SetMediaTime(&MediaStart,&MediaEnd);
}
HRESULT hr = pIn->IsSyncPoint();
if (hr == S_OK) {
pOut->SetSyncPoint(TRUE);
}
else if (hr == S_FALSE) {
pOut->SetSyncPoint(FALSE);
}
else { // an unexpected error has occured...
return E_UNEXPECTED;
}
hr = pIn->IsPreroll();
if (hr == S_OK) {
pOut->SetPreroll(TRUE);
}
else if (hr == S_FALSE) {
pOut->SetPreroll(FALSE);
}
else { // an unexpected error has occured...
return E_UNEXPECTED;
}
hr = pIn->IsDiscontinuity();
if (hr == S_OK) {
pOut->SetDiscontinuity(TRUE);
}
else if (hr == S_FALSE) {
pOut->SetDiscontinuity(FALSE);
}
else { // an unexpected error has occured...
return E_UNEXPECTED;
}
return S_OK;
}
------解决方案--------------------
1.确认resize后的图像正确。
2.通知render格式改变。参考
------解决方案--------------------
你后面要接render,render会自己调整尺寸的,宽度会增加,多余宽度是显存对齐用的,你需要逐行逐行拷贝。
------解决方案--------------------
关键是你看你的输出PIN上的width和HEIGHT是否是你resize后的大小,另外确定DecideBufferSize分配的sample大小是resize后的buffer大小,最后就是输出buffer中的数据copy是否正确
------解决方案--------------------
搂住请参考这个帖子
http://topic.csdn.net/u/20101202/16/1f35d89a-8047-418f-b5d1-663a3f159d4e.html
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
DSHOW push
推模式,ConnectDirect 的,为什么我一直反回错误
下级级用的是HAALI的一个东西,用CMemStream拉模式的时候是可以连接的
...
-
ffmpeg编码后视频速度不正确,质量也不好,求助,求助,求助,求助啊
对采集到得摄像头图像进行编码保存,发现得到的视频质量不好,而且速度不...
-
请问怎么在live555中接收jpeg
请问,我现在想接收一个服务器发送的jpeg 不知道怎么用live555做一个客户端, 接收它并显示。
请问应...
-
XP SP3 YUV420 的fiter依赖 在线等答案……
链接时媒体类型为WMMEDIASUBTYPE_I420
有的XP可以播放出来
有的就不行,请问不能播放...
-
如何获取通过麦克风来获取当前说话的音量?
使用Wave系统API采集音频输入的数据,当数据缓存区满了后,收到消息取得数据后,如何根据这里...
-
RFC3984 有没有完整的中文版本呢?
搜了几个 都是一半英文一半中文的。哎 郁闷!
------解决方案--------------------
英文的凑合...
-
介绍一个学习directshow和com、atl技术的网站
有一个学习directshow和com、atl技术的网站,还可以下视频教程,共享给大家: http://www...
-
攻击帖:jrtplib、live555是个垃圾,刚开始搞流媒体就用这玩意就是找s
不解释~
来丢我砖头吧~~
我分太多了用不完~ 支持的散分~~~
...
-
50分,寻找《Visual C++音频/视频处理技术及工程实践》的随书光盘?
急于使用其中的几个例程。若哪位好心人能够提供,非常感谢!!我的QQ:52...
-
h264的高宽比怎么获取?
我看标准里面只有样点的高宽比啊。
还有,bit rate可以读出来吗?
------解决方案--------------------
是要...