整合功能到主界面,但是出现playerwidget如果作为子widget图像会变成绿色的底色

master
a7458969 2020-05-27 00:54:03 +08:00
parent 0e3f6f3b97
commit 67836fb226
7 changed files with 209 additions and 83 deletions

View File

@ -203,7 +203,7 @@ void CPlayWidget::initializeGL()
if(this->mType == TYPE_RGB32){
initShaderRgb();
}
glClearColor(0.3,0.3,0.3,0.0);//设置背景色
glClearColor(0.0,0.0,0.0,0.0);//设置背景色
}
void CPlayWidget::resizeGL(int w, int h)
{

View File

@ -3,6 +3,7 @@
#include "cplaywidget.h"
#include <QTimer>
#include "CameraCapture.h"
#include "mainwindow.h"
void CameraDataCallback(double ts, BYTE *dat, LONG size){
qDebug()<<"reieve cnt"<<size;
@ -11,22 +12,26 @@ void CameraDataCallback(double ts, BYTE *dat, LONG size){
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow main;
main.show();
/*
CPlayWidget gPlayer(nullptr);
gPlayer.SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32);
gPlayer.SetImgSize(640,480);
gPlayer.show();
Camera *gCam = Camera::GetInstance();
std::vector<std::wstring> names = gCam->EnumAllCamera();
Camera *gCam;
std::vector<std::wstring> names = Camera::EnumAllCamera();
for(auto itr = names.begin();itr != names.end();itr++){
if(gCam->Open(*names.begin()) ){
Camera *gCam = new Camera(*names.begin());
gCam->SetObserver(&gPlayer);
qDebug("open success");
}else{
qDebug("open fail");
}
qDebug()<<QString::fromStdWString(*itr);
}
gCam->SetObserver(&gPlayer);
if(gCam->Open(*names.begin()) ){
qDebug("open success");
}else{
qDebug("open fail");
}
*/
return a.exec();
}

View File

@ -3,12 +3,44 @@
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui(new Ui::MainWindow),
m_bCameraOpen(false),
mCamera(nullptr)
{
ui->setupUi(this);
std::vector<std::wstring> cameras = Camera::EnumAllCamera();
for(std::wstring x : cameras){
ui->comboBox->addItem(QString::fromWCharArray(x.c_str(),x.size()),
QString::fromWCharArray(x.c_str(),x.size()));
}
}
MainWindow::~MainWindow()
{
MainWindow::~MainWindow(){
delete ui;
}
void MainWindow::on_pushButton_clicked(){
if(nullptr == mPlayerWidget){
mPlayerWidget = new CPlayWidget(nullptr);
}
if(!m_bCameraOpen){
ui->widget->SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32);
ui->widget->SetImgSize(640,480);
qDebug()<<ui->comboBox->currentText().size()<<ui->comboBox->currentText();
wchar_t *opencamera = new wchar_t[ui->comboBox->currentText().size()];
ui->comboBox->currentText().toWCharArray(opencamera);
wstring ss = wstring(opencamera,ui->comboBox->currentText().size());
if(nullptr == mCamera){
this->mCamera = new Camera(ss);
}
this->mCamera->SetObserver(ui->widget);
qDebug()<<ui->comboBox->currentText();
ui->pushButton->setText("关闭摄像头");
m_bCameraOpen = true;
ui->widget->show();
}else{
m_bCameraOpen = false;
ui->pushButton->setText("打开摄像头");
}
}

View File

@ -2,6 +2,8 @@
#define MAINWINDOW_H
#include <QMainWindow>
#include "media/CameraCapture.h"
#include "cplaywidget.h"
namespace Ui {
class MainWindow;
@ -15,8 +17,15 @@ public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
Camera *mCamera;
QStringList mCameraList;
bool m_bCameraOpen;
CPlayWidget *mPlayerWidget;
};
#endif // MAINWINDOW_H

View File

@ -6,31 +6,106 @@
<rect>
<x>0</x>
<y>0</y>
<width>1208</width>
<height>943</height>
<width>1383</width>
<height>1116</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="CPlayWidget" name="widget" native="true">
<property name="geometry">
<rect>
<x>19</x>
<y>20</y>
<width>1171</width>
<height>851</height>
</rect>
</property>
</widget>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,10">
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,2,13">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<item>
<widget class="QPushButton" name="pushButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="sizeIncrement">
<size>
<width>0</width>
<height>6</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="text">
<string>打开摄像头</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBox">
<property name="minimumSize">
<size>
<width>0</width>
<height>35</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="CPlayWidget" name="widget" native="true"/>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1208</width>
<width>1383</width>
<height>26</height>
</rect>
</property>

View File

@ -4,10 +4,10 @@
#pragma comment(lib, "strmiids")
//define release maco
#define ReleaseInterface(x) \
if ( NULL != x ) \
if ( nullptr != x ) \
{ \
x->Release( ); \
x = NULL; \
x = nullptr; \
}
// Application-defined message to notify app of filter graph events
#define WM_GRAPHNOTIFY WM_APP+100
@ -16,21 +16,34 @@ Camera::Camera():
mInitOK(false),
mVideoHeight(0),
mVideoWidth(0),
mDevFilter(NULL),
mCaptureGB(NULL),
mGraphBuilder(NULL),
mMediaControl(NULL),
mMediaEvent(NULL),
mSampGrabber(NULL),
mDevFilter(nullptr),
mCaptureGB(nullptr),
mGraphBuilder(nullptr),
mMediaControl(nullptr),
mMediaEvent(nullptr),
mSampGrabber(nullptr),
mIsVideoOpened(false),
mDebug(false)
{
//HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
//if (SUCCEEDED(hr))
{
mInitOK = true;
}
mStatus = STOP;
}
Camera::Camera(wstring camera)
{
mInitOK = false;
mVideoHeight = 0;
mVideoWidth = 0;
mDevFilter = nullptr;
mCaptureGB = nullptr;
mGraphBuilder = nullptr;
mMediaControl = nullptr;
mMediaEvent = nullptr;
mSampGrabber = nullptr;
mIsVideoOpened = false;
if(!this->Open(camera)){
mStatus = FAIL;
}
mStatus = STOP;
}
Camera::~Camera()
@ -43,13 +56,13 @@ HRESULT Camera::InitializeEnv() {
HRESULT hr;
//Create the filter graph
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
hr = CoCreateInstance(CLSID_FilterGraph, nullptr, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (LPVOID*)&mGraphBuilder);
if (FAILED(hr))
return hr;
//Create the capture graph builder
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER,
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, nullptr, CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2, (LPVOID*)&mCaptureGB);
if (FAILED(hr))
return hr;
@ -71,14 +84,12 @@ HRESULT Camera::InitializeEnv() {
}
std::vector<std::wstring> Camera::EnumAllCamera(void) {
if (mInitOK == false)
return std::vector<std::wstring>();
std::vector<std::wstring> names;
IEnumMoniker *pEnum = nullptr;
IEnumMoniker *pEnum = nullptr;
// Create the System Device Enumerator.
ICreateDevEnum *pDevEnum;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));
if (SUCCEEDED(hr))
@ -95,12 +106,12 @@ std::vector<std::wstring> Camera::EnumAllCamera(void) {
if (!SUCCEEDED(hr))
return std::vector<std::wstring>();
IMoniker *pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
IMoniker *pMoniker = nullptr;
while (pEnum->Next(1, &pMoniker, nullptr) == S_OK)
{
IPropertyBag *pPropBag;
IBindCtx* bindCtx = NULL;
LPOLESTR str = NULL;
IBindCtx* bindCtx = nullptr;
LPOLESTR str = nullptr;
VARIANT var;
VariantInit(&var);
@ -137,7 +148,7 @@ HRESULT Camera::BindFilter(int deviceID, IBaseFilter **pBaseFilter) {
ICreateDevEnum *pDevEnum;
IEnumMoniker *pEnumMon;
IMoniker *pMoniker;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (LPVOID*)&pDevEnum);
if (SUCCEEDED(hr))
{
@ -181,16 +192,18 @@ void Camera::SetDebug(bool isDebug) {
}
int Camera::SampleGrabberCallback::SetObserver(CameraObserver *p) {
if (nullptr == p)
if (nullptr == p)
return -1;
mMux.lock();
for (auto itr = this->mObserver.begin(); itr != mObserver.end(); itr++) {
if (p == *itr) return 0;
if (p == *itr) {
mMux.unlock();
return 0;
}
}
this->mObserver.push_back(p);
mMux.unlock();
return 0;
return 0;
}
int Camera::SampleGrabberCallback::RemoveObserver(CameraObserver * p)
@ -213,14 +226,9 @@ int Camera::SampleGrabberCallback::RemoveObserver(CameraObserver * p)
bool Camera::Open(std::wstring &camera_name)
{
if (mInitOK == false)
return false;
if (mIsVideoOpened)
return true;
HRESULT hr;
#define CHECK_HR(x) do{ hr = (x); if (FAILED(hr)){ Close(); return false;}}while(0)
CHECK_HR(InitializeEnv());
@ -246,7 +254,7 @@ bool Camera::Open(std::wstring &camera_name)
return false;
}
// create grabber filter instance
CHECK_HR(CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
CHECK_HR(CoCreateInstance(CLSID_SampleGrabber, nullptr, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (LPVOID*)&pSampleGrabberFilter));
// bind source device
@ -262,9 +270,9 @@ bool Camera::Open(std::wstring &camera_name)
CHECK_HR(pSampleGrabberFilter->QueryInterface(IID_ISampleGrabber, (LPVOID*)&mSampGrabber));
// find the current bit depth
HDC hdc = GetDC(NULL);
HDC hdc = GetDC(nullptr);
mBitDepth = GetDeviceCaps(hdc, BITSPIXEL);
ReleaseDC(NULL, hdc);
ReleaseDC(nullptr, hdc);
// set the media type for grabber filter
AM_MEDIA_TYPE mediaType;
@ -291,8 +299,8 @@ bool Camera::Open(std::wstring &camera_name)
mediaType.formattype = FORMAT_VideoInfo;
hr = mSampGrabber->SetMediaType(&mediaType);
// 意味着最后的数据是丢掉的
CHECK_HR(CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)(&dest_filter)));
mGraphBuilder->AddFilter(dest_filter, L"NullRenderer");
CHECK_HR(CoCreateInstance(CLSID_NullRenderer, nullptr, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)(&dest_filter)));
mGraphBuilder->AddFilter(dest_filter, L"nullptrRenderer");
// connect source filter to grabber filter
CHECK_HR(mCaptureGB->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
@ -329,12 +337,12 @@ bool Camera::Open(std::wstring &camera_name)
{
CoTaskMemFree((PVOID)mediaType.pbFormat);
mediaType.cbFormat = 0;
mediaType.pbFormat = NULL;
mediaType.pbFormat = nullptr;
}
if (mediaType.pUnk != NULL)
if (mediaType.pUnk != nullptr)
{
mediaType.pUnk->Release();
mediaType.pUnk = NULL;
mediaType.pUnk = nullptr;
}
mIsVideoOpened = TRUE;
mStatus = RUNNING;
@ -348,7 +356,7 @@ bool Camera::Close() {
}
if (mMediaEvent)
{
mMediaEvent->SetNotifyWindow(NULL, WM_GRAPHNOTIFY, 0);
mMediaEvent->SetNotifyWindow(NULL, WM_GRAPHNOTIFY, 0);
}
mIsVideoOpened = false;
//release interface
@ -375,7 +383,7 @@ ULONG STDMETHODCALLTYPE Camera::SampleGrabberCallback::Release() {
}
HRESULT STDMETHODCALLTYPE Camera::SampleGrabberCallback::QueryInterface(REFIID riid, void** ppvObject) {
if (NULL == ppvObject) return E_POINTER;
if (nullptr == ppvObject) return E_POINTER;
if (riid == __uuidof(IUnknown))
{
*ppvObject = static_cast<IUnknown*>(this);
@ -395,12 +403,13 @@ HRESULT STDMETHODCALLTYPE Camera::SampleGrabberCallback::SampleCB(double Time, I
HRESULT STDMETHODCALLTYPE Camera::SampleGrabberCallback::BufferCB(double Time, BYTE * pBuffer, long BufferLen)
{
//Debuger::Debug(L"receieve %d \r\n", BufferLen);
#define DEBUG_CAMERA
#ifdef DEBUG_CAMERA
static FILE *p = fopen("camera_test.yuv","wb+");
fwrite(pBuffer,BufferLen,1,p);
fflush(p);
#endif
if (mNewDataCallBack)
{
mNewDataCallBack(Time, pBuffer, BufferLen);

View File

@ -22,11 +22,13 @@ public:
public:
virtual int OnCameraData(uint8_t *dat, uint32_t size) { return 0; };
};
Camera(wstring camera);
Camera(const Camera &) = delete;
Camera& operator =(const Camera&) = delete;
~Camera();
private:
Camera();
Camera(const Camera &) = delete;
Camera& operator =(const Camera&) = delete;
~Camera();
Camera();
bool mInitOK;
bool mIsVideoOpened;
@ -66,15 +68,9 @@ public:
int SetObserver(CameraObserver *);
int RemoveObserver(CameraObserver *p);
CAP_STATUS mStatus;
static Camera *GetInstance(void)
{
static Camera *instance = nullptr;
if (nullptr == instance)
instance = new Camera();
return instance;
}
void SetDebug(bool);
std::vector<std::wstring> EnumAllCamera(void);
static std::vector<std::wstring> EnumAllCamera(void);
GUID mPixFmt;
bool Open(std::wstring &camera_name);
bool Close(void);