📄 videonetdlg.cpp
字号:
}
/**
* Show / Hide the local video screen
*/
void CVideoNetDlg::OnViewLocal()
{
CMenu *menu=this->GetMenu();
if(isViewLocalVideo)
{
isViewLocalVideo=FALSE;
menu->CheckMenuItem(VIEW_LOCAL,MF_BYCOMMAND | MF_UNCHECKED);
}
else
{
isViewLocalVideo=TRUE;
menu->CheckMenuItem(VIEW_LOCAL,MF_BYCOMMAND | MF_CHECKED);
}
}
/**
* Show / Hide the remote video screen
*/
void CVideoNetDlg::OnViewRemote()
{
CMenu *menu=this->GetMenu();
if(isViewRemoteVideo)
{
isViewRemoteVideo=FALSE;
menu->CheckMenuItem(VIEW_REMOTE,MF_BYCOMMAND | MF_UNCHECKED);
}
else
{
isViewRemoteVideo=TRUE;
menu->CheckMenuItem(VIEW_REMOTE,MF_BYCOMMAND | MF_CHECKED);
}
}
/**
* Displays the volume control dialog box
*/
void CVideoNetDlg::OnVolumeControl()
{
Volume vol(IDD_DIALOG3);
vol.DoModal();
}
/**
* Enables/Disables transmission of audio
* Invoked when user presses Audio -> Send menu item
*/
void CVideoNetDlg::OnAudioSend()
{
if(isAudioSend)
{
// Stop recording audio
record->SuspendThread();
//>PostThreadMessage(WM_RECORDSOUND_STOPRECORDING,0,0);
isAudioSend=FALSE;
menu->CheckMenuItem(AUDIO_SEND,MF_BYCOMMAND | MF_UNCHECKED);
}
else
{
// Start recording audio
record->ResumeThread();
//record->PostThreadMessage(WM_RECORDSOUND_STARTRECORDING,0,0);
isAudioSend=TRUE;
menu->CheckMenuItem(AUDIO_SEND,MF_BYCOMMAND | MF_CHECKED);
}
}
/**
* Enables/Disables reception of audio
* Invoked when user presses Audio -> Receive menu item
*/
void CVideoNetDlg::OnAudioReceive()
{
if(isAudioReceive)
{
isAudioReceive=FALSE;
menu->CheckMenuItem(AUDIO_RECEIVE,MF_BYCOMMAND | MF_UNCHECKED);
}
else
{
isAudioReceive=TRUE;
menu->CheckMenuItem(AUDIO_RECEIVE,MF_BYCOMMAND | MF_CHECKED);
}
}
/**
* Enables/Disables transmission of video
* Invoked when user presses Video-> Send menu item
*/
void CVideoNetDlg::OnVideoSend()
{
if(isVideoSend)
{
isVideoSend=FALSE;
menu->CheckMenuItem(VIDEO_SEND,MF_BYCOMMAND | MF_UNCHECKED);
}
else
{
isVideoSend=TRUE;
menu->CheckMenuItem(VIDEO_SEND,MF_BYCOMMAND | MF_CHECKED);
}
}
/**
* Enables/Disables reception of video
* Invoked when user presses Video -> Receive menu item
*/
void CVideoNetDlg::OnVideoReceive()
{
if(isVideoReceive)
{
isVideoReceive=FALSE;
menu->CheckMenuItem(VIDEO_RECEIVE,MF_BYCOMMAND | MF_UNCHECKED);
}
else
{
isVideoReceive=TRUE;
menu->CheckMenuItem(VIDEO_RECEIVE,MF_BYCOMMAND | MF_CHECKED);
}
}
/**
* Display the about dialog box
*/
void CVideoNetDlg::OnAbout()
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
/**
* Send the message to remote host
*/
void CVideoNetDlg::OnSendMesg()
{
unsigned char data[500];
GetDlgItemText(IDC_EDIT1,(char*)data,500);
if(strlen((const char*)data)>0)
{
dtext.SendTextData(data,strlen((const char*)data));
SetDlgItemText(IDC_EDIT1,"");
}
}
/**
* Display mesg received from the remote host
*/
void CVideoNetDlg::DisplayMesg(char *mesg)
{
list->AddString(mesg);
// Highlight the currently added string
// This will scroll the window automatically
list->SetCurSel(list->GetCount()-1);
}
/**
* Display frame got from remote host
*/
void CVideoNetDlg::DisplayRemoteFrame(unsigned char *data,int size)
{
int retvalue;
// If remote view disabled then return...
if(!isViewRemoteVideo)
return;
// If video reception disabled..then return..
if(!isVideoReceive)
return;
retvalue=DecompressFrame(data,size,rgbdata,buffersize);
if(!retvalue)
{
log.WriteString("\n Decompression failed");
return;
}
log.WriteString("\n Decompression succeeded");
::DrawDibDraw(hdib,
m_hdc,
remote_wnd_x, // dest : left pos
remote_wnd_y, // dest : top pos
-1, // don't zoom x
-1, // don't zoom y
&m_bmpinfo->bmiHeader, // bmp header info
rgbdata, // bmp data
0, // src :left
0, // src :top
IMAGE_WIDTH, // src : width
IMAGE_HEIGHT, // src : height
DDF_SAME_DRAW // use prev params....
);
}
/**
*
* Send the video frame to the remote host...
*
*/
void CVideoNetDlg::SendVideo(BYTE *data,int size)
{
CRect wndrect;
Bits bits; // Various count about compression
if(vidcap->isOver==TRUE)
return;
if(data==NULL)
return;
// Display the captured frame...
if(isViewLocalVideo)
{
::DrawDibDraw(hdib,
m_hdc,
local_wnd_x, // dest : left pos
local_wnd_y, // dest : top pos
-1, // don't zoom x
-1, // don't zoom y
&m_bmpinfo->bmiHeader, // bmp header info
data, // bmp data
0, // src :left
0, // src :top
IMAGE_WIDTH, // src : width
IMAGE_HEIGHT, // src : height
DDF_SAME_DRAW // use prev params....
);
}
if(isVideoSend)
{
//log.WriteString("\n Converting to YUV format..");
//Convert the data from rgb format to YUV format
ConvertRGB2YUV(IMAGE_WIDTH,IMAGE_HEIGHT,data,yuv);
// Reset the counter
count=0;
//Compress the data...to h263
cparams.format=CPARAM_QCIF;
cparams.inter = CPARAM_INTRA;
cparams.Q_intra = 8;
cparams.data=yuv; // Data in YUV format...
CompressFrame(&cparams, &bits);
// Transmit the compressed frame
//log.WriteString("Transmitting the frame");
dvideo.SendVideoData(cdata,count);
}
}
/**
* Start the conference ....
*
*/
void CVideoNetDlg::StartConference()
{
// If already started....then return
if(isStarted)
return;
isStarted=TRUE;
isViewLocalVideo=TRUE;
isViewRemoteVideo=TRUE;
// Enable / Disable menu items...
menu->EnableMenuItem(CONF_CONNECT,MF_DISABLED | MF_GRAYED);
menu->EnableMenuItem(CONF_DISCONNECT,MF_ENABLED);
menu->EnableMenuItem(AUDIO_SEND,MF_ENABLED);
menu->EnableMenuItem(AUDIO_RECEIVE,MF_ENABLED);
menu->EnableMenuItem(VIDEO_SEND,MF_ENABLED);
menu->EnableMenuItem(VIDEO_RECEIVE,MF_ENABLED);
menu->EnableMenuItem(VIEW_LOCAL,MF_ENABLED);
menu->EnableMenuItem(VIEW_REMOTE,MF_ENABLED);
menu->CheckMenuItem(VIEW_LOCAL,MF_BYCOMMAND | MF_CHECKED);
menu->CheckMenuItem(VIEW_REMOTE,MF_BYCOMMAND | MF_CHECKED);
// Start text Session
dtext.CreateSocket(PORT_TEXT,TYPE_TEXT);
// Enable the send button
bsend->EnableWindow(TRUE);
// Start audio Session
daudio.CreateSocket(PORT_AUDIO,TYPE_AUDIO);
// Start video Session
dvideo.CreateSocket(PORT_VIDEO,TYPE_VIDEO);
// Start recording audio
record->PostThreadMessage(WM_RECORDSOUND_STARTRECORDING,0,0);
// Start playing audio
play->PostThreadMessage(WM_PLAYSOUND_STARTPLAYING,0,0);
// Start capturing video
if(isVideo)
{
if(vidcap->StartCapture()==FALSE)
{
MessageBox("Unable to start the capture");
isCaptureStarted=FALSE;
}
else
{
isCaptureStarted=TRUE;
}
}
}
/**
* Destroy the current conference
*/
void CVideoNetDlg::DestroyConference()
{
// If not started / already destroyed..then return;
if(isStarted==FALSE)
return;
isStarted=FALSE;
isViewLocalVideo=FALSE;
isViewRemoteVideo=FALSE;
// Enable/disable menu items
menu->EnableMenuItem(CONF_CONNECT,MF_ENABLED);
menu->EnableMenuItem(CONF_DISCONNECT,MF_DISABLED | MF_GRAYED);
// Disable Text session
dtext.CloseSocket();
// Disable the send button...
bsend->EnableWindow(FALSE);
// Clear the contents of text chat windows
SetDlgItemText(IDC_EDIT1,"");
list->ResetContent();
// If recording is going on ...then stop it
if(isAudioSend)
record->SuspendThread();
record->PostThreadMessage(WM_RECORDSOUND_STOPRECORDING,0,0);
// stop audio session
daudio.CloseSocket();
// stop playing audio
play->PostThreadMessage(WM_PLAYSOUND_STOPPLAYING,0,0);
// stop capturing video
if(isVideo && isCaptureStarted)
vidcap->StopCapture();
// stop video session
dvideo.CloseSocket();
// Update local and remote viewer..
CWnd *wnd=(CWnd*)this->GetDlgItem(IDC_LOCALVIDEO);
wnd->Invalidate(TRUE);
wnd=(CWnd*)this->GetDlgItem(IDC_REMOTEVIDEO);
wnd->Invalidate(TRUE);
// Reset the status..
record->ResumeThread();
isAudioSend=TRUE;
menu->CheckMenuItem(AUDIO_SEND,MF_BYCOMMAND | MF_CHECKED);
isAudioReceive=TRUE;
menu->CheckMenuItem(AUDIO_RECEIVE,MF_BYCOMMAND | MF_CHECKED);
isVideoSend=TRUE;
menu->CheckMenuItem(VIDEO_SEND,MF_BYCOMMAND | MF_CHECKED);
isVideoReceive=TRUE;
menu->CheckMenuItem(VIDEO_RECEIVE,MF_BYCOMMAND | MF_CHECKED);
menu->EnableMenuItem(AUDIO_SEND,MF_GRAYED);
menu->EnableMenuItem(AUDIO_RECEIVE,MF_GRAYED);
menu->EnableMenuItem(VIDEO_SEND,MF_GRAYED);
menu->EnableMenuItem(VIDEO_RECEIVE,MF_GRAYED);
menu->EnableMenuItem(VIEW_LOCAL,MF_GRAYED);
menu->EnableMenuItem(VIEW_REMOTE,MF_GRAYED);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -