現在、WMF を使用して Qt に実際のカメラ フレームを表示しています。まず、IMFSampleGrabberSinkCallback から継承した Grabber クラスにある OnProcessSample の画像フレームを WMF で定期的に取得するだけで問題ありません。
WMF.CPP
STDMETHODIMP Grabber::OnProcessSample
(
REFGUID guidMajorMediaType,
DWORD dwSampleFlags,
LONGLONG llSampleTime,
LONGLONG llSampleDuration,
const BYTE * pSampleBuffer,
DWORD dwSampleSize
)
{
QMutexLocker locker(&m_SampleMutex);
pMySignal->setValue();
return S_OK;
}
フレームの取得をUIに通知するために、以下のようなSignal&SlotでQObjectから継承したシンプルなクラスを作成してみました。
MainWindow.h
class MySignal : public QObject
{
Q_OBJECT
public:
MySignal(QObject * parent = 0, char* name = 0)
{
setObjectName ( name );
}
void setValue() { emit EnvokeSignal(); }
public slots:
void ReceiveSignal();
signals:
void EnvokeSignal();
};
class MySignal2 : public QObject
{
Q_OBJECT
public:
MySignal2(QObject * parent = 0, char* name = 0)
{
setObjectName ( name );
}
void setValue() { emit EnvokeSignal2(); }
public slots:
void ReceiveSignal2();
signals:
void EnvokeSignal2();
};
MainWindow.cpp
MySignal* pMySignal;
void MySignal::ReceiveSignal()
{
//qDebug()<<"Objectname = "<< objectName() <<" val = "<< v;
OutputDebugString(L" === ReceiveSignal === \n");
}
void MySignal2::ReceiveSignal2()
{
//qDebug()<<"Objectname = "<< objectName() <<" val = "<< v;
OutputDebugString(L" === ReceiveSignal === \n");
}
void MainWindow::on_pushButton_clicked()
{
MySignal SignalSlotCleass(0, "a");
MySignal2 Signal2SlotCleass(0, "b");
pMySignal = &SignalSlotCleass;
QObject::connect( &SignalSlotCleass, &MySignal::EnvokeSignal, &Signal2SlotCleass, &MySignal2::ReceiveSignal2 );
EnumerateCamDevice_StartupMF();
}
MySignal1、MySignal2 のような 2 つのクラスのみを使用すると、Slot メソッドで Signal メッセージを取得できました。しかし、WMF.cpp を OnProcessSample 関数とマージしようとすると、Slot 関数で OnProcessSample から送信されたシグナル メッセージを取得できませんでした。この問題を知っている人がいたら、それを克服するためのヒントを教えてくれませんか?