|
|
@@ -22,13 +22,11 @@
|
|
|
#include <DbgHelp.h>
|
|
|
#pragma comment(lib, "dbghelp.lib")
|
|
|
#else
|
|
|
-
|
|
|
+#include "videorenderobj.h"
|
|
|
+#include <signal.h>
|
|
|
#endif // RVC_OS_WIN
|
|
|
|
|
|
|
|
|
-
|
|
|
-//#include "../../Other/libvideohorflip/videohorflip.h"
|
|
|
-
|
|
|
#include "cv.h"
|
|
|
#include "highgui.h"
|
|
|
#include "y2k_time.h"
|
|
|
@@ -118,16 +116,15 @@ struct video_session_t
|
|
|
HWND local_hwnd; // preview window
|
|
|
HWND remote_hwnd; // remote window
|
|
|
#else
|
|
|
-
|
|
|
+ VideoRenderObj* plocal_render;
|
|
|
+ VideoRenderObj* premote_render;
|
|
|
+ pthread_t ui_threadid;
|
|
|
#endif // RVC_OS_WIN
|
|
|
|
|
|
-
|
|
|
picture_record_t* pic_record;
|
|
|
};
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
static void __dbg(void *user_data, const char *fmt, va_list arg)
|
|
|
{
|
|
|
vDbg(fmt, arg);
|
|
|
@@ -489,6 +486,7 @@ static int on_remoteWinstate(videoplayer_t *player, void *user_data, video_frame
|
|
|
return *session->conf.ref_window_state ;
|
|
|
}
|
|
|
//±¾µØ»ØÏԻص÷
|
|
|
+
|
|
|
static int on_pull(videoplayer_t *player, void *user_data, video_frame **frame)
|
|
|
{
|
|
|
video_session_t *session = (video_session_t*)user_data;
|
|
|
@@ -938,6 +936,58 @@ static void show_remote_agnet_picture(video_session_t *t_session)
|
|
|
}
|
|
|
|
|
|
|
|
|
+static int start_video_rtpsession(video_session_t* session)
|
|
|
+{
|
|
|
+ int rc = -1;
|
|
|
+ videortp_config_t config = { 0 };
|
|
|
+ config.fps_den = REC_COMMON_VIDEO_FPS_DEN;
|
|
|
+ if (session->conf.eDeviceType == eMobilePadType)
|
|
|
+ {
|
|
|
+ config.fps_num = REC_COMMON_VIDEO_FPS_MOBILE_AGENT;
|
|
|
+ }
|
|
|
+ else if ((session->conf.eDeviceType == ePadtype) || (session->conf.eDeviceType == eDesk2SType) || (session->conf.eDeviceType == eDesk1SType) || (session->conf.eDeviceType == eDesk2SIntegratedType))
|
|
|
+ {
|
|
|
+ config.fps_num = REC_COMMON_VIDEO_FPS_MOBILE;
|
|
|
+ }
|
|
|
+ else if (session->conf.eDeviceType == eStand2sType)
|
|
|
+ {
|
|
|
+ config.fps_num = REC_COMMON_VIDEO_FPS_NUM;
|
|
|
+ }
|
|
|
+ config.capture_height = -1; // not use
|
|
|
+ config.capture_width = -1; // not use
|
|
|
+ config.dir = 3;
|
|
|
+ config.tx_width = REC_COMMON_VIDEO_RTP_WIDTH;
|
|
|
+ config.tx_height = REC_COMMON_VIDEO_RTP_HEIGHT;
|
|
|
+ config.rx_width = session->conf.remote_video_width;
|
|
|
+ config.rx_height = session->conf.remote_video_height;
|
|
|
+ config.local_ip = session->conf.local_rtp_ip;
|
|
|
+ config.local_pt = session->conf.local_pt;
|
|
|
+ config.remote_pt = session->conf.local_pt;
|
|
|
+ config.local_rtp_port = session->conf.local_rtp_port;
|
|
|
+ config.mtu = session->conf.mtu;
|
|
|
+ config.quant = session->conf.video_quant;
|
|
|
+ config.remote_ip = session->conf.remote_rtp_ip;
|
|
|
+ config.remote_rtp_port = session->conf.remote_rtp_port;
|
|
|
+ config.user_data = session;
|
|
|
+ config.bit_rate = session->conf.bit_rate;
|
|
|
+ config.on_rx_frame = &on_rx_frame;
|
|
|
+ config.dbg = &__dbg;
|
|
|
+ videortp_create(&config, &session->rtp);
|
|
|
+ rc = videortp_start(session->rtp);
|
|
|
+ if (rc != 0)
|
|
|
+ {
|
|
|
+ Dbg("start video rtp failed!");
|
|
|
+ videortp_destroy(session->rtp);
|
|
|
+ session->rtp = NULL;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Dbg("videortp_start suc.");
|
|
|
+ }
|
|
|
+
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static int start_video(video_session_t *session)
|
|
|
{
|
|
|
LOG_FUNCTION();
|
|
|
@@ -1187,51 +1237,54 @@ static int start_video(video_session_t *session)
|
|
|
{
|
|
|
if (0 != session->conf.remote_rtp_port)
|
|
|
{
|
|
|
- videortp_config_t config = {0};
|
|
|
- config.fps_den = REC_COMMON_VIDEO_FPS_DEN;
|
|
|
- if (session->conf.eDeviceType == eMobilePadType)
|
|
|
- {
|
|
|
- config.fps_num = REC_COMMON_VIDEO_FPS_MOBILE_AGENT;
|
|
|
- }
|
|
|
- else if((session->conf.eDeviceType == ePadtype)||(session->conf.eDeviceType == eDesk2SType)||(session->conf.eDeviceType == eDesk1SType)||(session->conf.eDeviceType == eDesk2SIntegratedType))
|
|
|
- {
|
|
|
- config.fps_num = REC_COMMON_VIDEO_FPS_MOBILE;
|
|
|
- }
|
|
|
- else if(session->conf.eDeviceType == eStand2sType)
|
|
|
- {
|
|
|
- config.fps_num = REC_COMMON_VIDEO_FPS_NUM;
|
|
|
- }
|
|
|
- config.capture_height = -1; // not use
|
|
|
- config.capture_width = -1; // not use
|
|
|
- config.dir = 3;
|
|
|
- config.tx_width = REC_COMMON_VIDEO_RTP_WIDTH;
|
|
|
- config.tx_height = REC_COMMON_VIDEO_RTP_HEIGHT;
|
|
|
- config.rx_width = session->conf.remote_video_width;
|
|
|
- config.rx_height = session->conf.remote_video_height;
|
|
|
- config.local_ip = session->conf.local_rtp_ip;
|
|
|
- config.local_pt = session->conf.local_pt;
|
|
|
- config.remote_pt = session->conf.local_pt;
|
|
|
- config.local_rtp_port = session->conf.local_rtp_port;
|
|
|
- config.mtu = session->conf.mtu;
|
|
|
- config.quant = session->conf.video_quant;
|
|
|
- config.remote_ip = session->conf.remote_rtp_ip;
|
|
|
- config.remote_rtp_port = session->conf.remote_rtp_port;
|
|
|
- config.user_data = session;
|
|
|
- config.bit_rate = session->conf.bit_rate;
|
|
|
- config.on_rx_frame = &on_rx_frame;
|
|
|
- config.dbg = &__dbg;
|
|
|
- videortp_create(&config, &session->rtp);
|
|
|
- rc = videortp_start(session->rtp);
|
|
|
- if (rc != 0)
|
|
|
- {
|
|
|
- Dbg("start video rtp failed!");
|
|
|
- videortp_destroy(session->rtp);
|
|
|
- session->rtp = NULL;
|
|
|
+ //videortp_config_t config = {0};
|
|
|
+ //config.fps_den = REC_COMMON_VIDEO_FPS_DEN;
|
|
|
+ //if (session->conf.eDeviceType == eMobilePadType)
|
|
|
+ //{
|
|
|
+ // config.fps_num = REC_COMMON_VIDEO_FPS_MOBILE_AGENT;
|
|
|
+ //}
|
|
|
+ //else if((session->conf.eDeviceType == ePadtype)||(session->conf.eDeviceType == eDesk2SType)||(session->conf.eDeviceType == eDesk1SType)||(session->conf.eDeviceType == eDesk2SIntegratedType))
|
|
|
+ //{
|
|
|
+ // config.fps_num = REC_COMMON_VIDEO_FPS_MOBILE;
|
|
|
+ //}
|
|
|
+ //else if(session->conf.eDeviceType == eStand2sType)
|
|
|
+ //{
|
|
|
+ // config.fps_num = REC_COMMON_VIDEO_FPS_NUM;
|
|
|
+ //}
|
|
|
+ //config.capture_height = -1; // not use
|
|
|
+ //config.capture_width = -1; // not use
|
|
|
+ //config.dir = 3;
|
|
|
+ //config.tx_width = REC_COMMON_VIDEO_RTP_WIDTH;
|
|
|
+ //config.tx_height = REC_COMMON_VIDEO_RTP_HEIGHT;
|
|
|
+ //config.rx_width = session->conf.remote_video_width;
|
|
|
+ //config.rx_height = session->conf.remote_video_height;
|
|
|
+ //config.local_ip = session->conf.local_rtp_ip;
|
|
|
+ //config.local_pt = session->conf.local_pt;
|
|
|
+ //config.remote_pt = session->conf.local_pt;
|
|
|
+ //config.local_rtp_port = session->conf.local_rtp_port;
|
|
|
+ //config.mtu = session->conf.mtu;
|
|
|
+ //config.quant = session->conf.video_quant;
|
|
|
+ //config.remote_ip = session->conf.remote_rtp_ip;
|
|
|
+ //config.remote_rtp_port = session->conf.remote_rtp_port;
|
|
|
+ //config.user_data = session;
|
|
|
+ //config.bit_rate = session->conf.bit_rate;
|
|
|
+ //config.on_rx_frame = &on_rx_frame;
|
|
|
+ //config.dbg = &__dbg;
|
|
|
+ //videortp_create(&config, &session->rtp);
|
|
|
+ //rc = videortp_start(session->rtp);
|
|
|
+ //if (rc != 0)
|
|
|
+ //{
|
|
|
+ // Dbg("start video rtp failed!");
|
|
|
+ // videortp_destroy(session->rtp);
|
|
|
+ // session->rtp = NULL;
|
|
|
+ // goto on_error;
|
|
|
+ //}
|
|
|
+ //else{
|
|
|
+ // Dbg("videortp_start suc.");
|
|
|
+ //}
|
|
|
+ if (0 != start_video_rtpsession(session)) {
|
|
|
goto on_error;
|
|
|
}
|
|
|
- else{
|
|
|
- Dbg("videortp_start suc.");
|
|
|
- }
|
|
|
|
|
|
if (DOUBLERECORD_CALLTYPE == session->conf.nCallType){
|
|
|
if (NULL != pg_last_session){
|
|
|
@@ -1278,14 +1331,11 @@ static int start_video(video_session_t *session)
|
|
|
show_remote_agnet_picture(session);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
on_error:
|
|
|
-
|
|
|
+ return rc;
|
|
|
#else
|
|
|
-
|
|
|
+ return start_video_rtpsession(session);
|
|
|
#endif // RVC_OS_WIN
|
|
|
-
|
|
|
- return rc;
|
|
|
}
|
|
|
|
|
|
static void stop_video(video_session_t *session)
|
|
|
@@ -1337,7 +1387,15 @@ static void stop_video(video_session_t *session)
|
|
|
session->local_encode_sws_ctx_opt = NULL;
|
|
|
}
|
|
|
#else
|
|
|
-
|
|
|
+ if (session->rtp){
|
|
|
+ Dbg("begin stop video rtp.");
|
|
|
+ videortp_stop(session->rtp);
|
|
|
+ videortp_destroy(session->rtp);
|
|
|
+ session->rtp = NULL;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Dbg("session->rtp == null");
|
|
|
+ }
|
|
|
|
|
|
#endif // RVC_OS_WIN
|
|
|
}
|
|
|
@@ -1585,14 +1643,12 @@ static LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
|
|
|
|
#endif //
|
|
|
|
|
|
-
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
static unsigned int __stdcall ui_proc(void *arg)
|
|
|
{
|
|
|
video_session_t *session = (video_session_t*)arg;
|
|
|
Dbg("ui_proc session addr is %0x", session);
|
|
|
|
|
|
-#ifdef RVC_OS_WIN
|
|
|
-
|
|
|
WNDCLASSA wc = {0};
|
|
|
ATOM a = 0;
|
|
|
HWND hWnd = NULL;
|
|
|
@@ -1731,13 +1787,58 @@ static unsigned int __stdcall ui_proc(void *arg)
|
|
|
|
|
|
CoUninitialize();
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
#else
|
|
|
+void* videorender_func(void* arg)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ video_session_t* session = (video_session_t*)arg;
|
|
|
+ Dbg("%s:%d session addr is 0x%0x, session->plocal_render = 0x%0x", __FUNCTION__, __LINE__, session, session->plocal_render);
|
|
|
+
|
|
|
+ if (NULL != session->premote_render)
|
|
|
+ {
|
|
|
+ start_video(session);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (NULL != session->plocal_render){
|
|
|
+
|
|
|
+ videorender_param_t tparam = { 0 };
|
|
|
+ tparam.icx = 0;
|
|
|
+ tparam.icy = 0;
|
|
|
+ tparam.uwidth = REC_COMMON_VIDEO_PREVIEW_WIDTH;
|
|
|
+ tparam.uheight = REC_COMMON_VIDEO_PREVIEW_WIDTH;
|
|
|
+ tparam.uvideowidth = REC_COMMON_VIDEO_PREVIEW_WIDTH;
|
|
|
+ tparam.uvideoheight = REC_COMMON_VIDEO_PREVIEW_HEIGHT;
|
|
|
+ tparam.ivideoformat = VIDEO_FORMAT_RGB24;
|
|
|
+ if (0 == session->plocal_render->SetVideoRenderParam(&tparam)){
|
|
|
+ usleep(1000 * 1000 * 2);
|
|
|
+ session->plocal_render->ShowVideoWindow();
|
|
|
+
|
|
|
+ video_frame* frm = video_frame_new(REC_COMMON_VIDEO_PREVIEW_WIDTH, REC_COMMON_VIDEO_PREVIEW_HEIGHT, VIDEO_FORMAT_RGB24);
|
|
|
+
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ video_frame_fill_black(frm);
|
|
|
+ video_frame* tmp_frame_preview = video_frame_new(REC_COMMON_VIDEO_PREVIEW_WIDTH, REC_COMMON_VIDEO_PREVIEW_HEIGHT, VIDEO_FORMAT_RGB24);
|
|
|
+ videoq_frame frm;
|
|
|
+ frm.data = tmp_frame_preview->data[0];
|
|
|
+ BOOL result = session->video_shm_q_preview->GetVideo(&frm, VIDEOQUEUE_FLAG_HORIZONTAL_FLIP);
|
|
|
+ if (result){
|
|
|
+ session->plocal_render->RenderVideoFrame(tmp_frame_preview);
|
|
|
+ }
|
|
|
+ usleep(1000 * 20);
|
|
|
+ }
|
|
|
+ video_frame_delete(frm);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
-#endif // RVC_OS_WIN
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+#endif // RVC_OS_WIN
|
|
|
+
|
|
|
static int start_ui(video_session_t *session)
|
|
|
{
|
|
|
LOG_FUNCTION();
|
|
|
@@ -1782,10 +1883,19 @@ static int start_ui(video_session_t *session)
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
}
|
|
|
+ return 0;
|
|
|
#else
|
|
|
|
|
|
+ int err = pthread_create(&session->ui_threadid, NULL, videorender_func, session);
|
|
|
+ if (0 == err) {
|
|
|
+ Dbg("create video render thread success, %lu.", session->ui_threadid);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Dbg("create video render thread failed.");
|
|
|
+ }
|
|
|
+
|
|
|
+ return err;
|
|
|
#endif // RVC_OS_WIN
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
static void stop_ui(video_session_t *session)
|
|
|
@@ -1843,6 +1953,16 @@ static void stop_ui(video_session_t *session)
|
|
|
Dbg("set pg_last_session to null.");
|
|
|
|
|
|
#else
|
|
|
+ int kill_ret = pthread_kill(session->ui_threadid, 0);
|
|
|
+ if (ESRCH == kill_ret){
|
|
|
+ Dbg("pthread_kill failed for thread is not exsist or has stopped!");
|
|
|
+ }
|
|
|
+ else if (EINVAL == kill_ret) {
|
|
|
+ Dbg("pthread_kill failed for signal is not valid!");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Dbg("pthread_kill success");
|
|
|
+ }
|
|
|
|
|
|
#endif // RVC_OS_WIN
|
|
|
}
|
|
|
@@ -1980,6 +2100,11 @@ int Local_video_session_create(const video_session_conf_t *conf, video_session_t
|
|
|
Dbg("load record area picture failed.");
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+#else
|
|
|
+ session->plocal_render = new VideoRenderObj();
|
|
|
+#endif
|
|
|
*p_session = session;
|
|
|
}
|
|
|
return 0;
|
|
|
@@ -2113,6 +2238,12 @@ int video_session_create(const video_session_conf_t *conf, video_session_t **p_s
|
|
|
session->video_shm_q_opt = new Clibvideoqueue(REC_COMMON_VIDEO_OPT_SHM_RTP_QUEUE);
|
|
|
}
|
|
|
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+#else
|
|
|
+ session->plocal_render = new VideoRenderObj();
|
|
|
+ session->premote_render = new VideoRenderObj();
|
|
|
+
|
|
|
+#endif
|
|
|
*p_session = session;
|
|
|
}
|
|
|
return 0;
|