CreateDIBSectionについて


山岡  2005-03-02 07:37:35  No: 56563

こんにちは。山岡です。
現在私は、DirectShowのサンプル'StillCap'を
元にしてビデオカメラからの画像をとりこみ、
静止画として保存する
アプリケーションを作成しています。

当初、カメラからの画像はRGB24形式で取り込んでいましたが、
IMediaControl->Run()の実行時に
CPU使用率が100%になってしまった為、
RGB24形式からYUY2形式で取り込むよう変更しました。
以下のような感じです。

----------------------------------------
//メディアタイプ設定
CMediaType VideoType;
VideoType.SetType( &MEDIATYPE_Video );
VideoType.SetSubtype( &MEDIASUBTYPE_RGB24);<--この部分をYUY2に変更しました
hr = pISampleGrabber->SetMediaType( &VideoType );

-----------------------------------------
しかし、YUY2にすると静止画を格納する為のバッファを準備する部分で
問題が発生してしまいます。

-----------------------------------------
AM_MEDIA_TYPE mt;
hr = m_pGrabber->GetConnectedMediaType(&mt);
if (szCapBitmap != NULL)
{
    DeleteObject(szCapBitmap);
}

VIDEOINFOHEADER *pVideoHeader;
pVideoHeader = (VIDEOINFOHEADER*)mt.pbFormat;
        
ZeroMemory(&szBmInfo, sizeof(szBmInfo));
CopyMemory(&szBmInfo.bmiHeader, &(pVideoHeader->bmiHeader), sizeof(BITMAPINFOHEADER));
szCapBitmap = CreateDIBSection(0, &szBmInfo, DIB_RGB_COLORS, &m_pBmpBuffer, NULL, 0);
-----------------------------------------------------------
こんな感じでバッファの準備をし、CreateDIBSectionにより
生成されたビットマップのハンドルを得ようとしているのですが、
NULLが帰ってきてしまいます。
直後にGetLastError()を実行しても、「正常に終了しました」といった
コードしか得られないため、なにがいけないのかが良くわからないのです。
MEDIASUBTYPE_RGB24からMEDIASUBTYPE_YUY2に変更したのが大元の原因
であるとは思うのですが。

どなたか、CMediaType.SetSubtypeにMEDIASUBTYPE_YUY2をセットした場合の
ビットマップのハンドルの取得の仕方をご存知でしょうか。
ご存知でしたら何卒ご教授いただきたく思います。


Disca  URL  2005-03-22 16:12:33  No: 56564

現在、VFW or DirectShow で WevCamライブ画像配信を作っている者です。

私の場合、MEDIASUBTYPE_YUY2
で取得したバッファを、
CreateDIBSectionで直接渡すことはできませんでした。

どうやら、
BITMAPINFOHEADER.biCompression == 844715353 /*YUV422*/
の場合、YUV422はアンチサポートのため、
バッファサイズの問題から(圧縮率:16/24なので)跳ね返されます。

そのため、YUY2(YUV422)からDDV24に変換してから、
具体的には、844715353 から BI_RGB  へ変換後、
CreateDIBSectionに渡してください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加