Ver código fonte

Z991239-3559 #comment 优化连线时图像渲染流程

80274480 3 anos atrás
pai
commit
b0c198a8c8

+ 13 - 11
Module/mod_sipphone/endpoint.cpp

@@ -206,7 +206,7 @@ static __inline struct in_addr __lton(unsigned long ip)
 	return addr;
 }
 
-static void endpoint_media_update_video(endpoint_call_t *call, media_desc_t *video_desc)
+static void endpoint_media_update_video(endpoint_call_t *call, media_desc_t *video_desc, rvc_video_render_callback_t* cb)
 {
 	LOG_FUNCTION();
 	if (video_desc->media_dir == DIR_NONE) 
@@ -313,7 +313,8 @@ static void endpoint_media_update_video(endpoint_call_t *call, media_desc_t *vid
 		video_conf.nCallType = call->nCallType;
 		//video_conf.local_move = local_hwd_move;
 		//video_conf.remote_move = remote_hwd_move;
-		//video_conf.video_echo_cb = cb;
+		Dbg("%s:%d video_render_cb = 0x%08x and video_render_cb->on_video_render = 0x%08x, video_render_cb->user_data = 0x%08x.", __FUNCTION__, __LINE__, cb, cb->on_video_render, cb->user_data);
+		memcpy(&video_conf.video_render_cb, cb, sizeof(rvc_video_render_callback_t));
 		video_conf.ilocal_wind_flags = VIDEOPLAYER_FLAG_PULL|VIDEOPLAYER_FLAG_CHECKTOP;
 		video_conf.iremote_wind_flags = VIDEOPLAYER_FLAG_PUSH|VIDEOPLAYER_FLAG_CHECKTOP;
 		//video_conf.ilvideo_ft = local_fresh_time;
@@ -1040,7 +1041,7 @@ static void on_state(CONDITION_PARAMS)
 	}
 }
 
-void Terminatedcall(endpoint_call_t *call)
+void terminatedcall(endpoint_call_t *call)
 {
 	int st = TERMINATED;
 	g_IsExternalTerminalted = TRUE;
@@ -1506,14 +1507,14 @@ int endpoint_call_hangup(endpoint_call_t *call)
 }
 
 
