Commit 217a2f8c authored by Felix Paul Kühne's avatar Felix Paul Kühne

vout iOS: improved locking

parent dabd1cfb
...@@ -236,42 +236,44 @@ static int Open(vlc_object_t *this) ...@@ -236,42 +236,44 @@ static int Open(vlc_object_t *this)
if (unlikely(viewContainer == nil)) if (unlikely(viewContainer == nil))
goto bailout; goto bailout;
if (unlikely(![viewContainer respondsToSelector:@selector(isKindOfClass:)])) @synchronized(viewContainer) {
goto bailout; if (unlikely(![viewContainer respondsToSelector:@selector(isKindOfClass:)]))
goto bailout;
if (![viewContainer isKindOfClass:[UIView class]]) if (![viewContainer isKindOfClass:[UIView class]])
goto bailout; goto bailout;
/* This will be released in Close(), on /* This will be released in Close(), on
* main thread, after we are done using it. */ * main thread, after we are done using it. */
sys->viewContainer = [viewContainer retain]; sys->viewContainer = [viewContainer retain];
if (vd->fmt.i_chroma == VLC_CODEC_CVPX_OPAQUE) { if (vd->fmt.i_chroma == VLC_CODEC_CVPX_OPAQUE) {
msg_Dbg(vd, "will use zero-copy rendering"); msg_Dbg(vd, "will use zero-copy rendering");
sys->zero_copy = true; sys->zero_copy = true;
} }
/* setup the actual OpenGL ES view */ /* setup the actual OpenGL ES view */
sys->glESView = [[VLCOpenGLES2VideoView alloc] initWithFrame:[viewContainer bounds] zeroCopy:sys->zero_copy voutDisplay:vd]; sys->glESView = [[VLCOpenGLES2VideoView alloc] initWithFrame:[viewContainer bounds] zeroCopy:sys->zero_copy voutDisplay:vd];
sys->glESView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; sys->glESView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
if (!sys->glESView) if (!sys->glESView)
goto bailout; goto bailout;
[sys->viewContainer performSelectorOnMainThread:@selector(addSubview:) [sys->viewContainer performSelectorOnMainThread:@selector(addSubview:)
withObject:sys->glESView withObject:sys->glESView
waitUntilDone:YES]; waitUntilDone:YES];
/* add tap gesture recognizer for DVD menus and stuff */ /* add tap gesture recognizer for DVD menus and stuff */
sys->tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:sys->glESView sys->tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:sys->glESView
action:@selector(tapRecognized:)]; action:@selector(tapRecognized:)];
if (sys->viewContainer.window) { if (sys->viewContainer.window) {
if (sys->viewContainer.window.rootViewController) { if (sys->viewContainer.window.rootViewController) {
if (sys->viewContainer.window.rootViewController.view) if (sys->viewContainer.window.rootViewController.view)
[sys->viewContainer.superview addGestureRecognizer:sys->tapRecognizer]; [sys->viewContainer.superview addGestureRecognizer:sys->tapRecognizer];
}
} }
sys->tapRecognizer.cancelsTouchesInView = NO;
} }
sys->tapRecognizer.cancelsTouchesInView = NO;
const vlc_fourcc_t *subpicture_chromas; const vlc_fourcc_t *subpicture_chromas;
video_format_t fmt = vd->fmt; video_format_t fmt = vd->fmt;
...@@ -317,8 +319,12 @@ static int Open(vlc_object_t *this) ...@@ -317,8 +319,12 @@ static int Open(vlc_object_t *this)
vd->manage = NULL; vd->manage = NULL;
/* forward our dimensions to the vout core */ /* forward our dimensions to the vout core */
CGFloat scaleFactor = sys->viewContainer.contentScaleFactor; CGFloat scaleFactor;
CGSize viewSize = sys->viewContainer.bounds.size; CGSize viewSize;
@synchronized(sys->viewContainer) {
scaleFactor = sys->viewContainer.contentScaleFactor;
viewSize = sys->viewContainer.bounds.size;
}
vout_display_SendEventFullscreen(vd, false); vout_display_SendEventFullscreen(vd, false);
vout_display_SendEventDisplaySize(vd, viewSize.width * scaleFactor, viewSize.height * scaleFactor); vout_display_SendEventDisplaySize(vd, viewSize.width * scaleFactor, viewSize.height * scaleFactor);
...@@ -354,8 +360,11 @@ void Close (vlc_object_t *this) ...@@ -354,8 +360,11 @@ void Close (vlc_object_t *this)
[sys->glESView setVoutDisplay:nil]; [sys->glESView setVoutDisplay:nil];
var_Destroy (vd, "drawable-nsobject"); var_Destroy (vd, "drawable-nsobject");
[sys->viewContainer performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO]; @synchronized(sys->viewContainer) {
[sys->glESView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO]; [sys->glESView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO];
[sys->viewContainer performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
}
sys->viewContainer = nil;
if (sys->gl.sys != NULL) { if (sys->gl.sys != NULL) {
@synchronized (sys->glESView) { @synchronized (sys->glESView) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment