?? network_ctrl.cpp
字號:
///////////////////////////////////////////////////////// FileName: network_ctrl.cpp// Author: b1gm0use// Project: myvideo#include <iostream>#include <qwaitcondition.h>#include "network_ctrl.h"#include "capture_event.h"#include "network_ctrl_send_thread.h"#include "network_ctrl_recv_thread.h"#include "video.h"#include "audio.h"#include "network.h"#include "avi.h"using namespace std;///////////////////////////////////////////////////////// Public Functions///////////////////////////////////////////////////////// 構造函數// 其余三個為widget的子類要求的參數network_ctrl::network_ctrl( avi * avi_ptr_in, QWidget *parent, const char *name, int wFlags ) : QWidget( parent, name, wFlags ) // {{{{ verbose_output( 2, "create network_ctrl." ); ncrt = NULL; ncst = NULL; audio_send_buff_sema = NULL; video_send_buff_sema = NULL; ready_to_send_audio = NULL; ready_to_send_video = NULL; audio_buff[0] = audio_buff[1] = audio_buff[2] = NULL; video_buff[0] = video_buff[1] = video_buff[2] = NULL; video_frame = audio_frame = 0; avi_ptr = avi_ptr_in; term_sub_thread_sema = NULL; term_sub_thread = false;} // }}}// 析構函數network_ctrl::~network_ctrl( void ) // {{{{ verbose_output( 2, "delete network_ctrl." ); if ( avi_ptr->net_mode == CONNECT && NULL != ncrt ) { if ( ncrt->running() ) { ncrt->terminate(); } delete ncrt; } if ( avi_ptr->net_mode == LISTEN && NULL != ncst ) { if ( ncst->running() ) { ncst->terminate(); } delete ncst; } delete audio_send_buff_sema; delete video_send_buff_sema; delete ready_to_send_audio; delete ready_to_send_video; delete [] audio_buff[0]; delete [] audio_buff[1]; delete [] audio_buff[2]; delete [] video_buff[0]; delete [] video_buff[1]; delete [] video_buff[2]; delete term_sub_thread_sema;} // }}}// 初始化函數int network_ctrl::init ( void ) // {{{{ verbose_output( 2, "init network_ctrl." ); audio_send_buff_sema = new QSemaphore( 1 ); video_send_buff_sema = new QSemaphore( 1 ); ready_to_send_audio = new QWaitCondition; ready_to_send_video = new QWaitCondition; BUFF * temp; term_sub_thread_sema = new QSemaphore( 1 ); // 如果做做為LISTEN方,則要接收數據幀 // 開辟緩沖區 if ( avi_ptr->net_mode == LISTEN ) { if ( avi_ptr->use_g723 ) { for ( int i=0; i<3; i++ ) { temp = new BUFF [ BUFF_SIZE_G723 * LENGTH ]; audio_buff[i] = new buff_t( temp, BUFF_SIZE_G723 * LENGTH ); } } else { for ( int i=0; i<3; i++ ) { temp = new BUFF [ BUFF_SIZE_G711 * LENGTH ]; audio_buff[i] = new buff_t( temp, BUFF_SIZE_G711 * LENGTH ); } } for ( int i=0; i<3; i++ ) { temp = new BUFF [ avi_ptr->video_opt.min_width * avi_ptr->video_opt.factor * avi_ptr->video_opt.min_height * avi_ptr->video_opt.factor * 3 ]; video_buff[i] = new buff_t( temp, avi_ptr->video_opt.min_width * avi_ptr->video_opt.factor * avi_ptr->video_opt.min_height * avi_ptr->video_opt.factor * 3 ); } } return SUCCEED;} // }}}void network_ctrl::stop_running ( void ) // {{{{ if ( avi_ptr->net_mode == LISTEN ) { if ( NULL != ncst ) { (*term_sub_thread_sema)++; term_sub_thread = true; (*term_sub_thread_sema)--; cout << "before ncst wait" << endl; if ( ncst->wait() ) { cout << "before ncst wait" << endl; delete ncst; term_sub_thread = false; cout << "kill ok" << endl; ncst = NULL; return; } } } else { if ( avi_ptr->net_mode == CONNECT ) { if ( NULL != ncrt ) { (*term_sub_thread_sema)++; term_sub_thread = true; (*term_sub_thread_sema)--; cout << "before wait" << endl; if ( ncrt->wait() ) { cout << "after wait" << endl; delete ncrt; term_sub_thread = false; ncrt = NULL; cout << "kill ok" << endl; return; } } } } return;} // }}}void network_ctrl::begin_running ( void ) // {{{{ // 創建不同的連接線程 if ( avi_ptr->net_mode == LISTEN && NULL == ncst ) { ncst = new network_ctrl_send_thread( avi_ptr, this ); ncst->start(); } else { if ( avi_ptr->net_mode == CONNECT && NULL == ncrt ) { ncrt = new network_ctrl_recv_thread( avi_ptr, this ); ncrt->start(); } } return;} // }}}bool network_ctrl::running ( void ) // {{{{ if ( avi_ptr->net_mode == LISTEN ) { if ( NULL != ncst ) { return true; } else { return false; } } else { if ( avi_ptr->net_mode == CONNECT ) { if ( NULL != ncrt ) { return true; } else { return false; } } } return false;} // }}}///////////////////////////////////////////////////////// Protected Functions///////////////////////////////////////////////////////// 內部函數,用于接收自定義的事件void network_ctrl::customEvent ( QCustomEvent * e ) // {{{{ verbose_output( 4, "network_ctrl change image event." ); // 判斷事件類型,是否正確 if ( e->type() == VIDEO_NET_SEND_EVENT ) { // 視頻數據 capture_event * new_event = (capture_event *) e; BUFF * temp = new_event->get_buff(); int size = new_event->get_size(); (*video_send_buff_sema)++; memcpy( video_buff[video_frame]->buff_ptr, temp, size ); video_buff[video_frame]->buff_size = size; (*video_send_buff_sema)--; video_frame = (video_frame+1) % 3; ready_to_send_video->wakeAll(); } else { if ( e->type() == AUDIO_NET_SEND_EVENT ) { // 音頻數據 capture_event * new_event = (capture_event*) e; BUFF * temp = new_event->get_buff(); int size = new_event->get_size(); (*audio_send_buff_sema)++; memcpy( audio_buff[audio_frame]->buff_ptr, temp, size ); audio_buff[audio_frame]->buff_size = size; (*audio_send_buff_sema)--; audio_frame = (audio_frame + 1) % 3; ready_to_send_audio->wakeAll(); } else { cerr << "Error! You shouldn't be here!" << endl; cerr << "Error in network_ctrl." << endl; exit( 1 ); } }} // }}}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -