changeset 17220:a27e52b838e3

support negative stride (flipping) in vo_gl.
author reimar
date Sun, 18 Dec 2005 12:04:08 +0000
parents fde45c312c31
children c4591717390c
files libvo/gl_common.c libvo/gl_common.h libvo/vo_gl.c libvo/vo_gl2.c
diffstat 4 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/gl_common.c	Sun Dec 18 11:57:25 2005 +0000
+++ b/libvo/gl_common.c	Sun Dec 18 12:04:08 2005 +0000
@@ -493,6 +493,10 @@
   if (w <= 0 || h <= 0) return;
   if (slice <= 0)
     slice = h;
+  if (stride < 0) {
+    data += h * stride;
+    stride = -stride;
+  }
   // this is not always correct, but should work for MPlayer
   glAdjustAlignment(stride);
   glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type));
@@ -910,16 +914,21 @@
  * \param sy height of texture in pixels
  * \param rect_tex whether this texture uses texture_rectangle extension
  * \param is_yv12 if set, also draw the textures from units 1 and 2
+ * \param flip flip the texture upside down
  * \ingroup gltexture
  */
 void glDrawTex(GLfloat x, GLfloat y, GLfloat w, GLfloat h,
                GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th,
-               int sx, int sy, int rect_tex, int is_yv12) {
+               int sx, int sy, int rect_tex, int is_yv12, int flip) {
   GLfloat tx2 = tx / 2, ty2 = ty / 2, tw2 = tw / 2, th2 = th / 2;
   if (!rect_tex) {
     tx /= sx; ty /= sy; tw /= sx; th /= sy;
     tx2 = tx, ty2 = ty, tw2 = tw, th2 = th;
   }
+  if (flip) {
+    y += h;
+    h = -h;
+  }
   glBegin(GL_QUADS);
   glTexCoord2f(tx, ty);
   if (is_yv12) {
--- a/libvo/gl_common.h	Sun Dec 18 11:57:25 2005 +0000
+++ b/libvo/gl_common.h	Sun Dec 18 12:04:08 2005 +0000
@@ -196,7 +196,7 @@
                  int x, int y, int w, int h, int slice);
 void glDrawTex(GLfloat x, GLfloat y, GLfloat w, GLfloat h,
                GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th,
-               int sx, int sy, int rect_tex, int is_yv12);
+               int sx, int sy, int rect_tex, int is_yv12, int flip);
 
 /** \addtogroup glconversion
   * \{ */
--- a/libvo/vo_gl.c	Sun Dec 18 11:57:25 2005 +0000
+++ b/libvo/vo_gl.c	Sun Dec 18 12:04:08 2005 +0000
@@ -90,6 +90,7 @@
 
 static int texture_width;
 static int texture_height;
+static int mpi_flipped;
 
 static unsigned int slice_height = 1;
 
@@ -473,12 +474,12 @@
   // render alpha
   glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
   BindTexture(gl_target, osdatex[osdtexCnt]);
-  glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0);
+  glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0);
 #endif
   // render OSD
   glBlendFunc (GL_ONE, GL_ONE);
   BindTexture(gl_target, osdtex[osdtexCnt]);
-  glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0);
+  glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0);
   glEndList();
 
   osdtexCnt++;
@@ -508,7 +509,7 @@
   glDrawTex(0, 0, image_width, image_height,
             0, 0, image_width, image_height,
             texture_width, texture_height,
-            use_rectangle == 1, image_format == IMGFMT_YV12);
+            use_rectangle == 1, image_format == IMGFMT_YV12, mpi_flipped);
   if (image_format == IMGFMT_YV12)
     glDisableYUVConversion(gl_target, use_yuv);
 
@@ -544,6 +545,7 @@
 //static inline uint32_t draw_slice_x11(uint8_t *src[], uint32_t slice_num)
 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y)
 {
+  mpi_flipped = (stride[0] < 0);
   glUploadTex(gl_target, gl_format, gl_type, src[0], stride[0],
               x, y, w, h, slice_height);
   if (image_format == IMGFMT_YV12) {
@@ -612,6 +614,7 @@
     UnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
     slice = 0; // always "upload" full texture
   }
+  mpi_flipped = (mpi->stride[0] < 0);
   glUploadTex(gl_target, gl_format, gl_type, data, mpi->stride[0],
               mpi->x, mpi->y, mpi->w, mpi->h, slice);
   if (mpi->imgfmt == IMGFMT_YV12) {
--- a/libvo/vo_gl2.c	Sun Dec 18 11:57:25 2005 +0000
+++ b/libvo/vo_gl2.c	Sun Dec 18 12:04:08 2005 +0000
@@ -531,7 +531,8 @@
 
       glDrawTex(square->fx, square->fy, square->fw, square->fh,
                 0, 0, texture_width, texture_height,
-                texture_width, texture_height, 0, image_format == IMGFMT_YV12);
+                texture_width, texture_height,
+                0, image_format == IMGFMT_YV12, 0);
       square++;
     } /* for all texnumx */
   } /* for all texnumy */