初学者问题:如何重写 GetMediaType ,才能使 CBaseOutputPin 派生类的媒体类型为MEDIASUBTYPE_YUYV ?

sungengyu 2005-03-09 05:29:00
如何重写 GetMediaType ,才能使 CBaseOutputPin 派生类的媒体类型为MEDIASUBTYPE_YUYV ?

郁闷。

谢谢了。
...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sungengyu 2005-03-24
  • 打赏
  • 举报
回复
HRESULT CBallStream::GetMediaType(int iPosition, CMediaType *pmt)
{
int width = m_ball.GetImageWidth() ;
int height = m_ball.GetImageHeight() ;


CAutoLock lockit(m_pFilter->pStateLock());
if (iPosition != 0)
{
return E_INVALIDARG;
}

pmt->SetType(&MEDIATYPE_Video);
pmt->SetSubtype(&MEDIASUBTYPE_UYVY) ;
pmt->SetFormatType(&FORMAT_VideoInfo);
pmt->SetSampleSize(width*height*2);
pmt->SetTemporalCompression(FALSE);

VIDEOINFOHEADER info;
ZeroMemory(&info, sizeof(VIDEOINFOHEADER));


info.bmiHeader.biPlanes = 1;
info.bmiHeader.biSizeImage = width*height*2 ;
info.bmiHeader.biClrImportant = 0;


info.AvgTimePerFrame = this->m_iDefaultRepeatTime ; //UNITS / SRC_FRAME_RATE;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biHeight = height ;
info.bmiHeader.biWidth = width;
info.bmiHeader.biCompression = mmioFOURCC('U','Y','V','Y');

info.bmiHeader.biBitCount = 16 ; // sungengyu


pmt->SetFormat((BYTE*)&info, sizeof(VIDEOINFOHEADER));

return NOERROR;

}
sungengyu 2005-03-17
  • 打赏
  • 举报
回复
终于能连上了,可是输出数据是错的。 :(

资料太少了,《DirectShow开发指南》也太不详细。
sungengyu 2005-03-11
  • 打赏
  • 举报
回复
还是连不上

调试跟踪到 CBasePin::TryMediaTypes(IPin *pReceivePin, const CMediaType *pmt,IEnumMediaTypes *pEnum) 中,
hr = AttemptConnection(pReceivePin, pMediaType);
hr的返回值是错的。

如果直接连 Video Renderer ,hr 的返回值是 0x8004022a (ReceiveConnection 拒绝传入的媒体类型。)

如果连结 AVI Decompressor,hr的返回值是 0x80040255(无法回放视频流:无法找到合适的解压程序。)

pMediaType 中的值是

majortype {73646976-0000-0010-8000-00AA00389B71} (MEDIATYPE_Video)
subtype {56595559-0000-0010-8000-00AA00389B71} (MEDIASUBTYPE_YUYV)
bFixedSizeSamples 0x00000001
bTemporalCompression 0x00000000
lSampleSize 0x00000001
formattype {05589F80-C356-11CE-BF01-00AA0055595A} (FORMAT_VideoInfo)
pUnk 0x00000000
cbFormat 0x00000058
pbFormat 0x00166cd0
happydeer 2005-03-10
  • 打赏
  • 举报
回复

#define SRC_IMG_WIDTH 352
#define SRC_IMG_HEIGHT 288
#define SRC_FRAME_RATE 25

HRESULT CYourPin::GetMediaType(int iPosition, CMediaType *pmt)
{
CAutoLock lockit(m_pFilter->pStateLock());
if (iPosition != 0)
{
return E_INVALIDARG;
}

pmt->SetType(&MEDIATYPE_Video);
pmt->SetSubtype(&MEDIASUBTYPE_YUYV);
pmt->SetFormatType(&FORMAT_VideoInfo);
pmt->SetSampleSize(1);
pmt->SetTemporalCompression(FALSE);
VIDEOINFOHEADER info;
ZeroMemory(&info, sizeof(VIDEOINFOHEADER));
info.AvgTimePerFrame = UNITS / SRC_FRAME_RATE;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biHeight = SRC_IMG_HEIGHT;
info.bmiHeader.biWidth = SRC_IMG_WIDTH;
info.bmiHeader.biCompression = mmioFOURCC('Y','U','Y','V');
pmt->SetFormat((BYTE*)&info, sizeof(VIDEOINFOHEADER));

return NOERROR;
}
sungengyu 2005-03-10
  • 打赏
  • 举报
回复
我在小球的例子上修改的。我希望输出媒体类型为MEDIASUBTYPE_YUYV,试了好久还是连不上。我不知道怎么重写 HRESULT CBallStream::GetMediaType(int iPosition, CMediaType *pmt) , 这里是不是应该填充 AM_MEDIA_TYPE 结构?

在网上搜索也找不到例子,两天了,郁闷至极,
兄弟们拉我一把吧,可怜可怜我吧,555555555555555

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