📄 rdv2edemodlg.cpp
字号:
// rdV2EDemoDlg.cpp : implementation file
//
#include "stdafx.h"
#include "rdV2EDemo.h"
#include "rdV2EDemoDlg.h"
#include "rdV2Encoder.h"
#include "MsgQueue.h"
MsgQueue g_XvidData;
MsgQueue g_GsmData;
MsgQueue g_MediaData;
ULONG g_ulVFrameNo = 0;
ULONG g_ulAFrameNo = 0;
ULONG g_ulSeqNo = 0;
ULONG g_ulKeepAliveCntr = 0;
BOOL g_bWorking = FALSE;
//{{共同的部分
#define RDV2_SERVER_PORT 9001
#define TIMEOUT_PACKET_NUM 300
#define MT_REGISTER 10
#define MT_REG_RESULT 11
#define MT_VIDEO 20
#define MT_AUDIO 21
#define MT_KEEP_ALIVE 30
#define MAX_PACKET_LEN 1400
#pragma pack(1)//{{
typedef struct{
ULONG ulSeqNo;
UCHAR ucFlag;
}PACKET_HEAD;
typedef struct{
PACKET_HEAD Head;
UCHAR ucRet; //1成功,2拒绝
SHORT sWidth;
SHORT sHeight;
CHAR cFrameRate;
}REG_RESULT;
typedef struct{
PACKET_HEAD Head;
UCHAR ucKeyFrame;
ULONG ulFrameNo;
LONGLONG rtStart;
LONGLONG rtStop;
UCHAR ucSubFrameNum;
UCHAR ucSubFrameNo;
char Playload[1];
}PACKET_DATA;
#pragma pack()//}}
//}}
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CrdV2EDemoDlg dialog
CrdV2EDemoDlg::CrdV2EDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CrdV2EDemoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CrdV2EDemoDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CrdV2EDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CrdV2EDemoDlg)
DDX_Control(pDX, IDC_BUTTON_STOP, m_btnStop);
DDX_Control(pDX, IDC_BUTTON_CAPCOMP, m_btnCapComp);
DDX_Control(pDX, IDC_STATIC_DEVNAME, m_ctrlDevName);
DDX_Control(pDX, IDC_STATIC_OVERLAY_FRAME, m_OverlayFrameWnd);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CrdV2EDemoDlg, CDialog)
//{{AFX_MSG_MAP(CrdV2EDemoDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_CAPCOMP, OnButtonCapcomp)
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
ON_BN_CLICKED(IDC_BUTTON_ENUM_RES, OnButtonEnumRes)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CrdV2EDemoDlg message handlers
int FindSubString(char* szSubStr, char* szStr)
{
int iSubLen = strlen(szSubStr);
int iLen = strlen(szStr);
for(int i=0; i<iLen; i++){
int iTempLen = strlen(szStr+i);
if(iSubLen > iTempLen) return -1;
if(strncmp(szSubStr, szStr+i, iSubLen) == 0) return i;
}
return -2;
}
int _VideoHook(void* pMediaBuf, int iMediaLen, LONGLONG rtStart, LONGLONG rtStop, BOOL bKeyFrame)
{
if(!g_bWorking) return -1;
char szBuf[MAX_PACKET_LEN*2];
PACKET_DATA* pPacket = (PACKET_DATA*)szBuf;
int iLoop = (iMediaLen+MAX_PACKET_LEN-1) / MAX_PACKET_LEN;
int iLen;
for(int i=0; i<iLoop; i++){
pPacket->Head.ucFlag = MT_VIDEO;
pPacket->ucKeyFrame = bKeyFrame;
pPacket->ucSubFrameNum = iLoop;
pPacket->ucSubFrameNo = i+1;
pPacket->ulFrameNo = g_ulVFrameNo;
pPacket->rtStart = rtStart;
pPacket->rtStop = rtStop;
if(i == iLoop - 1) iLen = iMediaLen - i*MAX_PACKET_LEN;
else iLen = MAX_PACKET_LEN;
memcpy(pPacket->Playload, (char*)pMediaBuf+i*MAX_PACKET_LEN, iLen);
g_MediaData.PutMsg(szBuf, iLen + sizeof(PACKET_DATA) - 1);
}
g_ulVFrameNo++;
return 0;
static int iKeyCntr = 0;
static int iCnt = 0;
if(iCnt == 0){
CHAR ShMemName[512];
sprintf(ShMemName, "DIVX_TO_WEIL.DUMP");
if(g_XvidData.Open(ShMemName) != 0){
if(g_XvidData.Create(ShMemName, 1*1024*1024) != 0){
//return E_FAIL;
}
}
g_XvidData.ifBlock = TRUE;
}
if(bKeyFrame){
iKeyCntr++;
TRACE("\n<%04d>\n", iCnt);
}
iCnt++;
TRACE("iMediaLen = %d\n", iMediaLen);
//if(iKeyCntr > 2 && iCnt%4 != 0){ //故意丢包试验
g_XvidData.PutMsg((char*)&bKeyFrame, sizeof(bKeyFrame));
g_XvidData.PutMsg((char*)&rtStart, sizeof(rtStart));
g_XvidData.PutMsg((char*)&rtStop, sizeof(rtStop));
g_XvidData.PutMsg((char*)pMediaBuf, iMediaLen);
//}
return 0;
}
int _AudioHook(void* pMediaBuf, int iMediaLen, LONGLONG rtStart, LONGLONG rtStop, BOOL bKeyFrame)
{
if(!g_bWorking) return -1;
char szBuf[MAX_PACKET_LEN*2];
PACKET_DATA* pPacket = (PACKET_DATA*)szBuf;
int iLoop = (iMediaLen+MAX_PACKET_LEN-1) / MAX_PACKET_LEN;
int iLen;
for(int i=0; i<iLoop; i++){
pPacket->Head.ucFlag = MT_AUDIO;
pPacket->ucKeyFrame = bKeyFrame;
pPacket->ucSubFrameNum = iLoop;
pPacket->ucSubFrameNo = i+1;
pPacket->ulFrameNo = g_ulAFrameNo;
pPacket->rtStart = rtStart;
pPacket->rtStop = rtStop;
if(i == iLoop - 1) iLen = iMediaLen - i*MAX_PACKET_LEN;
else iLen = MAX_PACKET_LEN;
memcpy(pPacket->Playload, (char*)pMediaBuf+i*MAX_PACKET_LEN, iLen);
g_MediaData.PutMsg(szBuf, iLen + sizeof(PACKET_DATA) - 1);
}
g_ulAFrameNo++;
return 0;
static int iCnt = 0;
if(iCnt == 0){
CHAR ShMemName[512];
sprintf(ShMemName, "GSM610_TO_WEIL.DUMP");
if(g_GsmData.Open(ShMemName) != 0){
if(g_GsmData.Create(ShMemName, 1*1024*1024) != 0){
//return E_FAIL;
}
}
g_GsmData.ifBlock = TRUE;
}
g_GsmData.PutMsg((char*)&rtStart, sizeof(rtStart));
g_GsmData.PutMsg((char*)&rtStop, sizeof(rtStop));
g_GsmData.PutMsg((char*)pMediaBuf, iMediaLen);
iCnt++;
return 0;
}
#include <afxmt.h>
CMutex g_Mutex;
UINT CrdV2EDemoDlg::SendThreadEntry(LPVOID lpParam)
{
CrdV2EDemoDlg *This;
This=(CrdV2EDemoDlg *)lpParam;
if(This->SendThread(NULL)) return 0;
else return (ULONG)-1;
}
UINT CrdV2EDemoDlg::SendThread(LPVOID lpParam)
{
UINT nBufLen = MAX_PACKET_LEN*2;
char* szBuf = new char[nBufLen];
int iRetVal;
int nBytes2Send;
//CSocket SendSocket;
//SendSocket.Create(0, SOCK_DGRAM);
while(1){
iRetVal = g_MediaData.GetMsg(szBuf);
if(iRetVal < 0) break;
if(iRetVal == 0){
Sleep(10);
continue;
}
if(!g_bWorking) continue;
PACKET_HEAD* pPacketHead = (PACKET_HEAD*)szBuf;
pPacketHead->ulSeqNo = g_ulSeqNo++;
nBytes2Send = iRetVal;
if(m_Socket.IsBlocking()) m_Socket.CancelBlockingCall();
g_Mutex.Lock();
m_Socket.Attach(m_hSocket);
iRetVal = m_Socket.SendTo(szBuf, nBytes2Send, m_uiSourcePort, (LPCTSTR)m_strSourceAdd);
m_Socket.Detach();
g_Mutex.Unlock();
//if(iRetVal <= 0) break;
if(g_ulKeepAliveCntr++ > TIMEOUT_PACKET_NUM){
g_bWorking = FALSE;
}
}
//SendSocket.Close();
delete [] szBuf;
return 0;
}
UINT CrdV2EDemoDlg::RecvThreadEntry(LPVOID lpParam)
{
CrdV2EDemoDlg *This;
This=(CrdV2EDemoDlg *)lpParam;
if(This->RecvThread(NULL)) return 0;
else return (ULONG)-1;
}
UINT CrdV2EDemoDlg::RecvThread(LPVOID lpParam)
{
m_strSourceAdd = "";
m_uiSourcePort = 0;
UINT nBufLen = MAX_PACKET_LEN*2;
char* szBuf = new char[nBufLen];
CString strSourceAdd = "";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -