summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-09-01 10:48:47 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-09-01 10:48:47 +0000
commit0f7fe327258bf6c059080210e0c7a106e866cec4 (patch)
tree12246310dea497555adf4224bc5981311042e1b1 /libvo
parentb125a3188603284e1bc753cc6d2fdc2057749f4c (diff)
downloadmpv-0f7fe327258bf6c059080210e0c7a106e866cec4.tar.bz2
mpv-0f7fe327258bf6c059080210e0c7a106e866cec4.tar.xz
Reduce vo_corevideo memleaks by initializing static context etc. only once
in preinit and freeing the video-specific data before reallocating in config. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29608 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_corevideo.m40
1 files changed, 26 insertions, 14 deletions
diff --git a/libvo/vo_corevideo.m b/libvo/vo_corevideo.m
index 79680aca5a..73f29727e7 100644
--- a/libvo/vo_corevideo.m
+++ b/libvo/vo_corevideo.m
@@ -431,6 +431,9 @@ static int control(uint32_t request, void *data, ...)
@implementation MPlayerOpenGLView
- (void) preinit
{
+ GLint swapInterval = 1;
+ CVReturn error;
+
//init menu
[self initMenu];
@@ -448,6 +451,28 @@ static int control(uint32_t request, void *data, ...)
isFullscreen = 0;
winSizeMult = 1;
+
+ //create OpenGL Context
+ glContext = [[NSOpenGLContext alloc] initWithFormat:[NSOpenGLView defaultPixelFormat] shareContext:nil];
+
+ [self setOpenGLContext:glContext];
+ [glContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
+ [glContext setView:self];
+ [glContext makeCurrentContext];
+
+ error = CVOpenGLTextureCacheCreate(NULL, 0, [glContext CGLContextObj], [[self pixelFormat] CGLPixelFormatObj], 0, &textureCache);
+ if(error != kCVReturnSuccess)
+ mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create OpenGL texture Cache(%d)\n", error);
+}
+
+- (void) releaseVideoSpecific
+{
+ CVPixelBufferRelease(frameBuffers[0]);
+ frameBuffers[0] = NULL;
+ CVPixelBufferRelease(frameBuffers[1]);
+ frameBuffers[1] = NULL;
+ CVOpenGLTextureRelease(texture);
+ texture = NULL;
}
- (void) config
@@ -455,8 +480,6 @@ static int control(uint32_t request, void *data, ...)
uint32_t d_width;
uint32_t d_height;
- GLint swapInterval = 1;
-
NSRect frame;
CVReturn error = kCVReturnSuccess;
@@ -465,14 +488,7 @@ static int control(uint32_t request, void *data, ...)
frame = NSMakeRect(0, 0, d_width, d_height);
[window setContentSize: frame.size];
- //create OpenGL Context
- glContext = [[NSOpenGLContext alloc] initWithFormat:[NSOpenGLView defaultPixelFormat] shareContext:nil];
-
- [self setOpenGLContext:glContext];
- [glContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
- [glContext setView:self];
- [glContext makeCurrentContext];
-
+ [self releaseVideoSpecific];
error = CVPixelBufferCreateWithBytes(NULL, image_width, image_height, pixelFormat, image_datas[0], image_width*image_bytes, NULL, NULL, NULL, &frameBuffers[0]);
if(error != kCVReturnSuccess)
mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create Pixel Buffer(%d)\n", error);
@@ -482,10 +498,6 @@ static int control(uint32_t request, void *data, ...)
mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create Pixel Double Buffer(%d)\n", error);
}
- error = CVOpenGLTextureCacheCreate(NULL, 0, [glContext CGLContextObj], [[self pixelFormat] CGLPixelFormatObj], 0, &textureCache);
- if(error != kCVReturnSuccess)
- mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create OpenGL texture Cache(%d)\n", error);
-
error = CVOpenGLTextureCacheCreateTextureFromImage(NULL, textureCache, frameBuffers[image_page], 0, &texture);
if(error != kCVReturnSuccess)
mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create OpenGL texture(%d)\n", error);