|
@@ -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);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|