Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://yahirohumpty.blog2.fc2.com/tb.php/270-997da4f9

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

DirectShow on Platform SDK Nov. 2007 with VC express 2005 (できた)

やっとできた...

とりあえずさっきまでの状況としては,
SampleGrabberは動くがコールバックに設定すると落ちるという状況が続いていた.

リンク時にWarningがでていたのでとりあえず調べてみた.
LIBCMTDが競合するとかいうものだったが,
libcmtd.libはマルチスレッドのデバッグ用ライブラリだそうだ.
コールバックはマルチスレッドで実現されているはずなので,
これを使わないとどうしようもない.
明示的に指定するにはclを呼ぶときに/MTdをつける.

で,結果としては解決したみたい.普通に動きました.


結局ここにいたるまでにメーカが提供したSDKを相当いじらないといけないという
なんとも馬鹿馬鹿しい展開に耐えねばなりませんでした.


もろもろのパスが違うので一概にこれで動くとは言えませんが
一応ソース載せときます.

コンパイルに使ったバッチファイル(cl以下適当に改行しているので一行におさめてください)

@echo off
cl dshowcap.cpp
/I "C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\BaseClasses"
/MTd
/link
/LIBPATH:"C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\BaseClasses\XP32_DEBUG\"


http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html
をほぼそのまま使わせていただいたテストコード


#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#include <stdio.h>

// using
// http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html

#include <dshow.h>
#include <iostream>
#include <qedit.h>
#include "streams.h"

#pragma comment(lib,"strmbasd.lib")
#pragma comment(lib,"strmiids.lib")
#pragma comment(lib,"winmm.lib")

using namespace std;


IPin *GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir)
{
BOOL bFound = FALSE;
IEnumPins *pEnum;
IPin *pPin;

pFilter->EnumPins(&pEnum);
while(pEnum->Next(1, &pPin, 0) == S_OK)
{
PIN_DIRECTION PinDirThis;
pPin->QueryDirection(&PinDirThis);
if (bFound = (PinDir == PinDirThis)) // 引数で指定した方向のピンならbreak
break;
pPin->Release();
}
pEnum->Release();
return (bFound ? pPin : 0);
}


class CGrabCB: public CUnknown, public ISampleGrabberCB
{
public:
DECLARE_IUNKNOWN;

STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
if( riid == IID_ISampleGrabberCB ){
return GetInterface((ISampleGrabberCB*)this, ppv);
}
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}

// ISampleGrabberCB のメソッド
STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample)
{
return E_NOTIMPL;
}

STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen)
{
cerr << "Sample time: " << SampleTime << "\t";
cerr << "BufferLen: " << BufferLen;
cerr << endl;
return S_OK;
}
// コンストラクタ
CGrabCB( ) : CUnknown("SGCB", NULL)
{ }

};



int main(int argc, char* argv[])
{
cout << "Initialize COM" << endl;
CoInitialize(NULL);

cout << "1." << endl;
// 1. フィルタグラフ作成
IGraphBuilder *pGraph = NULL;
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **)&pGraph);

cout << "2." << endl;
// 2. システムデバイス列挙子を作成
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);

IEnumMoniker *pClassEnum = NULL;
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);

ULONG cFetched;
IMoniker *pMoniker = NULL;
IBaseFilter *pSrc = NULL;
if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK){
// 最初のモニカをフィルタオブジェクトにバインドする
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)&pSrc);
pMoniker->Release();
}
pClassEnum->Release();
pDevEnum->Release();

pGraph->AddFilter(pSrc, L"Video Capture");

cout << "3." << endl;
// 3. キャプチャビルダの作成
ICaptureGraphBuilder2 *pBuilder = NULL;
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **)&pBuilder);
pBuilder->SetFiltergraph(pGraph);

cout << "4." << endl;
// 4. 一枚撮る
cout << "4-1." << endl;
// 4-1. サンプルグラバの生成
IBaseFilter *pF = NULL;
ISampleGrabber *pSGrab;
CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (LPVOID *)&pF);
pF->QueryInterface(IID_ISampleGrabber, (void **)&pSGrab);

cout << "4-2." << endl;
// 4-2. メディアタイプの設定
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video; // Sample Grabber の入力ピン(Capture Device の出力ピン)はUYVY
//mt.subtype = MEDIASUBTYPE_UYVY;
mt.subtype = MEDIASUBTYPE_RGB24;
mt.formattype = FORMAT_VideoInfo;
pSGrab->SetMediaType(&mt);

cout << "4-3." << endl;
// 4-3. フィルタグラフへ追加
pGraph->AddFilter(pF, L"Grabber");

cout << "4-4." << endl;
// 4-4. サンプルグラバの接続
// [pSrc](o) -> (i)[pF](o) -> [VideoRender]
// ↑A ↑B ↑C
IPin *pSrcOut = GetPin(pSrc, PINDIR_OUTPUT); // A
IPin *pSGrabIN = GetPin(pF, PINDIR_INPUT); // B
IPin *pSGrabOut = GetPin(pF, PINDIR_OUTPUT); // C

pGraph->Connect(pSrcOut, pSGrabIN);
pGraph->Render(pSGrabOut);

cout << "4-5." << endl;
// 4-5. グラバのモードを適切に設定
pSGrab->SetBufferSamples(FALSE);
pSGrab->SetOneShot(FALSE);
cout << "4-5-1." << endl;
CGrabCB *cb = new CGrabCB();
cout << "4-5-2." << endl;
pSGrab->SetCallback(cb, 1); // 第2引数でコールバックを指定 (0:SampleCB, 1:BufferCB)

cout << "5." << endl;
// 5. キャプチャ開始
IMediaControl *pMediaControl = NULL;
IMediaEvent *pEvent = NULL;

pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

long evCode;
pMediaControl->Run();
//MessageBox(NULL, "Click to capture & stop.", "DirectShow", MB_OK);
//saveflag = TRUE;
Sleep(1000);
pEvent->WaitForCompletion(100, &evCode);


cout << "6." << endl;
// 6. 終了
pF->Release(); // こいつらも
pSGrab->Release(); // わすれずに解放
pSrc->Release();
pMediaControl->Release();
pBuilder->Release();
pGraph->Release();
CoUninitialize();

cout << "end\n";
return 0;
}

スポンサーサイト
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://yahirohumpty.blog2.fc2.com/tb.php/270-997da4f9

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

yahirohumpty

  • Author:yahirohumpty
  • 某大学の研究員です.
    博士号持ってます.
    ビジョンとロボットが専門.
    その他もろもろのことに興味があります.

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。