From f56122ac8d7691a97ff526382e6e45f280bb7e67 Mon Sep 17 00:00:00 2001 From: Zhang Rui Date: Wed, 13 Jan 2016 14:46:33 +0800 Subject: [PATCH] ios/glview: fix padding calculation --- .../ijkmedia/ijksdl/ios/IJKSDLGLView.m | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/ijkmedia/ijksdl/ios/IJKSDLGLView.m b/ios/IJKMediaPlayer/IJKMediaPlayer/ijkmedia/ijksdl/ios/IJKSDLGLView.m index a963f21b..0b2abf9c 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/ijkmedia/ijksdl/ios/IJKSDLGLView.m +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/ijkmedia/ijksdl/ios/IJKSDLGLView.m @@ -176,6 +176,7 @@ static void mat4f_LoadOrtho(float left, float right, float bottom, float top, fl BOOL _didSetContentMode; BOOL _didRelayoutSubViews; + BOOL _didVerticesChanged; BOOL _didPaddingChanged; int _tryLockErrorCount; @@ -435,10 +436,18 @@ static int g_ijk_gles_queue_spec_key; - (void)layoutOnDisplayThread { + int backingWidth = 0; + int backingHeight = 0; glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_backingWidth); - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight); + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); + + if (_backingWidth != backingWidth || _backingHeight != backingHeight) { + _backingWidth = backingWidth; + _backingHeight = backingHeight; + _didVerticesChanged = YES; + } GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { @@ -449,16 +458,12 @@ static int g_ijk_gles_queue_spec_key; NSLog(@"OK setup GL framebuffer %d:%d", _backingWidth, _backingHeight); } - - [self updateVertices]; - // FIXME: trigger a redisplay on display thread - // [self display: nil]; } - (void)setContentMode:(UIViewContentMode)contentMode { - _didSetContentMode = YES; [super setContentMode:contentMode]; + _didSetContentMode = YES; if (self->_useRenderQueue && self->_renderQueue) { dispatch_async(self->_renderQueue, ^(){ [self display:nil]; @@ -502,15 +507,26 @@ static int g_ijk_gles_queue_spec_key; } } - if (overlay && (_frameWidth != overlay->w || - _frameHeight != overlay->h || - _frameSarNum != overlay->sar_num || - _frameSarDen != overlay->sar_den)) { - _frameWidth = overlay->w; - _frameHeight = overlay->h; - _frameSarNum = overlay->sar_num; - _frameSarDen = overlay->sar_den; - [self updateVertices]; + if (overlay) { + if (_frameWidth != overlay->w || + _frameHeight != overlay->h || + _frameSarNum != overlay->sar_num || + _frameSarDen != overlay->sar_den) { + _frameWidth = overlay->w; + _frameHeight = overlay->h; + _frameSarNum = overlay->sar_num; + _frameSarDen = overlay->sar_den; + _didVerticesChanged = YES; + } + + if (!overlay->is_private && overlay->pitches && _frameWidth > 0) { + int frameBufferWidth = overlay->pitches[0] / _bytesPerPixel; + int rightPaddingPixels = frameBufferWidth - _frameWidth; + if (rightPaddingPixels != _rightPaddingPixels) { + _rightPaddingPixels = rightPaddingPixels; + _rightPadding = ((GLfloat)_rightPaddingPixels) / frameBufferWidth; + } + } } return YES; @@ -665,19 +681,14 @@ exit: return; } - if (overlay && !overlay->is_private && overlay->pitches[0] / _bytesPerPixel > _frameWidth) { - _rightPaddingPixels = overlay->pitches[0] / _bytesPerPixel - _frameWidth; - _didPaddingChanged = YES; - } - if (_didRelayoutSubViews) { _didRelayoutSubViews = NO; [self layoutOnDisplayThread]; } - if (_didSetContentMode || _didPaddingChanged) { + if (_didSetContentMode || _didVerticesChanged) { _didSetContentMode = NO; - _didPaddingChanged = NO; + _didVerticesChanged = NO; [self updateVertices]; } @@ -688,17 +699,10 @@ exit: glUseProgram(_program); if (overlay) { - _frameWidth = overlay->w; - _frameHeight = overlay->h; - _frameSarNum = overlay->sar_num; - _frameSarDen = overlay->sar_den; [_renderer render:overlay]; } if ([_renderer prepareDisplay]) { - if (_frameWidth > 0) - _rightPadding = ((GLfloat)_rightPaddingPixels) / _frameWidth; - _texCoords[0] = 0.0f; _texCoords[1] = 1.0f; _texCoords[2] = 1.0f - _rightPadding; -- GitLab