[vlc-devel] [PATCH] Support for rotated MP4 Movies (bug #2882)

Rémi Denis-Courmont remi at remlab.net
Fri Feb 7 20:11:20 CET 2014


Le jeudi 6 février 2014, 23:21:35 Matthias Keiser a écrit :
> From 573546cac0a680566e304da341bed83d6555f1ba Mon Sep 17 00:00:00 2001
> From: Matthias Keiser <matthias at tristan-inc.com>
> Date: Thu, 6 Feb 2014 16:28:26 +0100
> Subject: [PATCH 11/13] If the video formats orientation is rotated, apply a
>  rotation transform matrix, both when using the fixed pipeline and the
> shader.
> 
> ---
>  modules/video_output/opengl.c | 59
> ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58
> insertions(+), 1 deletion(-)
> 
> diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c
> index 33db19d..d786cb6 100644
> --- a/modules/video_output/opengl.c
> +++ b/modules/video_output/opengl.c
> @@ -35,6 +35,7 @@
>  #include <vlc_opengl.h>
> 
>  #include "opengl.h"
> +#include "math.h"
> 
>  #ifndef GL_CLAMP_TO_EDGE
>  # define GL_CLAMP_TO_EDGE 0x812F
> @@ -51,6 +52,7 @@
>  #   define PFNGLENABLEVERTEXATTRIBARRAYPROC 
> typeof(glEnableVertexAttribArray)* #   define PFNGLUNIFORM4FVPROC          
>     typeof(glUniform4fv)* #   define PFNGLUNIFORM4FPROC               
> typeof(glUniform4f)* +#   define PFNGLUNIFORM1FPROC               
> typeof(glUniform1f)* #   define PFNGLUNIFORM1IPROC               
> typeof(glUniform1i)* #   define PFNGLCREATESHADERPROC            
> typeof(glCreateShader)* #   define PFNGLSHADERSOURCEPROC            
> typeof(glShaderSource)* @@ -148,6 +150,7 @@ struct vout_display_opengl_t {
> 
>      PFNGLUNIFORM4FVPROC   Uniform4fv;
>      PFNGLUNIFORM4FPROC    Uniform4f;
> +    PFNGLUNIFORM1FPROC    Uniform1f;
>      PFNGLUNIFORM1IPROC    Uniform1i;
> 
>      /* Shader command */
> @@ -222,11 +225,17 @@ static void BuildVertexShader(vout_display_opengl_t
> *vgl, "varying vec4 TexCoord0,TexCoord1, TexCoord2;"
>          "attribute vec4 MultiTexCoord0,MultiTexCoord1,MultiTexCoord2;"
>          "attribute vec4 VertexPosition;"
> +        "uniform float zRotation;"
>          "void main() {"
>          " TexCoord0 = MultiTexCoord0;"
>          " TexCoord1 = MultiTexCoord1;"
>          " TexCoord2 = MultiTexCoord2;"
> -        " gl_Position = VertexPosition;"
> +        " mat3 zRotMatrix = mat3("
> +        "   vec3( cos(zRotation),  -sin(zRotation),  0.0),"
> +        "   vec3(sin(zRotation),  cos(zRotation),  0.0),"
> +        "   vec3(        0.0,         0.0,  1.0)"
> +        " );"
> +        " gl_Position = vec4(zRotMatrix * VertexPosition.xyz,
> VertexPosition.w);" "}";
> 
>      *shader = vgl->CreateShader(GL_VERTEX_SHADER);
> @@ -460,6 +469,7 @@ vout_display_opengl_t
> *vout_display_opengl_New(video_format_t *fmt, vgl->EnableVertexAttribArray
> = (PFNGLENABLEVERTEXATTRIBARRAYPROC)vlc_gl_GetProcAddress(vgl->gl,
> "glEnableVertexAttribArray"); vgl->Uniform4fv    =
> (PFNGLUNIFORM4FVPROC)vlc_gl_GetProcAddress(vgl->gl,"glUniform4fv");
> vgl->Uniform4f     =
> (PFNGLUNIFORM4FPROC)vlc_gl_GetProcAddress(vgl->gl,"glUniform4f"); +   
> vgl->Uniform1f     =
> (PFNGLUNIFORM1FPROC)vlc_gl_GetProcAddress(vgl->gl,"glUniform1f");
> vgl->Uniform1i     =
> (PFNGLUNIFORM1IPROC)vlc_gl_GetProcAddress(vgl->gl,"glUniform1i");
> 
>      vgl->CreateProgram =
> (PFNGLCREATEPROGRAMPROC)vlc_gl_GetProcAddress(vgl->gl, "glCreateProgram");
> @@ -965,6 +975,29 @@ static void DrawWithoutShaders(vout_display_opengl_t
> *vgl, right[0], top[0]
>      };
> 
> +    GLdouble angle;
> +
> +    switch (vgl->fmt.orientation) {
> +
> +        case ORIENT_ROTATED_90:
> +            angle = 270.0;
> +            break;
> +        case ORIENT_ROTATED_180:
> +            angle = 180.0;
> +            break;
> +        case ORIENT_ROTATED_270:
> +            angle = 90.0;
> +            break;
> +        default:
> +            angle = 0.0;
> +            break;
> +    }

You are not handling indirect orientations, and yet you are also not 
correcting the input format. This is wrong.

(And all other video outputs remain broken.)

> +
> +    glPushMatrix();
> +    glMatrixMode(GL_MODELVIEW);
> +    glLoadIdentity();
> +    glRotated(angle, 0, 0, 1);
> +
>      glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
>      glEnable(vgl->tex_target);
>      glActiveTexture(GL_TEXTURE0 + 0);
> @@ -983,6 +1016,9 @@ static void DrawWithoutShaders(vout_display_opengl_t
> *vgl, glDisableClientState(GL_TEXTURE_COORD_ARRAY);
>      glDisableClientState(GL_VERTEX_ARRAY);
>      glDisable(vgl->tex_target);
> +
> +    glPopMatrix();
> +
>  }
>  #endif
> 
> @@ -1030,10 +1066,31 @@ static void DrawWithShaders(vout_display_opengl_t
> *vgl,
> vgl->EnableVertexAttribArray(vgl->GetAttribLocation(vgl->program[program],
> attribute));
> vgl->VertexAttribPointer(vgl->GetAttribLocation(vgl->program[program],
> attribute), 2, GL_FLOAT, 0, 0, textureCoord); }
> +
> +    float angle;
> +
> +    switch (vgl->fmt.orientation) {
> +
> +        case ORIENT_ROTATED_90:
> +            angle = M_PI_2;
> +            break;
> +        case ORIENT_ROTATED_180:
> +            angle = M_PI;
> +            break;
> +        case ORIENT_ROTATED_270:
> +            angle = -M_PI_2;
> +            break;
> +        default:
> +            angle = 0.0;
> +            break;
> +    }
> +
>      glActiveTexture(GL_TEXTURE0 + 0);
>      glClientActiveTexture(GL_TEXTURE0 + 0);
>     
> vgl->EnableVertexAttribArray(vgl->GetAttribLocation(vgl->program[program],
> "VertexPosition"));
> vgl->VertexAttribPointer(vgl->GetAttribLocation(vgl->program[program],
> "VertexPosition"), 2, GL_FLOAT, 0, 0, vertexCoord); +   
> vgl->EnableVertexAttribArray(vgl->GetUniformLocation(vgl->program[program],
> "zRotation")); +   
> vgl->Uniform1f(vgl->GetUniformLocation(vgl->program[program], "zRotation"),
> angle);
> 
>      glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
>  }

-- 
Rémi Denis-Courmont
http://www.remlab.net/




More information about the vlc-devel mailing list