Browse Source

Z991239-6077 #comment: 增加视频框支持拖拽功能

80274480 8 months ago
parent
commit
6b37c3c933

+ 7 - 2
Module/mod_sipphone/mod_sipphone.cpp

@@ -3275,8 +3275,13 @@ int CSIPPhoneSession::stop_video_render()
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("stop video render failed.");
 	}
 
-	DestroyVideoRenderObj(m_pEntity->m_render->plocal_render);
-	DestroyVideoRenderObj(m_pEntity->m_render->premote_render);
+	if (NULL != m_pEntity->m_render->plocal_render) {
+		DestroyVideoRenderObj(m_pEntity->m_render->plocal_render);
+	}
+
+	if (NULL != m_pEntity->m_render->premote_render) {
+		DestroyVideoRenderObj(m_pEntity->m_render->premote_render);
+	}
 
 	delete(m_pEntity->m_render);
 	m_pEntity->m_render = NULL;

+ 63 - 78
Module/mod_sipphone/video_render.cpp

@@ -75,13 +75,13 @@ static bool get_local_video_frame(video_frame** frame, int itype, Clibvideoqueue
 	videoq_frame frm;
 	frm.data = tmp_frame_preview->data[0];
 
-	static bool blog = true;
-	if (blog) {
-		int ivideo_width = 0;
-		int ivideo_height = 0;
-		int isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
-		blog = false;
-	}
+	//static bool blog = true;
+	//if (blog) {
+	//	int ivideo_width = 0;
+	//	int ivideo_height = 0;
+	//	int isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
+	//	blog = false;
+	//}
 
 	result = local_video_queue->GetVideo(&frm, VIDEOQUEUE_FLAG_HORIZONTAL_FLIP);
 	if (result){
@@ -209,7 +209,6 @@ static void* rvc_videorender_func(void* arg)
 {
 	rvc_video_render_t* param = (rvc_video_render_t*)arg;
 	int ilocal_video_fresh_time = param->render_param.ilocal_fresh_time;
-	bool bremote_video = false;
 
 	Clibvideoqueue* local_video_queue = NULL;
 	RVC_RendererFlip renderflip = RVC_FLIP_VERTICAL;
@@ -239,90 +238,56 @@ static void* rvc_videorender_func(void* arg)
 		tparam.uheight = param->render_param.ilocal_view_cy;
 		tparam.ivideoformat = VIDEO_FORMAT_RGB24;
 		if (0 == param->plocal_render->VideoRenderSetParam(&tparam)) {
-			param->plocal_render->HideVideoWindow();
+			//param->plocal_render->HideVideoWindow();
 		}
 		else {
 			return 0;
 		}
 	}
 
-	if (0 != param->render_param.iremote_view_cx && 0 != param->render_param.iremote_view_cy) {
-		if (NULL != param->premote_render) {
-			videorender_param_t tparam_remote = { 0 };
-			tparam_remote.icx = param->render_param.iremote_view_x;
-			tparam_remote.icy = param->render_param.iremote_view_y;
-			tparam_remote.uwidth = param->render_param.iremote_view_cx;
-			tparam_remote.uheight = param->render_param.iremote_view_cy;
-			tparam_remote.ivideoformat = VIDEO_FORMAT_RGB24;
-			if (0 != param->premote_render->VideoRenderSetParam(&tparam_remote)) {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video render set param failed.");
-			}
-			bremote_video = true;
-		}
-		else {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("remote video render is null.");
-		}
-	}
-
-	if (NULL != param->plocal_render) {
-		bool bshow_local = false;
-		bool bset = true;
+	param->plocal_render->StartVideoRender();
+	ivideo_width = 0;
+	ivideo_height = 0;
+	isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
 
-		param->plocal_render->StartVideoRender();
-		ivideo_width = 0;
-		ivideo_height = 0;
-		isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
-
-		for (; ; ) {
+	for (; ; ) {
 #ifdef RVC_OS_WIN
-			DWORD dwRet = WaitForSingleObject(param->local_render_stop_event, ilocal_video_fresh_time);
-			if (WAIT_TIMEOUT == dwRet) {
+		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)){
+		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)){
 #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);
-
-				if (NULL != local_video_frame) {
-					video_frame* localframe = NULL;
-					if (0 == translate_image_resolution(&localframe, param->render_param.ilocal_view_cx, param->render_param.ilocal_view_cy, local_video_frame)) {					
-						param->plocal_render->RenderVideoFrame(localframe, renderflip);
-						video_frame_delete(localframe);
-						localframe = NULL;
-					}
-					else {
-						param->plocal_render->RenderVideoFrame(local_video_frame, renderflip);
-					}
-
-					bshow_local = true;
-					video_frame_delete(local_video_frame);
-					local_video_frame = NULL;
-				}
-			}
-			else {
-				param->plocal_render->HideVideoWindow();
-				break;
-			}
+			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);
 
-			if (bset) {
-				if (bshow_local) {
-					param->plocal_render->ShowVideoWindow();
-					if (bremote_video) {
-						param->premote_render->ShowVideoWindow();
-					}
-					bset = false;
+			if (NULL != local_video_frame) {
+				video_frame* localframe = NULL;
+				if (0 == translate_image_resolution(&localframe, param->render_param.ilocal_view_cx, param->render_param.ilocal_view_cy, local_video_frame)) {					
+					param->plocal_render->RenderVideoFrame(localframe, renderflip);
+					video_frame_delete(localframe);
+					localframe = NULL;
 				}
+				else {
+					param->plocal_render->RenderVideoFrame(local_video_frame, renderflip);
+				}
+
+				video_frame_delete(local_video_frame);
+				local_video_frame = NULL;
 			}
 		}
-		param->plocal_render->StopVideoRender();
+		else {
+			param->plocal_render->HideVideoWindow();
+			break;
+		}
 	}
-
+	param->plocal_render->StopVideoRender();
+	
 	if (NULL != personimage) {
 		cvReleaseImage(&personimage);
 	}
@@ -454,10 +419,26 @@ static unsigned int __stdcall rvc_optcam_videorender_func(void* arg)
 #else
 static void* rvc_optcam_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;
 	
+	if (NULL != param->premote_render) {
+		videorender_param_t tparam_remote = { 0 };
+		tparam_remote.icx = param->render_param.iremote_view_x;
+		tparam_remote.icy = param->render_param.iremote_view_y;
+		tparam_remote.uwidth = param->render_param.iremote_view_cx;
+		tparam_remote.uheight = param->render_param.iremote_view_cy;
+		tparam_remote.ivideoformat = VIDEO_FORMAT_RGB24;
+		if (0 != param->premote_render->VideoRenderSetParam(&tparam_remote)) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video render set param failed.");
+		}
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("remote video render is null.");
+		return 0;
+	}
+
 	Clibvideoqueue* local_optvideo_queue = new Clibvideoqueue(REC_COMMON_VIDEO_OPT_SHM_SNAPSHOT_QUEUE);
 	int iwidth = REC_COMMON_VIDEO_SNAPSHOT_HEIGHT;
 	int iheight = REC_COMMON_VIDEO_SNAPSHOT_WIDTH;
@@ -468,6 +449,8 @@ static void* rvc_optcam_videorender_func(void* arg)
 	renderflip = RVC_FLIP_HORIZONTAL;
 #endif
 
+	param->premote_render->StartVideoRender();
+
 	for (; ; ) {
 #ifdef RVC_OS_WIN
 		DWORD dwRet = WaitForSingleObject(param->remote_render_stop_event, iremote_video_fresh_time);
@@ -502,6 +485,8 @@ static void* rvc_optcam_videorender_func(void* arg)
 			break;
 		}
 	}
+	
+	param->premote_render->StopVideoRender();
 
 	return 0;
 }

+ 4 - 2
Other/libvideorender/ivideorenderinterface.cpp

@@ -8,9 +8,11 @@ IVideoRender* CreateVideoRenderObj(videorender_callback_t* pCallback)
 }
 
 
-void  DestroyVideoRenderObj(IVideoRender* pIVideoCapture)
+void  DestroyVideoRenderObj(IVideoRender* pIVideoRender)
 {
-	pIVideoCapture->VideoRenderDestroy();
+	if (NULL != pIVideoRender) {
+		pIVideoRender->VideoRenderDestroy();
+	}	
 }
 
 int VideoRender_Init()

+ 0 - 2
Other/libvideorender/ivideorenderinterface.h

@@ -31,8 +31,6 @@ typedef struct videorender_param_s {
 	uint32_t uvideoheight;
 	uint32_t uwidth;
 	uint32_t uheight;
-	uint32_t uwinflags;
-	bool bpersonarea;
 	int ivideoformat;
 	bool bmoveable;
 }videorender_param_t;

+ 48 - 21
Other/libvideorender/libvideorender.cpp

@@ -8,7 +8,7 @@
 #endif
 
 #ifndef RVC_DEFAULT_DELAY_TIME
-#define RVC_DEFAULT_DELAY_TIME 1
+#define RVC_DEFAULT_DELAY_TIME 10
 #endif
 
 
@@ -20,7 +20,7 @@ VideoRenderImpl::VideoRenderImpl(videorender_callback_t* pCallback)
 	memcpy(&m_callback, pCallback, sizeof(videorender_callback_t));
 
 	m_refresh_flag = false;
-	m_bmoveable = false;
+	m_bmoveable = true;
 	m_refresh_thread = NULL;
 
 	m_cx = SDL_WINDOWPOS_UNDEFINED;
@@ -28,7 +28,7 @@ VideoRenderImpl::VideoRenderImpl(videorender_callback_t* pCallback)
 	m_width = 0;
 	m_height = 0;
 	m_videoformat = VIDEO_FORMAT_RGB24;
-	m_flags = SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_BORDERLESS | SDL_WINDOW_HIDDEN | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU;
+	m_flags = SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS | SDL_WINDOW_ALWAYS_ON_TOP;
 }
 
 
@@ -74,8 +74,6 @@ int VideoRenderImpl::SetWindowProperty(videorender_param_t* tparam)
 		m_videoheight = tparam->uvideoheight;
 	}
 
-	m_flags |= tparam->uwinflags;
-
 	m_videoformat = tparam->ivideoformat;
 
 	iRet = 0;
@@ -86,7 +84,6 @@ int VideoRenderImpl::SetWindowProperty(videorender_param_t* tparam)
 SDL_PixelFormatEnum VideoRenderImpl::GetPixelFormat()
 {
 	SDL_PixelFormatEnum eType = SDL_PIXELFORMAT_BGR24;
-	//SDL_PixelFormatEnum eType = SDL_PIXELFORMAT_BGR888;
 	if (VIDEO_FORMAT_I420 == m_videoformat){
 		eType = SDL_PIXELFORMAT_IYUV;
 	}
@@ -107,7 +104,7 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 		//	return -1;
 		//}
 
-		SDL_SetHint("SDL_HINT_RENDER_SCALE_QUALITY", "1");
+		SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
 
 		m_sdl_window = SDL_CreateWindow(
 			"rvc video",    // window title
@@ -141,6 +138,7 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 		if (m_width > display_mode.w) {
 			m_width = display_mode.w;
 		}
+
 		if (m_height > display_mode.h) {
 			m_height = display_mode.h;
 		}
@@ -155,6 +153,7 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 		VideoRenderDestroy();
 		return -5;
 	}
+
 	static bool blog = true;
 	/* Print the list of the available renderers*/
 	if (blog) {
@@ -169,10 +168,10 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 			if (blog) {
 				RenderLog(RENDER_LOG_DEBUG, " %2d: %s", i, rend_info->name);
 			}
-			//m_callback->Debug("    SDL_RENDERER_TARGETTEXTURE [%c]", (rend_info->flags & SDL_RENDERER_TARGETTEXTURE) ? 'X' : ' ');
-			//m_callback->Debug("    SDL_RENDERER_SOFTWARE      [%c]", (rend_info->flags & SDL_RENDERER_SOFTWARE) ? 'X' : ' ');
-			//m_callback->Debug("    SDL_RENDERER_ACCELERATED   [%c]", (rend_info->flags & SDL_RENDERER_ACCELERATED) ? 'X' : ' ');
-			//m_callback->Debug("    SDL_RENDERER_PRESENTVSYNC  [%c]", (rend_info->flags & SDL_RENDERER_PRESENTVSYNC) ? 'X' : ' ');
+			//RenderLog(RENDER_LOG_DEBUG,"    SDL_RENDERER_TARGETTEXTURE [%c]", (rend_info->flags & SDL_RENDERER_TARGETTEXTURE) ? 'X' : ' ');
+			//RenderLog(RENDER_LOG_DEBUG,"    SDL_RENDERER_SOFTWARE      [%c]", (rend_info->flags & SDL_RENDERER_SOFTWARE) ? 'X' : ' ');
+			//RenderLog(RENDER_LOG_DEBUG,"    SDL_RENDERER_ACCELERATED   [%c]", (rend_info->flags & SDL_RENDERER_ACCELERATED) ? 'X' : ' ');
+			//RenderLog(RENDER_LOG_DEBUG,"    SDL_RENDERER_PRESENTVSYNC  [%c]", (rend_info->flags & SDL_RENDERER_PRESENTVSYNC) ? 'X' : ' ');
 		}
 	}
 	free(rend_info);
@@ -191,8 +190,7 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 			SDL_RENDERER_TARGETTEXTURE |
 			SDL_RENDERER_SOFTWARE);
 
-		if (m_renderer == NULL)
-		{
+		if (m_renderer == NULL){
 			RenderLog(RENDER_LOG_ERROR, "RENDER: (SDL2) Couldn't get a software renderer: %s", SDL_GetError());
 			RenderLog(RENDER_LOG_ERROR, "RENDER: (SDL2) giving up...");
 			VideoRenderDestroy();
@@ -247,14 +245,13 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 static int refresh_video(void *opaque)
 {
 	VideoRenderImpl* pImpl = (VideoRenderImpl*)opaque;
-	pImpl->RenderLog(RENDER_LOG_DEBUG, "function enter %s:%d", __FUNCTION__, __LINE__);
+
 	while (pImpl->GetReFreshFlag()) {
 		SDL_Event event;
 		event.type = REFRESH_EVENT;
 		SDL_PushEvent(&event);
 		SDL_Delay(RVC_DEFAULT_DELAY_TIME);
 	}
-	pImpl->RenderLog(RENDER_LOG_DEBUG, "function leave %s:%d", __FUNCTION__, __LINE__);
 
 	return 0;
 }
@@ -269,6 +266,11 @@ static SDL_HitTestResult SDLCALL SDL_HitTestCallback(SDL_Window *win, const SDL_
 	VideoRenderImpl* pImpl = (VideoRenderImpl*)data;
 
 	SDL_GetWindowSize(win, &w, &h);
+	
+	pImpl->RenderLog(RENDER_LOG_DEBUG, "win = 0x%08x, current windows is 0x%08x.", win, pImpl->GetRenderWindow());
+	pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_GetWindowSize area->x = %d, area->y = %d, w = %d, h = %d.", area->x, area->y, w, h);
+
+	return SDL_HITTEST_DRAGGABLE;
 
 	if (area->x < RESIZE_BORDER) {
 		if (area->y < RESIZE_BORDER) {
@@ -281,7 +283,8 @@ static SDL_HitTestResult SDLCALL SDL_HitTestCallback(SDL_Window *win, const SDL_
 			pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_LEFT");
 			return SDL_HITTEST_RESIZE_LEFT;
 		}
-	} else if (area->x >= (w-RESIZE_BORDER)) {
+	} 
+	else if (area->x >= (w-RESIZE_BORDER)) {
 		if (area->y < RESIZE_BORDER) {
 			pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_TOPRIGHT");
 			return SDL_HITTEST_RESIZE_TOPRIGHT;
@@ -292,17 +295,19 @@ static SDL_HitTestResult SDLCALL SDL_HitTestCallback(SDL_Window *win, const SDL_
 			pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_RIGHT");
 			return SDL_HITTEST_RESIZE_RIGHT;
 		}
-	} else if (area->y >= (h-RESIZE_BORDER)) {
+	} 
+	else if (area->y >= (h-RESIZE_BORDER)) {
 		pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_BOTTOM");
 		return SDL_HITTEST_RESIZE_BOTTOM;
-	} else if (area->y < RESIZE_BORDER) {
+	} 
+	else if (area->y < RESIZE_BORDER) {
 		pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_TOP");
 		return SDL_HITTEST_RESIZE_TOP;
-	} else if (area->y < DRAGGABLE_TITLE) {
+	} 
+	else if (area->y < DRAGGABLE_TITLE) {
 		pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_DRAGGABLE");
 		return SDL_HITTEST_DRAGGABLE;
 	}
-	return SDL_HITTEST_NORMAL;
 }
 
 
@@ -316,8 +321,16 @@ int VideoRenderImpl::StartVideoRender()
 	m_refresh_flag = true;
 	m_refresh_thread = SDL_CreateThread(refresh_video,"refresh video thread", this);
 	RenderLog(RENDER_LOG_DEBUG, "%s:%d m_refresh_thread is 0x%08x.",__FUNCTION__, __LINE__, m_refresh_thread);
+	if (NULL == m_refresh_thread) {
+		RenderLog(RENDER_LOG_ERROR, "SDL_Create refresh video thread failed: %s.", SDL_GetError());
+		return -1;
+	}
+
 	if (m_bmoveable){
-		SDL_SetWindowHitTest(m_sdl_window, SDL_HitTestCallback, this);
+		if (0 != SDL_SetWindowHitTest(m_sdl_window, SDL_HitTestCallback, this)) {
+			RenderLog(RENDER_LOG_ERROR, "SDL_SetWindowHitTest failed: %s.", SDL_GetError());
+			return -1;
+		}
 	}
 
 	return 0;
@@ -413,6 +426,20 @@ int VideoRenderImpl::RenderVideoFrame(video_frame* pframe, RVC_RendererFlip eFli
 
 		SDL_Delay(RVC_DEFAULT_DELAY_TIME);
 	}
+	else if(SDL_MOUSEBUTTONDOWN == event.type)
+	{
+		RenderLog(RENDER_LOG_DEBUG, "Mouse button pressed down.");
+		RenderLog(RENDER_LOG_DEBUG, "  - Mouse position: (%d, %d)", event.button.x, event.button.y);
+		RenderLog(RENDER_LOG_DEBUG, "  - Mouse button: %d.", event.button.button);
+	}
+	else if (SDL_MOUSEBUTTONUP == event.type) {
+		RenderLog(RENDER_LOG_DEBUG, "Mouse button released.");
+		RenderLog(RENDER_LOG_DEBUG, "  - Mouse position: (%d, %d)", event.button.x, event.button.y);
+		RenderLog(RENDER_LOG_DEBUG, "  - Mouse button: %d", event.button.button);
+	}
+	else {
+		//RenderLog(RENDER_LOG_DEBUG, "SDL_WaitEvent type is %d.", event.type);
+	}
 
 	iret = 0;
 

+ 4 - 1
Other/libvideorender/libvideorender.h

@@ -20,7 +20,6 @@ class VideoRenderImpl : public IVideoRender
 {
 public:
 	VideoRenderImpl(videorender_callback_t* pCallback);
-	~VideoRenderImpl();
 
 	int VideoRenderSetParam(videorender_param_t* tparam);
 	int StartVideoRender();
@@ -35,6 +34,10 @@ public:
 	void ConVert24to32(unsigned char* image_in, unsigned char* image_out, int w, int h);
 	bool GetReFreshFlag();
 	void RenderLog(render_loglevel elevel, const char* fmt, ...);
+	SDL_Window* GetRenderWindow() { return m_sdl_window; }
+
+private:
+	~VideoRenderImpl();
 
 private:
 	SDL_Window* m_sdl_window;