[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