summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorfaust3 <faust3@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-05-13 10:46:11 +0000
committerfaust3 <faust3@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-05-13 10:46:11 +0000
commit28962ca4f2ff452c4938bc9ebb63874ba695bc6d (patch)
treec80cd5ae3d40f697949c64e4fc5a8e5463137cd9 /libvo
parente31e2320bc2b65a44855a50a709f88aaf3feaf89 (diff)
downloadmpv-28962ca4f2ff452c4938bc9ebb63874ba695bc6d.tar.bz2
mpv-28962ca4f2ff452c4938bc9ebb63874ba695bc6d.tar.xz
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@15429 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_directx.c78
1 files changed, 51 insertions, 27 deletions
diff --git a/libvo/vo_directx.c b/libvo/vo_directx.c
index eacc90a688..bde1c93319 100644
--- a/libvo/vo_directx.c
+++ b/libvo/vo_directx.c
@@ -41,6 +41,9 @@
# define WM_XBUTTONDBLCLK 0x020D
#endif
+#define WNDCLASSNAME_WINDOWED "MPlayer - The Movie Player"
+#define WNDCLASSNAME_FULLSCREEN "MPlayer - Fullscreen"
+
static LPDIRECTDRAWCOLORCONTROL g_cc = NULL; //color control interface
static LPDIRECTDRAW7 g_lpdd = NULL; //DirectDraw Object
static LPDIRECTDRAWSURFACE7 g_lpddsPrimary = NULL; //Primary Surface: viewport through the Desktop
@@ -53,6 +56,10 @@ static RECT rd; //rect of our stretched imag
static RECT rs; //rect of our source image
static HWND hWnd=NULL; //handle to the window
static HWND hWndFS=NULL; //fullscreen window
+static HBRUSH colorbrush = NULL; // Handle to colorkey brush
+static HBRUSH blackbrush = NULL; // Handle to black brush
+static HICON mplayericon = NULL; // Handle to mplayer icon
+static HCURSOR mplayercursor = NULL; // Handle to mplayer cursor
static uint32_t image_width, image_height; //image width and height
static uint32_t d_image_width, d_image_height; //image width and height zoomed
static uint8_t *image=NULL; //image data
@@ -345,8 +352,21 @@ static void uninit(void)
g_lpddsPrimary = NULL;
mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>primary released\n");
if(hWndFS)DestroyWindow(hWndFS);
- if(hWnd != NULL)DestroyWindow(hWnd);
+ hWndFS = NULL;
+ if((WinID == -1) && hWnd) DestroyWindow(hWnd);
+ hWnd = NULL;
mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>window destroyed\n");
+ UnregisterClass(WNDCLASSNAME_WINDOWED, GetModuleHandle(NULL));
+ UnregisterClass(WNDCLASSNAME_FULLSCREEN, GetModuleHandle(NULL));
+ if (mplayericon) DestroyIcon(mplayericon);
+ mplayericon = NULL;
+ if (mplayercursor) DestroyCursor(mplayercursor);
+ mplayercursor = NULL;
+ if (blackbrush) DeleteObject(blackbrush);
+ blackbrush = NULL;
+ if (colorbrush) DeleteObject(colorbrush);
+ colorbrush = NULL;
+ mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>GDI resources deleted\n");
if (g_lpdd != NULL){
if(vidmode)g_lpdd->lpVtbl->RestoreDisplayMode(g_lpdd);
g_lpdd->lpVtbl->Release(g_lpdd);
@@ -521,7 +541,8 @@ static uint32_t Directx_ManageDisplay()
aspect(&width,&height,A_ZOOM);
rd.left=(vo_screenwidth-width)/2;
rd.top=(vo_screenheight-height)/2;
- if(ShowCursor(FALSE)>=0)while(ShowCursor(FALSE)>=0){}
+ if (WinID == -1)
+ if(ShowCursor(FALSE)>=0)while(ShowCursor(FALSE)>=0){}
}
else if (WinID != -1 && vo_geometry) {
POINT pt;
@@ -562,7 +583,8 @@ static uint32_t Directx_ManageDisplay()
}
else height=tmpheight;
}
- while(ShowCursor(TRUE)<=0){}
+ if (WinID == -1)
+ while(ShowCursor(TRUE)<=0){}
}
rd.right=rd.left+width;
rd.bottom=rd.top+height;
@@ -663,7 +685,7 @@ static uint32_t Directx_ManageDisplay()
SetWindowPos(hWnd,(vo_ontop)?HWND_TOPMOST:(vo_rootwin?HWND_BOTTOM:HWND_NOTOPMOST),rdw.left,rdw.top,rdw.right-rdw.left,rdw.bottom-rdw.top,SWP_NOOWNERZORDER);
}
}
- else SetWindowPos(vidmode?hWnd:hWndFS,vo_rootwin?HWND_BOTTOM:HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOOWNERZORDER);
+ else SetWindowPos(vidmode?hWnd:hWndFS,vo_rootwin?HWND_BOTTOM:HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOOWNERZORDER|SWP_NOCOPYBITS);
/*make sure the overlay is inside the screen*/
if(rd.left<0)rd.left=0;
@@ -985,7 +1007,6 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
static uint32_t preinit(const char *arg)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
- HICON mplayericon=NULL;
char exedir[MAX_PATH];
WNDCLASS wc;
if(arg)
@@ -1002,33 +1023,36 @@ static uint32_t preinit(const char *arg)
mplayericon = ExtractIcon( hInstance, exedir, 0 );
}
if(!mplayericon)mplayericon=LoadIcon(NULL,IDI_APPLICATION);
+ mplayercursor = LoadCursor(NULL, IDC_ARROW);
monitor_rect.right=GetSystemMetrics(SM_CXSCREEN);
monitor_rect.bottom=GetSystemMetrics(SM_CYSCREEN);
windowcolor = vo_colorkey;
+ colorbrush = CreateSolidBrush(windowcolor);
+ blackbrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
- wc.hCursor = LoadCursor(NULL,IDC_ARROW);
+ wc.hCursor = mplayercursor;
wc.hIcon = mplayericon;
- wc.hbrBackground = CreateSolidBrush(vidmode?RGB(0,0,0):windowcolor);
- wc.lpszClassName = "MPlayer - The Movie Player";
+ wc.hbrBackground = vidmode ? blackbrush : colorbrush;
+ wc.lpszClassName = WNDCLASSNAME_WINDOWED;
wc.lpszMenuName = NULL;
RegisterClass(&wc);
if (WinID != -1) hWnd = WinID;
else
hWnd = CreateWindowEx(vidmode?WS_EX_TOPMOST:0,
- "MPlayer - The Movie Player","",(vidmode)?WS_POPUP:WS_OVERLAPPEDWINDOW| WS_SIZEBOX,
+ WNDCLASSNAME_WINDOWED,"",(vidmode)?WS_POPUP:WS_OVERLAPPEDWINDOW| WS_SIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,NULL,NULL,hInstance,NULL);
- wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
- wc.lpszClassName = "MPlayer - Fullscreen";
+ wc.hbrBackground = blackbrush;
+ wc.lpszClassName = WNDCLASSNAME_FULLSCREEN;
RegisterClass(&wc);
if (Directx_InitDirectDraw()!= 0)return 1; //init DirectDraw
- if(!vidmode)hWndFS = CreateWindow("MPlayer - Fullscreen","MPlayer Fullscreen",WS_POPUP,monitor_rect.left,monitor_rect.top,monitor_rect.right-monitor_rect.left,monitor_rect.bottom-monitor_rect.top,hWnd,NULL,hInstance,NULL);
+ if(!vidmode)hWndFS = CreateWindow(WNDCLASSNAME_FULLSCREEN,"MPlayer Fullscreen",WS_POPUP,monitor_rect.left,monitor_rect.top,monitor_rect.right-monitor_rect.left,monitor_rect.bottom-monitor_rect.top,hWnd,NULL,hInstance,NULL);
mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>initial mplayer windows created\n");
if (Directx_CheckPrimaryPixelformat()!=0)return 1;
@@ -1244,6 +1268,21 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
window_aspect= (float)d_image_width / (float)d_image_height;
vo_dx = 0;
vo_dy = 0;
+
+ /*release all directx objects*/
+ if (g_cc != NULL)g_cc->lpVtbl->Release(g_cc);
+ g_cc=NULL;
+ if(g_lpddclipper)g_lpddclipper->lpVtbl->Release(g_lpddclipper);
+ g_lpddclipper=NULL;
+ if (g_lpddsBack != NULL) g_lpddsBack->lpVtbl->Release(g_lpddsBack);
+ g_lpddsBack = NULL;
+ if(vo_doublebuffering)
+ if (g_lpddsOverlay != NULL)g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay);
+ g_lpddsOverlay = NULL;
+ if (g_lpddsPrimary != NULL) g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary);
+ g_lpddsPrimary = NULL;
+ mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>overlay surfaces released\n");
+
if(!vidmode){
if(vo_geometry){
vo_dx= ( vo_screenwidth - d_image_width ) / 2; vo_dy=( vo_screenheight - d_image_height ) / 2;
@@ -1273,19 +1312,6 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
if(vidmode)vo_fs=0;
- if (g_cc != NULL)g_cc->lpVtbl->Release(g_cc);
- g_cc=NULL;
- /*release all surfaces*/
- if (g_lpddsBack != NULL) g_lpddsBack->lpVtbl->Release(g_lpddsBack);
- g_lpddsBack = NULL;
- if(vo_doublebuffering)
- {
- if (g_lpddsOverlay != NULL)g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay);
- }
- g_lpddsOverlay = NULL;
- if (g_lpddsPrimary != NULL) g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary);
- g_lpddsPrimary = NULL;
- mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>overlay surfaces released\n");
/*create the surfaces*/
@@ -1326,8 +1352,6 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>back surface created\n");
vo_doublebuffering = 0;
/*create clipper for nonoverlay mode*/
- if(g_lpddclipper)g_lpddclipper->lpVtbl->Release(g_lpddclipper);
- g_lpddclipper=NULL;
if(g_lpdd->lpVtbl->CreateClipper(g_lpdd, 0, &g_lpddclipper,NULL)!= DD_OK){mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't create clipper\n");return 1;}
if(g_lpddclipper->lpVtbl->SetHWnd (g_lpddclipper, 0, hWnd)!= DD_OK){mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't associate clipper with window\n");return 1;}
if(g_lpddsPrimary->lpVtbl->SetClipper (g_lpddsPrimary,g_lpddclipper)!=DD_OK){mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't associate primary surface with clipper\n");return 1;}