-int endpoint_call_start_video(endpoint_call_t* call, endpoint_call_param_t* pcallparam)
+int endpoint_call_start_video(endpoint_call_t* call, endpoint_call_param_t* pcallparam, rvc_video_render_callback_t* render_cb)
 {
-	char local_ip_str[128]={0};
-	char remtote_ip_str[128]={0};
 	LOG_FUNCTION();
-
-	translate_ipaddr_from_int(local_ip_str, 128, pcallparam->local_ip);
-	translate_ipaddr_from_int(remtote_ip_str, 128, pcallparam->remote_ip);
+	char local_ip_str[RVC_MAX_IP_LEN]={0};
+	char remtote_ip_str[RVC_MAX_IP_LEN]={0};
+	
+	translate_ipaddr_from_int(local_ip_str, RVC_MAX_IP_LEN, pcallparam->local_ip);
+	translate_ipaddr_from_int(remtote_ip_str, RVC_MAX_IP_LEN, pcallparam->remote_ip);
 	
 	Dbg("Assist channel video local: %s:%d, remote_ip:%s:%d", local_ip_str, pcallparam->local_port, remtote_ip_str, pcallparam->remote_port);
 	if (call) 
@@ -1552,7 +1553,8 @@ int endpoint_call_start_video(endpoint_call_t* call, endpoint_call_param_t* pcal
 		//video_desc.param[i++] = pcallparam->remote_hwd_move;
 		//video_desc.param[i++] = pcallparam->local_fresh_time;
 		//video_desc.param[i++] = pcallparam->remote_fresh_time;
-		endpoint_media_update_video(call, &video_desc);
+		Dbg("%s:%d video_render_cb = 0x%08x and video_render_cb->on_video_render = 0x%08x, video_render_cb->user_data = 0x%08x.", __FUNCTION__, __LINE__, render_cb, render_cb->on_video_render, render_cb->user_data);
+		endpoint_media_update_video(call, &video_desc, render_cb);
 
 		char str_local_ip[RVC_MAX_IP_LEN]={0};
 		char str_remtote_ip[RVC_MAX_IP_LEN]={0};
@@ -1576,7 +1578,7 @@ int endpoint_call_stop_video(endpoint_call_t *call)
 	if (call) {
 		media_desc_t video_desc = {0};
 		video_desc.media_dir = DIR_NONE;
-		endpoint_media_update_video(call, &video_desc);
+		endpoint_media_update_video(call, &video_desc, NULL);
 		return 0;
 	} else {
 		return Error_Param;

+ 3 - 5
Module/mod_sipphone/endpoint.h

@@ -116,12 +116,10 @@ int new_media_port(endpoint_t *ep);
 void endpoint_call_destroy(endpoint_call_t *call);
 int endpoint_call_start(endpoint_call_t *call);
 int endpoint_call_hangup(endpoint_call_t *call);
-/*
-	add by chenlp 20190826  新增int local_move和int remote_move参数,分别用于设置本地和远端视频窗口是否支持移动
-*/
-int endpoint_call_start_video(endpoint_call_t *call, endpoint_call_param_t* pcallparam);
+
+int endpoint_call_start_video(endpoint_call_t *call, endpoint_call_param_t* pcallparam, rvc_video_render_callback_t* render_cb);
 int endpoint_call_stop_video(endpoint_call_t *call);
-void Terminatedcall(endpoint_call_t *call);
+void terminatedcall(endpoint_call_t *call);
 int translate_ipaddr_from_int(char* strdst, unsigned ulen, unsigned long uip);
 
 #endif // ENDPOINT_H

+ 22 - 5
Module/mod_sipphone/mod_sipphone.cpp

@@ -67,8 +67,7 @@ static void __on_video_box_move(int imessagetype, int ivideotype, int ileft, int
 
 CSIPPhoneSession::CSIPPhoneSession(CSIPEntity *pEntity) : m_pEntity(pEntity), m_pCall(NULL), m_iLastState(0),m_IsLocalPlay(0)
 {
-	m_cb_video_box_move.on_video_box_move = &__on_video_box_move;
-	m_cb_video_box_move.user_data = this;
+
 }
 
 
@@ -132,6 +131,14 @@ static void __video_render_log(void* user_data, const char* fmt, va_list arg)
 	vDbg(fmt, arg);
 }
 
+static int __remote_video_render_callback(void* videoframe, void* user_data)
+{
+	LOG_FUNCTION();
+	CSIPEntity* pThis = static_cast<CSIPEntity*>(user_data);
+	rvc_start_remote_video_render(pThis->m_render, videoframe);
+	
+	return 0;
+}
 
 CSIPEntity::CSIPEntity() : m_pCurrentSession(NULL), m_state(INIT),m_iPickupPhoneState(ePickupMicrophoneState_Off) 
 {
@@ -2383,7 +2390,7 @@ void CSIPPhoneSession::hangup_call(HangupCallCommand* cmd)
 void CSIPPhoneSession::release_call()
 {
 	if (m_pCall){
-		Terminatedcall(m_pCall);
+		terminatedcall(m_pCall);
 	}
 
 }
@@ -2498,7 +2505,12 @@ void CSIPPhoneSession::control_video( ControlVideoCommand *pCmd )
 			render_param.iremote_move = pCmd->remote_hwd_move;
 			render_param.ilocal_fresh_time = pCmd->local_fresh_time;
 			render_param.iremote_fresh_time = pCmd->remote_fresh_time;
-			endpoint_call_start_video(m_pCall, &callparam);
+
+			rvc_video_render_callback_t t_callback = { 0 };
+			t_callback.user_data = m_pEntity;
+			t_callback.on_video_render = &__remote_video_render_callback;
+			Dbg("%s:%d video_render_cb = 0x%08x and video_render_cb->on_video_render = 0x%08x, video_render_cb->user_data = 0x%08x.", __FUNCTION__, __LINE__, &t_callback, t_callback.on_video_render, t_callback.user_data);
+			endpoint_call_start_video(m_pCall, &callparam, &t_callback);
 			start_video_render(&render_param);
 		} 
 		else {
@@ -2571,7 +2583,12 @@ int CSIPPhoneSession::start_video_render(rvc_video_render_params_t* render_param
 	Dbg("%s:%d premote_render = 0x%8x", __FUNCTION__, __LINE__, m_pEntity->m_render->premote_render);
 	LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_REMOTE_VIDEO_RENDER_CREATE, "remote video render create.");
 	memcpy(&m_pEntity->m_render->location_param, render_param, sizeof(rvc_video_render_params_t));
-	if (Error_Succeed == rvc_start_video_render(m_pEntity->m_render, &m_cb_video_box_move)) {
+	
+	rvc_video_box_move_callback_t t_render_callback = { 0 };
+	t_render_callback.on_video_box_move = &__on_video_box_move;
+	t_render_callback.user_data = this;
+
+	if (Error_Succeed == rvc_start_video_render(m_pEntity->m_render, &t_render_callback)) {
 		Dbg("start video render success.");
 	}
 

+ 0 - 1
Module/mod_sipphone/mod_sipphone.h

@@ -213,7 +213,6 @@ private:
 	CSIPEntity *m_pEntity;	
 	int m_IsLocalPlay;
 	//eShowVideoWindowType m_VideoWindowPlayType;			/*add by clp 20190903  0:only remote video window, 1:only local video window, 2:both local and remote window */
-	rvc_video_render_callback_t m_cb_video_box_move;
 };
 
 

+ 30 - 3
Module/mod_sipphone/video_render.cpp

@@ -164,7 +164,7 @@ void* rvc_videorender_func(void* arg)
 	return 0;
 }
 
-int rvc_start_video_render(rvc_video_render_t* prender, rvc_video_render_callback_t* cb)
+int rvc_start_video_render(rvc_video_render_t* prender, rvc_video_box_move_callback_t* cb)
 {
 	if (0 != sem_init(&prender->ui_stop_sem, 0, 0)) {
 		Dbg("%s:%d create ui stop event failed!", __FUNCTION__, __LINE__);
@@ -196,11 +196,38 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
 			prender->ui_threadid = 0;
 		}
 		else {
-			Dbg("video render thread pthread join error for %s", strerror(errno));
+			Dbg("video render thread pthread join error for %s.", strerror(errno));
 		}
 	}
 
-	Dbg("ui thread exit!");
+	Dbg("video render thread exit!");
 
 	return Error_Succeed;
+}
+
+
+int rvc_start_remote_video_render(rvc_video_render_t* prender, void* videoframe)
+{
+	LOG_FUNCTION();
+	if (NULL != prender->premote_render) {
+		Dbg("session plocal_render RenderVideoFrame");
+		video_frame* echoframe = NULL;
+		if (0 == translate_image_resolution(&echoframe, prender->location_param.iremote_view_cx, prender->location_param.iremote_view_cy, (const video_frame*)videoframe)) {
+			prender->premote_render->RenderVideoFrame(echoframe, RVC_FLIP_VERTICAL);
+			//session->bshow_remote = true;
+			video_frame_delete(echoframe);
+			echoframe = NULL;
+		}
+		else {
+			prender->premote_render->RenderVideoFrame((video_frame*)videoframe, RVC_FLIP_VERTICAL);
+			//session->bshow_remote = true;
+		}
+	}
+
+	//if (false == session->bremoterender) {
+	//	LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_REMOTE_VIDEO_RENDER_STARTED, "start remote video render.");
+	//	session->bremoterender = true;
+	//}
+
+	return 0;
 }

+ 12 - 3
Module/mod_sipphone/video_render.h

@@ -3,11 +3,18 @@
 #include "../../Other/libvideorender/ivideorenderinterface.h"
 #include<semaphore.h>
 
-typedef struct rvc_video_render_callback_s {
+typedef struct rvc_video_box_move_callback_s {
 	void (*on_video_box_move)(int imessagetype, int ivideotype, int ileft, int ibottom, void* user_data);
 	void* user_data;
+}rvc_video_box_move_callback_t;
+
+
+typedef struct rvc_video_render_callback_s {
+	int (*on_video_render)(void* videoframe, void* user_data);
+	void* user_data;
 }rvc_video_render_callback_t;
 
+
 typedef struct rvc_video_render_params_s {
 	int ilocal_view_x;
 	int ilocal_view_y;
@@ -32,5 +39,7 @@ typedef struct rvc_video_render_s {
 	rvc_video_render_params_t location_param;
 }rvc_video_render_t;
 
-int rvc_start_video_render(rvc_video_render_t* prender, rvc_video_render_callback_t* cb);
-int rvc_stop_video_render(rvc_video_render_t* prender);
+
+int rvc_start_video_render(rvc_video_render_t* prender, rvc_video_box_move_callback_t* cb);
+int rvc_stop_video_render(rvc_video_render_t* prender);
+int rvc_start_remote_video_render(rvc_video_render_t* prender, void* videoframe);

+ 17 - 12
Module/mod_sipphone/video_session.cpp

@@ -470,18 +470,23 @@ static int on_rx_frame(video_frame *frame, void *user_data)
 	//	icount++;
 	//}
 	//if (NULL != session->premote_render){
-		//Dbg("session plocal_render RenderVideoFrame");
-		//video_frame* echoframe = NULL;
-		//if (0 == translate_image_resolution(&echoframe,session->conf.remote_video_view_cx,session->conf.remote_video_view_cy, frame)) {
-		//	session->premote_render->RenderVideoFrame(echoframe, RVC_FLIP_VERTICAL);
-		//	session->bshow_remote = true;
-		//	video_frame_delete(echoframe);
-		//	echoframe = NULL;
-		//}
-		//else {
-		//	session->premote_render->RenderVideoFrame(frame, RVC_FLIP_VERTICAL);
-		//	session->bshow_remote = true;
-		//}
+	//	Dbg("session plocal_render RenderVideoFrame");
+	//	video_frame* echoframe = NULL;
+	//	if (0 == translate_image_resolution(&echoframe,session->conf.remote_video_view_cx,session->conf.remote_video_view_cy, frame)) {
+	//		session->premote_render->RenderVideoFrame(echoframe, RVC_FLIP_VERTICAL);
+	//		session->bshow_remote = true;
+	//		video_frame_delete(echoframe);
+	//		echoframe = NULL;
+	//	}
+	//	else {
+	//		session->premote_render->RenderVideoFrame(frame, RVC_FLIP_VERTICAL);
+	//		session->bshow_remote = true;
+	//	}
+
+		Dbg("%s:%d session->conf.video_render_cb = 0x%08x and session->conf.video_render_cb->on_video_render = 0x%08x, session->conf.video_render_cb->user_data = 0x%08x.", __FUNCTION__, __LINE__, session->conf.video_render_cb, session->conf.video_render_cb.on_video_render, session->conf.video_render_cb.user_data);
+		session->conf.video_render_cb.on_video_render(frame, session->conf.video_render_cb.user_data);
+		Dbg("%s:%d", __FUNCTION__, __LINE__);
+
 		used = 1;
 
 		if (false == session->bremoterender) {

+ 2 - 20
Module/mod_sipphone/video_session.h

@@ -2,6 +2,7 @@
 #include "../include/EventCode.h"
 #include "../mod_counterconnector/CallType.h"
 #include "endpoint.h"
+#include "video_render.h"
 
 typedef struct video_session_conf_t
 {
@@ -9,25 +10,10 @@ typedef struct video_session_conf_t
 	int local_rtp_port;
 	unsigned long remote_rtp_ip;
 	int remote_rtp_port;
-
 	int remote_video_width;
 	int remote_video_height;
-
-	// remote video params
-	//int remote_video_view_x;
-	//int remote_video_view_y;
-	//int remote_video_view_cx;
-	//int remote_video_view_cy;
-
-	// local video params
-	//int local_video_view_x;
-	//int local_video_view_y;
-	//int local_video_view_cx;
-	//int local_video_view_cy;
-
 	int camera_count;
 	int screen_count;
-
 	volatile int *ref_active_camera;
 	volatile int *ref_camera_switch;
 	volatile int *ref_window_state;
@@ -40,17 +26,13 @@ typedef struct video_session_conf_t
 	int mtu;
 	int video_quant; // 0-10
 	int bit_rate; // 256*1024
-	//int ilvideo_ft;
-	//int irvideo_ft;
 	DeviceTypeEnum eDeviceType;
 	CallingTypeEnum nCallType; 
 	int local_pt;	
 	int remote_pt;
-	//int local_move;
-	//int remote_move;
 	int ilocal_wind_flags;
 	int iremote_wind_flags;
-	rvc_video_render_callback_t* video_echo_cb;
+	rvc_video_render_callback_t video_render_cb;
 }video_session_conf_t;
 
 typedef struct video_session_t video_session_t;