[vlc-devel] [PATCH] opengl: use the visible dimensions when uploading a picture to a texture.

Felix Abecassis felix.abecassis at gmail.com
Fri Jan 3 12:03:57 CET 2014


Actually we don't need to do all of this to fix the bug and there is a
possible performance regression because of the removal of full_upload.
Please disregard this patch and examine the next one I will send.

2013/12/31 Felix Abecassis <felix.abecassis at gmail.com>:
> Removes a green line bug at the bottom of some videos.
> ---
>  modules/video_output/opengl.c | 49 ++++++++++++++-----------------------------
>  1 file changed, 16 insertions(+), 33 deletions(-)
>
> diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c
> index 030183d..a24d0ca 100644
> --- a/modules/video_output/opengl.c
> +++ b/modules/video_output/opengl.c
> @@ -565,8 +565,8 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>
>      /* Texture size */
>      for (unsigned j = 0; j < vgl->chroma->plane_count; j++) {
> -        int w = vgl->fmt.i_width  * vgl->chroma->p[j].w.num / vgl->chroma->p[j].w.den;
> -        int h = vgl->fmt.i_height * vgl->chroma->p[j].h.num / vgl->chroma->p[j].h.den;
> +        int w = vgl->fmt.i_visible_width  * vgl->chroma->p[j].w.num / vgl->chroma->p[j].w.den;
> +        int h = vgl->fmt.i_visible_height * vgl->chroma->p[j].h.num / vgl->chroma->p[j].h.den;
>          if (vgl->supports_npot) {
>              vgl->tex_width[j]  = w;
>              vgl->tex_height[j] = h;
> @@ -770,24 +770,20 @@ error:
>
>  #define ALIGN(x, y) (((x) + ((y) - 1)) & ~((y) - 1))
>  static void Upload(vout_display_opengl_t *vgl, int in_width, int in_height,
> -                   int in_full_width, int in_full_height,
>                     int w_num, int w_den, int h_num, int h_den,
> -                   int pitch, int pixel_pitch,
> -                   int full_upload, const uint8_t *pixels,
> +                   int pitch, int pixel_pitch, const uint8_t *pixels,
>                     int tex_target, int tex_format, int tex_type)
>  {
>      int width       =       in_width * w_num / w_den;
> -    int full_width  =  in_full_width * w_num / w_den;
>      int height      =      in_height * h_num / h_den;
> -    int full_height = in_full_height * h_num / h_den;
>      // This unpack alignment is the default, but setting it just in case.
>      glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
>  #ifndef GL_UNPACK_ROW_LENGTH
> -    int dst_width = full_upload ? full_width : width;
> +    int dst_width = width;
>      int dst_pitch = ALIGN(dst_width * pixel_pitch, 4);
>      if ( pitch != dst_pitch )
>      {
> -        int buf_size = dst_pitch * full_height * pixel_pitch;
> +        int buf_size = dst_pitch * height * pixel_pitch;
>          const uint8_t *source = pixels;
>          uint8_t *destination;
>          if( !vgl->texture_temp_buf || vgl->texture_temp_buf_size < buf_size )
> @@ -804,15 +800,9 @@ static void Upload(vout_display_opengl_t *vgl, int in_width, int in_height,
>              source += pitch;
>              destination += dst_pitch;
>          }
> -        if (full_upload)
> -            glTexImage2D( tex_target, 0, tex_format,
> -                          full_width, full_height,
> -                          0, tex_format, tex_type, vgl->texture_temp_buf );
> -        else
> -            glTexSubImage2D( tex_target, 0,
> -                             0, 0,
> -                             width, height,
> -                             tex_format, tex_type, vgl->texture_temp_buf );
> +        glTexImage2D( tex_target, 0, tex_format,
> +                      width, height,
> +                      0, tex_format, tex_type, vgl->texture_temp_buf );
>      } else {
>  #else
>      (void) width;
> @@ -821,15 +811,9 @@ static void Upload(vout_display_opengl_t *vgl, int in_width, int in_height,
>      {
>          glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / pixel_pitch);
>  #endif
> -        if (full_upload)
> -            glTexImage2D(tex_target, 0, tex_format,
> -                         full_width, full_height,
> -                         0, tex_format, tex_type, pixels);
> -        else
> -            glTexSubImage2D(tex_target, 0,
> -                            0, 0,
> -                            width, height,
> -                            tex_format, tex_type, pixels);
> +        glTexImage2D(tex_target, 0, tex_format,
> +                     width, height,
> +                     0, tex_format, tex_type, pixels);
>      }
>  }
>
> @@ -848,9 +832,8 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
>          glBindTexture(vgl->tex_target, vgl->texture[0][j]);
>
>          Upload(vgl, picture->format.i_visible_width, vgl->fmt.i_visible_height,
> -               vgl->fmt.i_width, vgl->fmt.i_height,
>                 vgl->chroma->p[j].w.num, vgl->chroma->p[j].w.den, vgl->chroma->p[j].h.num, vgl->chroma->p[j].h.den,
> -               picture->p[j].i_pitch, picture->p[j].i_pixel_pitch, 0, picture->p[j].p_pixels, vgl->tex_target, vgl->tex_format, vgl->tex_type);
> +               picture->p[j].i_pitch, picture->p[j].i_pixel_pitch, picture->p[j].p_pixels, vgl->tex_target, vgl->tex_format, vgl->tex_type);
>      }
>
>      int         last_count = vgl->region_count;
> @@ -912,8 +895,8 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
>                                        r->fmt.i_x_offset * r->p_picture->p->i_pixel_pitch;
>              if (glr->texture) {
>                  glBindTexture(GL_TEXTURE_2D, glr->texture);
> -                Upload(vgl, r->fmt.i_visible_width, r->fmt.i_visible_height, glr->width, glr->height, 1, 1, 1, 1,
> -                       r->p_picture->p->i_pitch, r->p_picture->p->i_pixel_pitch, 0,
> +                Upload(vgl, r->fmt.i_visible_width, r->fmt.i_visible_height, 1, 1, 1, 1,
> +                       r->p_picture->p->i_pitch, r->p_picture->p->i_pixel_pitch,
>                         &r->p_picture->p->p_pixels[pixels_offset], GL_TEXTURE_2D, glr->format, glr->type);
>              } else {
>                  glGenTextures(1, &glr->texture);
> @@ -926,8 +909,8 @@ int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
>                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
>                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
>                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
> -                Upload(vgl, r->fmt.i_visible_width, r->fmt.i_visible_height, glr->width, glr->height, 1, 1, 1, 1,
> -                       r->p_picture->p->i_pitch, r->p_picture->p->i_pixel_pitch, 1,
> +                Upload(vgl, r->fmt.i_visible_width, r->fmt.i_visible_height, 1, 1, 1, 1,
> +                       r->p_picture->p->i_pitch, r->p_picture->p->i_pixel_pitch,
>                         &r->p_picture->p->p_pixels[pixels_offset], GL_TEXTURE_2D, glr->format, glr->type);
>              }
>          }
> --
> 1.8.3.2
>



-- 
Félix Abecassis
http://felix.abecassis.me



More information about the vlc-devel mailing list