[vlc-devel] [PATCH] Support for rotated MP4 Movies (bug #2882)
Jean-Baptiste Kempf
jb at videolan.org
Fri Feb 7 15:08:31 CET 2014
Seems OK here.
On 06 Feb, Matthias Keiser wrote :
> >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;
> + }
> +
> + 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);
> }
> --
> 1.8.3.4 (Apple Git-47)
>
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
--
With my kindest regards,
--
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device
More information about the vlc-devel
mailing list