Forráskód Böngészése

Z991239-3624 #comment 优化视频框人型框显示功能

80274480 3 éve
szülő
commit
341498f86e

+ 11 - 0
Module/mod_sipphone/mod_sipphone.cpp

@@ -152,6 +152,11 @@ static int __remote_video_render_callback(void* videoframe, void* user_data)
 	return rvc_remote_video_render(pThis->m_render, videoframe);
 }
 
+static int __on_window_type_callback(void* user_data)
+{
+	CSIPEntity* pThis = static_cast<CSIPEntity*>(user_data);
+	return pThis->m_stVideoParam.bShowPersonArea;
+}
 
 CSIPEntity::CSIPEntity() : m_pCurrentSession(NULL), m_state(INIT),m_iPickupPhoneState(ePickupMicrophoneState_Off) 
 {
@@ -2653,6 +2658,12 @@ int CSIPPhoneSession::start_video_render(rvc_video_render_params_t* render_param
 	t_render_callback.on_video_box_move = &__on_video_box_move;
 	t_render_callback.user_data = this;
 
+	rvc_video_render_window_type_callback_t t_window_type_callback = { 0 };
+	t_window_type_callback.on_window_type = &__on_window_type_callback;
+	t_window_type_callback.user_data = this->m_pEntity;
+	memcpy(&m_pEntity->m_render->cb, &t_window_type_callback, sizeof(rvc_video_render_window_type_callback_t));
+	m_pEntity->m_stVideoParam.bShowPersonArea = 0;
+
 	if (Error_Succeed == rvc_start_video_render(m_pEntity->m_render, bremote, &t_render_callback)) {
 		Dbg("start video render success.");
 	}

+ 21 - 22
Module/mod_sipphone/video_render.cpp

@@ -77,23 +77,25 @@ static int get_local_video_frame(video_frame** frame, int itype, Clibvideoqueue*
 	frm.data = tmp_frame_preview->data[0];
 	//Dbg("%s:%d, session->video_shm_q_preview = 0x%08x.", __FUNCTION__, __LINE__, local_video_queue);
 	BOOL result = local_video_queue->GetVideo(&frm, VIDEOQUEUE_FLAG_HORIZONTAL_FLIP);
-	if (NULL != personimage  && NULL != personmask)
-	{
-		IplImage* img = cvCreateImageHeader(cvSize(frm.width, frm.height), IPL_DEPTH_8U, 3);
-		img->imageData = (char*)frm.data;
-		if (frm.width != personimage->width) {
-			IplImage* tmp = cvCreateImage(cvSize(frm.width, frm.height), IPL_DEPTH_8U, 3);
-			IplImage* tmpmask = cvCreateImage(cvSize(frm.width, frm.height), IPL_DEPTH_8U, 1);
-			cvResize(personimage, tmp);
-			cvResize(personmask, tmpmask);
-			cvAdd(img, tmp, img, tmpmask);
-			cvReleaseImage(&tmp);
-			cvReleaseImage(&tmpmask);
-		}
-		else {
-			cvAdd(img, personimage, img, personmask);
+	if (result && 1 == itype) {
+		if (NULL != personimage && NULL != personmask)
+		{
+			IplImage* img = cvCreateImageHeader(cvSize(frm.width, frm.height), IPL_DEPTH_8U, 3);
+			img->imageData = (char*)frm.data;
+			if (frm.width != personimage->width) {
+				IplImage* tmp = cvCreateImage(cvSize(frm.width, frm.height), IPL_DEPTH_8U, 3);
+				IplImage* tmpmask = cvCreateImage(cvSize(frm.width, frm.height), IPL_DEPTH_8U, 1);
+				cvResize(personimage, tmp);
+				cvResize(personmask, tmpmask);
+				cvAdd(img, tmp, img, tmpmask);
+				cvReleaseImage(&tmp);
+				cvReleaseImage(&tmpmask);
+			}
+			else {
+				cvAdd(img, personimage, img, personmask);
+			}
+			cvReleaseImageHeader(&img);
 		}
-		cvReleaseImageHeader(&img);
 	}
 
 	*frame = tmp_frame_preview;
@@ -163,7 +165,7 @@ void* rvc_videorender_func(void* arg)
 			tparam_remote.uheight = param->location_param.iremote_view_cy;
 			tparam_remote.ivideoformat = VIDEO_FORMAT_RGB24;
 			if (0 == param->premote_render->VideoRenderSetParam(&tparam_remote)) {
-				//param->premote_render->ShowVideoWindow();
+				Dbg("%s:%d video render set param success.",__FUNCTION__, __LINE__);
 			}
 		}
 		else {
@@ -185,7 +187,8 @@ void* rvc_videorender_func(void* arg)
 			if (0 != sem_timedwait(&param->ui_stop_sem, &ts) && (ETIMEDOUT == errno))
 			{
 				video_frame* local_video_frame = NULL;
-				int iwindowstate = get_local_video_frame(&local_video_frame, 1, local_video_queue, personimage, personmask);
+				int iwindowstate = param->cb.on_window_type(param->cb.user_data);
+				get_local_video_frame(&local_video_frame, iwindowstate, local_video_queue, personimage, personmask);
 
 				if (NULL != local_video_frame) {
 					video_frame* localframe = NULL;
@@ -368,9 +371,7 @@ int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_
 int rvc_stop_video_render(rvc_video_render_t* prender)
 {
 	sem_post(&prender->ui_stop_sem);
-
 	rvc_stop_remote_video_render(prender);
-
 	if (prender->ui_threadid > 0) {
 		if (0 == pthread_join(prender->ui_threadid, NULL)) {
 			Dbg("video render thread %u pthread join success.", prender->ui_threadid);
@@ -380,9 +381,7 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
 			Dbg("video render thread pthread join error for %s.", strerror(errno));
 		}
 	}
-
 	Dbg("video render thread exit!");
-
 	return Error_Succeed;
 }
 

+ 6 - 0
Module/mod_sipphone/video_render.h

@@ -20,6 +20,11 @@ typedef struct rvc_video_render_callback_s {
 }rvc_video_render_callback_t;
 
 
+typedef struct rvc_video_render_window_type_callback_s {
+	int (*on_window_type)(void* user_data);
+	void* user_data;
+}rvc_video_render_window_type_callback_t;
+
 typedef struct rvc_video_render_params_s {
 	int ilocal_view_x;
 	int ilocal_view_y;
@@ -44,6 +49,7 @@ typedef struct rvc_video_render_s {
 	pthread_t remote_render_threadid;
 	sem_t remote_render_stop_sem;
 	rvc_video_render_params_t location_param;
+	rvc_video_render_window_type_callback_t cb;
 }rvc_video_render_t;