# HG changeset patch # User reimar # Date 1134907448 0 # Node ID a27e52b838e31656061706347af306141718c24f # Parent fde45c312c31d46a9ddd8eada5c4194661bf08c8 support negative stride (flipping) in vo_gl. diff -r fde45c312c31 -r a27e52b838e3 libvo/gl_common.c --- 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) { diff -r fde45c312c31 -r a27e52b838e3 libvo/gl_common.h --- 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 * \{ */ diff -r fde45c312c31 -r a27e52b838e3 libvo/vo_gl.c --- 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) { diff -r fde45c312c31 -r a27e52b838e3 libvo/vo_gl2.c --- 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 */