[vlc-commits] vout: ios: voutDisplay is now constant in glESView
Thomas Guillem
git at videolan.org
Wed Mar 7 15:34:06 CET 2018
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Tue Mar 6 09:57:30 2018 +0100| [86e82a420fffc31b473ce65285dbee977db8eb9c] | committer: Thomas Guillem
vout: ios: voutDisplay is now constant in glESView
This avoids to take care about locking (that was not correct).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=86e82a420fffc31b473ce65285dbee977db8eb9c
---
modules/video_output/ios.m | 61 ++++++++++++++++++----------------------------
1 file changed, 24 insertions(+), 37 deletions(-)
diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m
index 92cf920720..8686d8b051 100644
--- a/modules/video_output/ios.m
+++ b/modules/video_output/ios.m
@@ -101,10 +101,10 @@ vlc_module_end ()
}
@property (readonly) GLuint renderBuffer;
@property (readonly) GLuint frameBuffer;
- at property (readwrite) vout_display_t* voutDisplay;
@property (readonly) EAGLContext* eaglContext;
@property GLuint shaderProgram;
+- (id)initWithFrameAndVd:(CGRect)frame withVd:(vout_display_t*)vd;
- (void)createBuffers;
- (void)destroyBuffers;
- (void)resetBuffers;
@@ -162,16 +162,17 @@ static int Open(vlc_object_t *this)
@autoreleasepool {
/* setup the actual OpenGL ES view */
+
[VLCOpenGLES2VideoView performSelectorOnMainThread:@selector(getNewView:)
- withObject:[NSValue valueWithPointer:&sys->glESView]
- waitUntilDone:YES];
+ withObject:[NSArray arrayWithObjects:
+ [NSValue valueWithPointer:&sys->glESView],
+ [NSValue valueWithPointer:vd], nil]
+ waitUntilDone:YES];
if (!sys->glESView) {
msg_Err(vd, "Creating OpenGL ES 2 view failed");
goto bailout;
}
- [sys->glESView setVoutDisplay:vd];
-
[sys->glESView performSelectorOnMainThread:@selector(fetchViewContainer) withObject:nil waitUntilDone:YES];
if (!sys->viewContainer) {
msg_Err(vd, "Fetching view container failed");
@@ -252,8 +253,6 @@ static void Close (vlc_object_t *this)
[sys->tapRecognizer release];
}
- [sys->glESView setVoutDisplay:nil];
-
var_Destroy (vd, "drawable-nsobject");
@synchronized(sys->viewContainer) {
[sys->glESView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO];
@@ -422,20 +421,21 @@ static void GLESSwap(vlc_gl_t *gl)
* Our UIView object
*****************************************************************************/
@implementation VLCOpenGLES2VideoView
- at synthesize voutDisplay = _voutDisplay, eaglContext = _eaglContext;
+ at synthesize eaglContext = _eaglContext;
+ (Class)layerClass
{
return [CAEAGLLayer class];
}
-+ (void)getNewView:(NSValue *)value
++ (void)getNewView:(NSArray *)value
{
- id *ret = [value pointerValue];
- *ret = [[self alloc] initWithFrame:CGRectMake(0.,0.,320.,240.)];
+ id *ret = [[value objectAtIndex:0] pointerValue];
+ vout_display_t *vd = [[value objectAtIndex:1] pointerValue];
+ *ret = [[self alloc] initWithFrameAndVd:CGRectMake(0.,0.,320.,240.) withVd:vd];
}
-- (id)initWithFrame:(CGRect)frame
+- (id)initWithFrameAndVd:(CGRect)frame withVd:(vout_display_t*)vd
{
self = [super initWithFrame:frame];
@@ -446,6 +446,8 @@ static void GLESSwap(vlc_gl_t *gl)
if (unlikely(!_appActive))
return nil;
+ _voutDisplay = vd;
+
vlc_mutex_init(&_mutex);
/* the following creates a new OpenGL ES context with the API version we
@@ -471,21 +473,10 @@ static void GLESSwap(vlc_gl_t *gl)
[self releaseCurrent:previousEaglContext];
- return self;
-}
-
-- (void)setVoutDisplay:(vout_display_t *)vd
-{
- _voutDisplay = vd;
-
[self createBuffers];
-
[self reshape];
-}
-- (vout_display_t *)voutDisplay
-{
- return _voutDisplay;
+ return self;
}
- (void)fetchViewContainer
@@ -581,10 +572,8 @@ static void GLESSwap(vlc_gl_t *gl)
[_eaglContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
- if (_voutDisplay)
- msg_Err(_voutDisplay, "Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
- }
+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
+ msg_Err(_voutDisplay, "Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
[self releaseCurrent:previousEaglContext];
}
@@ -671,17 +660,15 @@ static void GLESSwap(vlc_gl_t *gl)
CGFloat scaleFactor = self.contentScaleFactor;
vout_display_place_t place;
- if (_voutDisplay) {
- vout_display_cfg_t cfg_tmp = *(_voutDisplay->cfg);
+ vout_display_cfg_t cfg_tmp = *(_voutDisplay->cfg);
- cfg_tmp.display.width = viewSize.width * scaleFactor;
- cfg_tmp.display.height = viewSize.height * scaleFactor;
+ cfg_tmp.display.width = viewSize.width * scaleFactor;
+ cfg_tmp.display.height = viewSize.height * scaleFactor;
- vout_display_PlacePicture(&place, &_voutDisplay->source, &cfg_tmp, false);
- vout_display_SendEventDisplaySize(_voutDisplay, viewSize.width * scaleFactor,
- viewSize.height * scaleFactor);
- [self setPlace:&place];
- }
+ vout_display_PlacePicture(&place, &_voutDisplay->source, &cfg_tmp, false);
+ vout_display_SendEventDisplaySize(_voutDisplay, viewSize.width * scaleFactor,
+ viewSize.height * scaleFactor);
+ [self setPlace:&place];
// x / y are top left corner, but we need the lower left one
glViewport(place.x, place.y, place.width, place.height);
More information about the vlc-commits
mailing list