Browse Source

Z991239-5945 #comment 优化windows下上下摄像头回显功能

80274480 8 months ago
parent
commit
afabe86bff

+ 2 - 3
Module/mod_sipphone/CMakeLists.txt

@@ -15,12 +15,9 @@ if(MSVC)
 	uuid.cpp 
 	volumekeeper.h 
 	volumekeeper.cpp
-	
 	)
 else()
 	set(${SIPPHONE_PLATFORM}_SRCS
-	video_render.h
-	video_render.cpp
 	)
 endif(MSVC)
 
@@ -34,6 +31,8 @@ set(${MODULE_PREFIX}_SRCS
     SIPPhone_server_g.h
     video_session.h
 	mod_sipphone.h
+	video_render.h
+	video_render.cpp
 	endpoint.cpp
     audio_session.cpp
     mod_sipphone.cpp

+ 21 - 12
Module/mod_sipphone/mod_sipphone.cpp

@@ -114,22 +114,21 @@ static void __audiomgrlog(void* user_data, const char* fmt, va_list arg)
 	}
 }
 
-#ifdef RVC_OS_WIN
-#else
+
 
 static void __video_render_log(render_loglevel elevel, void* user_data, const char* fmt, va_list arg)
 {
-	int n = vsnprintf(NULL, 0, fmt, arg);
+	int n = rvc_vsnprintf(NULL, 0, fmt, arg);
 	if (elevel >= RENDER_LOG_INFO) {
 		if (n >= MAX_PATH) {
 			char* buf = (char*)malloc((size_t)(n + 1));
-			vsnprintf(buf, n + 1, fmt, arg);
+			rvc_vsnprintf(buf, n + 1, fmt, arg);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", buf);
 			free(buf);
 		}
 		else {
 			char strlog[MAX_PATH] = { 0 };
-			vsnprintf(strlog, MAX_PATH, fmt, arg);
+			rvc_vsnprintf(strlog, MAX_PATH, fmt, arg);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", strlog);
 		}
 	}
@@ -140,9 +139,15 @@ static int __on_stop_remote_video_render_callback(void* user_data)
 	int iret = -1;
 	CSIPEntity* pThis = static_cast<CSIPEntity*>(user_data);
 	if (NULL != pThis->m_render) {
+#ifdef RVC_OS_WIN
+		if (NULL != pThis->m_render->remote_render_thread) {
+			iret = rvc_stop_remote_video_render(pThis->m_render);
+		}
+#else
 		if (pThis->m_render->remote_render_threadid > 0) {
 			iret = rvc_stop_remote_video_render(pThis->m_render);
 		}
+#endif
 	}
 
 	return iret;
@@ -161,7 +166,6 @@ static int __on_window_type_callback(void* user_data)
 	return pThis->m_stVideoParam.bShowPersonArea;
 }
 
-#endif
 
 static CSimpleStringA generateAudioInfoJson(const char* handfreeIn, const char* handfreeOut, const char* pickupIn, const char* pickupOut)
 {
@@ -2431,8 +2435,6 @@ CSimpleStringA CSIPEntity::GetAudioDeviceJsonInfos(bool bmicro)
 int CSIPEntity::StartCameraRender(int icamid, int ivideoview_x, int ivideoview_y, int ivideoview_cx, int ivideoview_cy)
 {
 	int iRet = -1;
-#ifdef RVC_OS_WIN
-#else
 	m_render = new rvc_video_render_t();
 	videorender_callback_t t_callback = { 0 };
 	t_callback.debug = &__video_render_log;
@@ -2447,8 +2449,14 @@ int CSIPEntity::StartCameraRender(int icamid, int ivideoview_x, int ivideoview_y
 	LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_LOCAL_VIDEO_RENDER_CREATE, "local video render create.");
 
 	memcpy(&m_render->render_param, &render_param, sizeof(rvc_video_render_params_t));
+
+#ifdef RVC_OS_WIN
+	m_render->local_render_thread = NULL;
+	m_render->remote_render_thread = NULL;
+#else
 	m_render->local_render_threadid = 0;
 	m_render->remote_render_threadid = 0;
+#endif // RVC_OS_WIN
 
 	rvc_video_box_move_callback_t t_render_callback = { 0 };
 	t_render_callback.on_video_box_move = &__on_video_box_move;
@@ -2463,7 +2471,6 @@ int CSIPEntity::StartCameraRender(int icamid, int ivideoview_x, int ivideoview_y
 	if (Error_Succeed == rvc_start_video_render(m_render, false, &t_render_callback)) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start video render success.");
 	}
-#endif // RVC_OS_WIN
 
 	iRet = 0;
 
@@ -2473,8 +2480,7 @@ int CSIPEntity::StartCameraRender(int icamid, int ivideoview_x, int ivideoview_y
 int CSIPEntity::StopCameraRender()
 {
 	int iRet = -1;
-#ifdef RVC_OS_WIN
-#else
+
 	if (Error_Succeed == rvc_stop_video_render(m_render)) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("stop video render success.");
 	}
@@ -2482,13 +2488,16 @@ int CSIPEntity::StopCameraRender()
 		DestroyVideoRenderObj(m_render->plocal_render);
 	}
 
+#ifdef RVC_OS_WIN
+
+#else
 	if (NULL != &m_render->local_render_stop_sem) {
 		sem_destroy(&m_render->local_render_stop_sem);
 	}
+#endif // RVC_OS_WIN
 
 	delete(m_render);
 	m_render = NULL;
-#endif // RVC_OS_WIN
 
 	iRet = 0;
 

+ 4 - 11
Module/mod_sipphone/mod_sipphone.h

@@ -11,11 +11,12 @@ using namespace SIPPhone;
 #if defined(RVC_OS_WIN)
 #include "volumekeeper.h"
 #else
-#include "video_render.h"
 #include "Event.h"
 #include "EventCode.h"
 #endif //RVC_OS_WIN
 
+#include "video_render.h"
+
 #include "HealthManager_client_g.h"
 #include "HealthManager_def_g.h"
 using namespace HealthManager;
@@ -63,14 +64,6 @@ using namespace AssistantChannel;
 #endif
 #endif
 
-#ifndef rvc_snprintf
-#ifdef RVC_OS_WIN
-#define rvc_snprintf _snprintf
-#else
-#define rvc_snprintf snprintf
-#endif // RVC_OS_WIN
-#endif // rvc_snprintf
-
 typedef enum
 {
 	RVC_AUDIO_NO_ERROR = 0x0,				
@@ -376,11 +369,11 @@ public:
 	void* m_pKeeperIn[2];
 	void* m_pKeeperOut[2];
 	eVideoRenderType m_eVideoRenderType;
-#else
+#endif
+
 	int m_ilocalvideo_freshtime;
 	int m_iremotevideo_freshtime;
 	rvc_video_render_t* m_render;
-#endif
 
 	bool m_bAudioMgrInited;
 	CSimpleStringA m_strStartTime;

+ 58 - 17
Module/mod_sipphone/video_render.cpp

@@ -6,11 +6,6 @@
 #include "rvc_media_common.h"
 #include "fileutil.h"
 
-extern "C"{
-	#include <libavutil/avutil.h>
-	#include <libavcodec/avcodec.h>
-	#include <libswscale/swscale.h>
-}
 #include "video_common/ffmpeg_api_cpp_adapter.h"
 
 #include "cv.h"
@@ -135,7 +130,11 @@ int rvc_remote_video_render(rvc_video_render_t* prender, void* videoframe)
 	return 0;
 }
 
-void* rvc_videorender_func(void* arg)
+#ifdef RVC_OS_WIN
+static unsigned int __stdcall rvc_videorender_func(void* arg)
+#else
+static void* rvc_videorender_func(void* arg)
+#endif
 {
 	rvc_video_render_t* param = (rvc_video_render_t*)arg;
 	int ilocal_video_fresh_time = param->render_param.ilocal_fresh_time;
@@ -180,7 +179,7 @@ void* rvc_videorender_func(void* arg)
 	}
 
 	char strPersonPath[MAX_PATH] = { 0 };
-	snprintf(strPersonPath, MAX_PATH, "./bin/rxk.jpg");
+	rvc_snprintf(strPersonPath, MAX_PATH, "./bin/rxk.jpg");
 	IplImage* personimage = NULL;
 	IplImage* personmask = NULL;
 
@@ -233,13 +232,17 @@ void* rvc_videorender_func(void* arg)
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d isize = %d, ivideo_width = %d, ivideo_height = %d.", __FUNCTION__, __LINE__, isize, ivideo_width, ivideo_height);
 
 		for (; ; ) {
+#ifdef RVC_OS_WIN
+			DWORD dwRet = WaitForSingleObject(param->local_render_stop_event, ilocal_video_fresh_time);
+			if (WAIT_TIMEOUT == dwRet) {
+#else
 			struct timespec ts;
 			clock_gettime(CLOCK_REALTIME, &ts);
 			long unsec = ts.tv_nsec + (1000 * 1000 * ilocal_video_fresh_time);
 			ts.tv_sec += (unsec / 1000000000);
 			ts.tv_nsec = (unsec % 1000000000);
-			if (0 != sem_timedwait(&param->local_render_stop_sem, &ts) && (ETIMEDOUT == errno))
-			{
+			if (0 != sem_timedwait(&param->local_render_stop_sem, &ts) && (ETIMEDOUT == errno)){
+#endif
 				video_frame* local_video_frame = NULL;
 				int iwindowstate = param->cb.on_window_type(param->cb.user_data);
 				get_local_video_frame(&local_video_frame, iwindowstate, local_video_queue, iwidth, iheight, personimage, personmask);
@@ -289,8 +292,11 @@ void* rvc_videorender_func(void* arg)
 	return 0;
 }
 
-
-void* rvc_remote_videorender_func(void* arg)
+#ifdef RVC_OS_WIN
+static unsigned int __stdcall rvc_remote_videorender_func(void* arg)
+#else
+static void* rvc_remote_videorender_func(void* arg)
+#endif
 {
 	rvc_video_render_t* param = (rvc_video_render_t*)arg;
 	int iremote_video_fresh_time = param->render_param.iremote_fresh_time;
@@ -300,7 +306,7 @@ void* rvc_remote_videorender_func(void* arg)
 
 	Clibvideoqueue* video_shm_q_remote = new Clibvideoqueue(REC_COMMON_VIDEO_REMOTE_SHM_RTP_QUEUE);
 	
-	snprintf(strImgPath, MAX_PATH, "%s", "./bin/agent.jpg");
+	rvc_snprintf(strImgPath, MAX_PATH, "%s", "./bin/agent.jpg");
 
 	video_frame* remote_frame = video_frame_new(irecord_video_frame_width, irecord_video_frame_heigt, VIDEO_FORMAT_RGB24);
 	video_frame_fill_black(remote_frame);
@@ -353,12 +359,17 @@ void* rvc_remote_videorender_func(void* arg)
 	}
 
 	for (; ; ) {
+#ifdef RVC_OS_WIN
+		DWORD dwRet = WaitForSingleObject(param->remote_render_stop_event, iremote_video_fresh_time);
+		if (WAIT_TIMEOUT == dwRet){
+#else
 		struct timespec ts;
 		clock_gettime(CLOCK_REALTIME, &ts);
 		long unsec = ts.tv_nsec + (1000 * 1000 * iremote_video_fresh_time);
 		ts.tv_sec += (unsec / 1000000000);
 		ts.tv_nsec = (unsec % 1000000000);
 		if (0 != sem_timedwait(&param->remote_render_stop_sem, &ts) && (ETIMEDOUT == errno)){
+#endif // RVC_OS_WIN
 			rvc_remote_video_render(param, showframe);
 			if (NULL != video_shm_q_remote){
 				rc = rvc_video_shm_enqueue(video_shm_q_remote, remote_frame, VIDEOQUEUE_FLAG_VERTICAL_FLIP, iframeid++);
@@ -384,13 +395,24 @@ void* rvc_remote_videorender_func(void* arg)
 
 int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_box_move_callback_t* cb)
 {
+	int errcode = -1;
+#ifdef RVC_OS_WIN
+	prender->local_render_stop_event = CreateEventA(NULL, false, false, NULL);
+	prender->local_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_videorender_func, prender, 0, NULL);
+
+	if (bremote) {
+		prender->remote_render_stop_event = CreateEventA(NULL, false, false, NULL);
+		prender->remote_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_remote_videorender_func, prender, 0, NULL);
+	}
+
+#else
 	if (0 != sem_init(&prender->local_render_stop_sem, 0, 0)) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create local stop sem failed!");
 		return Error_Resource;
 	}
 
-	int err = pthread_create(&prender->local_render_threadid, NULL, rvc_videorender_func, prender);
-	if (Error_Succeed != err) {
+	errcode = pthread_create(&prender->local_render_threadid, NULL, rvc_videorender_func, prender);
+	if (Error_Succeed != errcode) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create local video render thread failed.");
 		return Error_Resource;
 	}
@@ -401,14 +423,15 @@ int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_
 			return Error_Resource;
 		}
 
-		err = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
-		if (Error_Succeed != err) {
+		errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
+		if (Error_Succeed != errcode) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote video render thread failed.");
 			return Error_Resource;
 		}
 	}
+#endif // RVC_OS_WIN
 
-	return err;
+	return errcode;
 }
 
 
@@ -418,6 +441,14 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
 		return Error_Param;
 	}
 
+#ifdef RVC_OS_WIN
+	SetEvent(prender->local_render_stop_event);
+	rvc_stop_remote_video_render(prender);
+	if (NULL != prender->local_render_thread) {
+		WaitForSingleObject(prender->local_render_thread, INFINITE);
+		prender->local_render_thread = NULL;
+	}
+#else
 	sem_post(&prender->local_render_stop_sem);
 	rvc_stop_remote_video_render(prender);
 	if (prender->local_render_threadid > 0) {
@@ -428,11 +459,20 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video render thread pthread join error for %s.", strerror(errno));
 		}
 	}
+#endif // RVC_OS_WIN
+
 	return Error_Succeed;
 }
 
 int rvc_stop_remote_video_render(rvc_video_render_t* prender)
 {
+#ifdef RVC_OS_WIN
+	SetEvent(prender->remote_render_stop_event);
+	if (NULL != prender->remote_render_thread) {
+		WaitForSingleObject(prender->remote_render_thread, INFINITE);
+		prender->remote_render_thread = NULL;
+	}
+#else
 	if (prender->remote_render_threadid > 0) {
 		sem_post(&prender->remote_render_stop_sem);
 		if (0 == pthread_join(prender->remote_render_threadid, NULL)) {
@@ -442,6 +482,7 @@ int rvc_stop_remote_video_render(rvc_video_render_t* prender)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("remote video render thread pthread join error for %s.", strerror(errno));
 		}
 	}
+#endif
 
 	return Error_Succeed;
 }

+ 14 - 2
Module/mod_sipphone/video_render.h

@@ -2,16 +2,25 @@
 
 #include "ivideorenderinterface.h"
 #ifdef _WIN32
+#include <windows.h>
+#include <process.h>
 #else
 #include<semaphore.h>
 #endif // _WIN32
 
 
-
 #ifndef MAX_PATH
 #define MAX_PATH 260
 #endif
 
+#ifndef rvc_snprintf
+#ifdef RVC_OS_WIN
+#define rvc_snprintf _snprintf
+#else
+#define rvc_snprintf snprintf
+#endif // RVC_OS_WIN
+#endif // rvc_snprintf
+
 enum eVideoRenderQueue {
 	ePreview_Queue,
 	eSnapshot_Queue
@@ -56,7 +65,10 @@ typedef struct rvc_video_render_s {
 	IVideoRender* plocal_render;
 	IVideoRender* premote_render;
 #ifdef _WIN32
-
+	HANDLE local_render_thread;
+	HANDLE local_render_stop_event;
+	HANDLE remote_render_thread;
+	HANDLE remote_render_stop_event;
 #else
 	pthread_t local_render_threadid;
 	sem_t local_render_stop_sem;

+ 3 - 1
Other/win/libvideoframework/video_common/ffmpeg_api_cpp_adapter.h

@@ -1,8 +1,10 @@
 #ifndef __FFMPEG_API_CPP_ADAPTER_H__
 #define __FFMPEG_API_CPP_ADAPTER_H__
 
-
+#ifndef av_always_inline
 #define av_always_inline __inline
+#endif
+
 #define inline __inline
 
 #ifndef INT64_C