⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rdv2edemodlg.cpp

📁 这个程序包里有3个部分:直播服务器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -