mirror of https://github.com/mpv-player/mpv
support negative stride (flipping) in vo_gl.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17221 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
06ed3c2b57
commit
2a15e8beb8
|
@ -493,6 +493,10 @@ void glUploadTex(GLenum target, GLenum format, GLenum type,
|
|||
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 @@ void inline glDisableYUVConversion(GLenum target, int type) {
|
|||
* \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) {
|
||||
|
|
|
@ -196,7 +196,7 @@ void glUploadTex(GLenum target, GLenum format, GLenum type,
|
|||
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
|
||||
* \{ */
|
||||
|
|
|
@ -90,6 +90,7 @@ static int eq_bgamma = 0;
|
|||
|
||||
static int texture_width;
|
||||
static int texture_height;
|
||||
static int mpi_flipped;
|
||||
|
||||
static unsigned int slice_height = 1;
|
||||
|
||||
|
@ -473,12 +474,12 @@ static void create_osd_texture(int x0, int y0, int w, int h,
|
|||
// 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 @@ flip_page(void)
|
|||
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 @@ flip_page(void)
|
|||
//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 @@ static uint32_t draw_image(mp_image_t *mpi) {
|
|||
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) {
|
||||
|
|
|
@ -531,7 +531,8 @@ static void drawTextureDisplay ()
|
|||
|
||||
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 */
|
||||
|
|
Loading…
Reference in New Issue