浏览代码

Z991239-6115 #comment: 优化视频回显库

80274480 5 月之前
父节点
当前提交
9563929c69
共有 2 个文件被更改,包括 55 次插入148 次删除
  1. 53 145
      Other/libvideorender/libvideorender.cpp
  2. 2 3
      Other/libvideorender/libvideorender.h

+ 53 - 145
Other/libvideorender/libvideorender.cpp

@@ -8,7 +8,7 @@
 #endif
 
 #ifndef RVC_DEFAULT_DELAY_TIME
-#define RVC_DEFAULT_DELAY_TIME 10
+#define RVC_DEFAULT_DELAY_TIME 1
 #endif
 
 
@@ -23,12 +23,12 @@ VideoRenderImpl::VideoRenderImpl(videorender_callback_t* pCallback)
 	m_bmoveable = false;
 	m_refresh_thread = NULL;
 
-	m_cx = SDL_WINDOWPOS_UNDEFINED;
-	m_cy = SDL_WINDOWPOS_UNDEFINED;
+	m_x = SDL_WINDOWPOS_UNDEFINED;
+	m_y = SDL_WINDOWPOS_UNDEFINED;
 	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_BORDERLESS | SDL_WINDOW_HIDDEN | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU;
 }
 
 
@@ -37,19 +37,19 @@ VideoRenderImpl::~VideoRenderImpl()
 	if (NULL != m_rending_texture) {
 		SDL_DestroyTexture(m_rending_texture);
 		m_rending_texture = NULL;
-		//RenderLog("DestroyTexture.");
+		//RenderLog(RENDER_LOG_DEBUG, "DestroyTexture.");
 	}
 
 	if (NULL != m_renderer) {
 		SDL_DestroyRenderer(m_renderer);
 		m_renderer = NULL;
-		//RenderLog("DestroyRenderer.");
+		//RenderLog(RENDER_LOG_DEBUG, "DestroyRenderer.");
 	}
 
 	if (NULL != m_sdl_window) {
 		SDL_DestroyWindow(m_sdl_window);
 		m_sdl_window = NULL;
-		//RenderLog("DestroyWindow.");
+		//RenderLog(RENDER_LOG_DEBUG, "DestroyWindow.");
 	}
 }
 
@@ -60,8 +60,8 @@ int VideoRenderImpl::SetWindowProperty(videorender_param_t* tparam)
 		return iRet;
 	}
 
-	m_cx = tparam->icx;
-	m_cy = tparam->icy;
+	m_x = tparam->icx;
+	m_y = tparam->icy;
 	m_width = tparam->uwidth;
 	m_height = tparam->uheight;
 	m_videowidth = m_width;
@@ -99,17 +99,12 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 	}
 
 	if (NULL == m_sdl_window){
-		//if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0){
-		//	m_callback->Debug("RENDER: Couldn't initialize SDL2: %s", SDL_GetError());
-		//	return -1;
-		//}
-
 		SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
 
 		m_sdl_window = SDL_CreateWindow(
-			"rvc video",    // window title
-			m_cx,           // initial x position
-			m_cy,           // initial y position
+			"",				// window title
+			m_x,            // initial x position
+			m_y,            // initial y position
 			m_width,        // width, in pixels
 			m_height,       // height, in pixels
 			m_flags
@@ -121,18 +116,22 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 			return -2;
 		}
 
-		int display_index = SDL_GetWindowDisplayIndex(m_sdl_window);
+		int idisplay_index = SDL_GetWindowDisplayIndex(m_sdl_window);
+		if (-1 == idisplay_index) {
+			RenderLog(RENDER_LOG_ERROR, "RENDER: get window dispaly index failed!");
+			return -3;
+		}
 		SDL_DisplayMode display_mode;
-		int err = SDL_GetDesktopDisplayMode(display_index, &display_mode);
+		int err = SDL_GetDesktopDisplayMode(idisplay_index, &display_mode);
 		if (0 == err){
 			RenderLog(RENDER_LOG_DEBUG, "RENDER: video display %i ->  %dx%dpx @ %dhz",
-					display_index,
-					display_mode.w,
-					display_mode.h,
-					display_mode.refresh_rate);
+				idisplay_index,
+				display_mode.w,
+				display_mode.h,
+				display_mode.refresh_rate);
 		}
 		else {
-			RenderLog(RENDER_LOG_ERROR, "RENDER: Couldn't determine display mode for video display %i", display_index);
+			RenderLog(RENDER_LOG_ERROR, "RENDER: Couldn't determine display mode for video display %i", idisplay_index);
 		}
 
 		if (m_width > display_mode.w) {
@@ -146,35 +145,27 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 		SDL_SetWindowSize(m_sdl_window, m_width, m_height);
 	}
 
-	/* Allocate a renderer info struct*/
-	SDL_RendererInfo* rend_info = (SDL_RendererInfo*)malloc(sizeof(SDL_RendererInfo));
-	if (NULL == rend_info){
-		RenderLog(RENDER_LOG_ERROR, "RENDER: Couldn't allocate memory for the renderer info data structure");
-		VideoRenderDestroy();
-		return -5;
-	}
-
 	static bool blog = true;
 	/* Print the list of the available renderers*/
 	if (blog) {
 		RenderLog(RENDER_LOG_DEBUG, "RENDER: Available SDL2 rendering drivers:");
 	}
-	
+
+	SDL_RendererInfo rend_info;
 	for (int i = 0; i < SDL_GetNumRenderDrivers(); i++){
-		if (SDL_GetRenderDriverInfo(i, rend_info) < 0){
+		if (SDL_GetRenderDriverInfo(i, &rend_info) < 0){
 			RenderLog(RENDER_LOG_ERROR, "Couldn't get SDL2 render driver information: %s", SDL_GetError());
 		}
 		else {
 			if (blog) {
-				RenderLog(RENDER_LOG_DEBUG, " %2d: %s", i, rend_info->name);
+				RenderLog(RENDER_LOG_DEBUG, " %2d: %s", i, rend_info.name);
 			}
-			//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' : ' ');
+			//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);
 
 	m_renderer = SDL_CreateRenderer(m_sdl_window, -1,
 		SDL_RENDERER_TARGETTEXTURE |
@@ -198,31 +189,22 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
 		}
 	}
 	
-	/* Allocate a renderer info struct*/
-	SDL_RendererInfo* render_info = (SDL_RendererInfo*)malloc(sizeof(SDL_RendererInfo));
-	if (NULL == render_info){
-		RenderLog(RENDER_LOG_ERROR, "RENDER: Couldn't allocate memory for the renderer info data structure");
-		VideoRenderDestroy();
-		return -5;
-	}
-	
 	/* Print the name of the current rendering driver */
-	if (SDL_GetRendererInfo(m_renderer, render_info) < 0){
+	SDL_RendererInfo render_info;
+	if (SDL_GetRendererInfo(m_renderer, &render_info) < 0){
 		RenderLog(RENDER_LOG_ERROR, "Couldn't get SDL2 rendering driver information: %s", SDL_GetError());
 	}
 
 	if (blog) {
-		RenderLog(RENDER_LOG_DEBUG, "RENDER: rendering driver in use: %s", render_info->name);
+		RenderLog(RENDER_LOG_DEBUG, "RENDER: rendering driver in use: %s", render_info.name);
 	}
-	//m_callback->Debug("    SDL_RENDERER_TARGETTEXTURE [%c]", (render_info->flags & SDL_RENDERER_TARGETTEXTURE) ? 'X' : ' ');
-	//m_callback->Debug("    SDL_RENDERER_SOFTWARE      [%c]", (render_info->flags & SDL_RENDERER_SOFTWARE) ? 'X' : ' ');
-	//m_callback->Debug("    SDL_RENDERER_ACCELERATED   [%c]", (render_info->flags & SDL_RENDERER_ACCELERATED) ? 'X' : ' ');
-	//m_callback->Debug("    SDL_RENDERER_PRESENTVSYNC  [%c]", (render_info->flags & SDL_RENDERER_PRESENTVSYNC) ? 'X' : ' ');
+	//RenderLog(RENDER_LOG_DEBUG, "    SDL_RENDERER_TARGETTEXTURE [%c]", (render_info.flags & SDL_RENDERER_TARGETTEXTURE) ? 'X' : ' ');
+	//RenderLog(RENDER_LOG_DEBUG, "    SDL_RENDERER_SOFTWARE      [%c]", (render_info.flags & SDL_RENDERER_SOFTWARE) ? 'X' : ' ');
+	//RenderLog(RENDER_LOG_DEBUG, "    SDL_RENDERER_ACCELERATED   [%c]", (render_info.flags & SDL_RENDERER_ACCELERATED) ? 'X' : ' ');
+	//RenderLog(RENDER_LOG_DEBUG, "    SDL_RENDERER_PRESENTVSYNC  [%c]", (render_info.flags & SDL_RENDERER_PRESENTVSYNC) ? 'X' : ' ');
 
 	blog = false;
 
-	free(render_info);
-
 	SDL_RenderSetLogicalSize(m_renderer, m_videowidth, m_videoheight);
 	SDL_SetRenderDrawBlendMode(m_renderer, SDL_BLENDMODE_NONE);
 
@@ -250,6 +232,7 @@ static int refresh_video(void *opaque)
 		SDL_Event event;
 		event.type = REFRESH_EVENT;
 		SDL_PushEvent(&event);
+
 		SDL_Delay(RVC_DEFAULT_DELAY_TIME);
 	}
 
@@ -259,53 +242,15 @@ static int refresh_video(void *opaque)
 
 static SDL_HitTestResult SDLCALL SDL_HitTestCallback(SDL_Window *win, const SDL_Point *area, void *data)
 {
-	int w, h;
-	const int RESIZE_BORDER = 8;
-	const int DRAGGABLE_TITLE = 32;
-
 	VideoRenderImpl* pImpl = (VideoRenderImpl*)data;
 
-	SDL_GetWindowSize(win, &w, &h);
-
-	if (area->x < RESIZE_BORDER) {
-		if (area->y < RESIZE_BORDER) {
-			pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_TOPLEFT");
-			return SDL_HITTEST_RESIZE_TOPLEFT;
-		} else if (area->y >= (h-RESIZE_BORDER)) {
-			pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_BOTTOMLEFT");
-			return SDL_HITTEST_RESIZE_BOTTOMLEFT;
-		} else {
-			pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_LEFT");
-			return SDL_HITTEST_RESIZE_LEFT;
-		}
-	} 
-	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;
-		} else if (area->y >= (h-RESIZE_BORDER)) {
-			pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_BOTTOMRIGHT");
-			return SDL_HITTEST_RESIZE_BOTTOMRIGHT;
-		} else {
-			pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_RIGHT");
-			return SDL_HITTEST_RESIZE_RIGHT;
-		}
-	} 
-	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) {
-		pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_RESIZE_TOP");
-		return SDL_HITTEST_RESIZE_TOP;
-	} 
-	else if (area->y < DRAGGABLE_TITLE) {
-		pImpl->RenderLog(RENDER_LOG_DEBUG, "SDL_HITTEST_DRAGGABLE");
-		return SDL_HITTEST_DRAGGABLE;
-	}
-	return SDL_HITTEST_NORMAL;
-}
+	int iwidth = 0, iheight = 0;
+	SDL_GetWindowSize(win, &iwidth, &iheight);
+	pImpl->RenderLog(RENDER_LOG_DEBUG, "window width is %d, height is %d.", iwidth, iheight);
+	pImpl->RenderLog(RENDER_LOG_DEBUG, "area->x = %d, area->y = %d.", area->x, area->y);
 
+	return SDL_HITTEST_DRAGGABLE;
+}
 
 bool VideoRenderImpl::GetReFreshFlag()
 {
@@ -316,7 +261,6 @@ 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;
@@ -337,7 +281,10 @@ int VideoRenderImpl::ShowVideoWindow()
 	int iret = -1;
 
 	if (NULL != m_sdl_window){
-		SDL_ShowWindow(m_sdl_window);
+		Uint32 uflags = SDL_GetWindowFlags(m_sdl_window);
+		if (uflags & SDL_WINDOW_HIDDEN) {
+			SDL_ShowWindow(m_sdl_window);
+		}
 		iret = 0;
 	}
 	return iret;
@@ -347,7 +294,10 @@ int VideoRenderImpl::HideVideoWindow()
 {
 	int iret = -1;
 	if (NULL != m_sdl_window) {
-		SDL_HideWindow(m_sdl_window);
+		Uint32 uflags = SDL_GetWindowFlags(m_sdl_window);
+		if (uflags & SDL_WINDOW_SHOWN) {
+			SDL_HideWindow(m_sdl_window);
+		}
 		iret = 0;
 	}
 	return iret;
@@ -360,11 +310,9 @@ int VideoRenderImpl::StopVideoRender()
 	
 	m_refresh_flag = false;
 
-	RenderLog(RENDER_LOG_DEBUG, "%s:%d m_refresh_thread is 0x%08x.",__FUNCTION__, __LINE__, m_refresh_thread);
 	if (NULL != m_refresh_thread){
 		SDL_WaitThread(m_refresh_thread, NULL);
 		m_refresh_thread = NULL;
-		RenderLog(RENDER_LOG_DEBUG, "%s:%d video refresh thread exit.",__FUNCTION__, __LINE__);
 	}
 	
 	return 0;
@@ -419,22 +367,6 @@ int VideoRenderImpl::RenderVideoFrame(video_frame* pframe, RVC_RendererFlip eFli
 		}
 
 		SDL_RenderPresent(m_renderer);
-
-		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;
@@ -454,27 +386,3 @@ void VideoRenderImpl::RenderLog(render_loglevel elevel, const char* fmt, ...)
 		va_end(arg);
 	}
 }
-
-
-void VideoRenderImpl::ConVert24to32(unsigned char* image_in, unsigned char* image_out, int w, int h) 
-{
-	for (int i = 0; i < h; i++)
-		for (int j = 0; j < w; j++) {
-			//Big Endian or Small Endian?
-			//"ARGB" order:high bit -> low bit.
-			//ARGB Format Big Endian (low address save high MSB, here is A) in memory : A|R|G|B
-			//ARGB Format Little Endian (low address save low MSB, here is B) in memory : B|G|R|A
-			if (SDL_BYTEORDER == SDL_LIL_ENDIAN) {
-				//Little Endian (x86): R|G|B --> B|G|R|A
-				image_out[(i * w + j) * 4 + 0] = image_in[(i * w + j) * 3 + 2];
-				image_out[(i * w + j) * 4 + 1] = image_in[(i * w + j) * 3 + 1];
-				image_out[(i * w + j) * 4 + 2] = image_in[(i * w + j) * 3];
-				image_out[(i * w + j) * 4 + 3] = '0';
-			}
-			else {
-				//Big Endian: R|G|B --> A|R|G|B
-				image_out[(i * w + j) * 4] = '0';
-				memcpy(image_out + (i * w + j) * 4 + 1, image_in + (i * w + j) * 3, 3);
-			}
-		}
-}

+ 2 - 3
Other/libvideorender/libvideorender.h

@@ -31,7 +31,6 @@ public:
 
 	int SetWindowProperty(videorender_param_t* tparam);
 	SDL_PixelFormatEnum GetPixelFormat();
-	void ConVert24to32(unsigned char* image_in, unsigned char* image_out, int w, int h);
 	bool GetReFreshFlag();
 	void RenderLog(render_loglevel elevel, const char* fmt, ...);
 
@@ -46,8 +45,8 @@ private:
 	SDL_Thread *m_refresh_thread;
 	bool m_refresh_flag;
 
-	int m_cx;
-	int m_cy;
+	int m_x;
+	int m_y;
 	uint32_t m_videowidth;
 	uint32_t m_videoheight;
 	uint32_t m_width;