[MPlayer-cvslog] r34811 - trunk/libvo/vo_gl.c
reimar
subversion at mplayerhq.hu
Tue Mar 13 19:19:37 CET 2012
Author: reimar
Date: Tue Mar 13 19:19:36 2012
New Revision: 34811
Log:
Fix PBO handling with > 8 bit YUV formats.
Thanks to Ivan for debugging it.
Modified:
trunk/libvo/vo_gl.c
Modified: trunk/libvo/vo_gl.c
==============================================================================
--- trunk/libvo/vo_gl.c Tue Mar 13 12:44:05 2012 (r34810)
+++ trunk/libvo/vo_gl.c Tue Mar 13 19:19:36 2012 (r34811)
@@ -965,13 +965,15 @@ static uint32_t get_image(mp_image_t *mp
if (is_yuv) {
// planar YUV
int xs, ys;
- mp_get_chroma_shift(image_format, &xs, &ys, NULL);
+ int bpp;
+ mp_get_chroma_shift(image_format, &xs, &ys, &bpp);
+ bpp = (bpp + 7) / 8;
mpi->flags |= MP_IMGFLAG_COMMON_STRIDE | MP_IMGFLAG_COMMON_PLANE;
- mpi->stride[0] = mpi->width;
+ mpi->stride[0] = mpi->width * bpp;
mpi->planes[1] = mpi->planes[0] + mpi->stride[0] * mpi->height;
- mpi->stride[1] = mpi->width >> xs;
+ mpi->stride[1] = (mpi->width >> xs) * bpp;
mpi->planes[2] = mpi->planes[1] + mpi->stride[1] * (mpi->height >> ys);
- mpi->stride[2] = mpi->width >> xs;
+ mpi->stride[2] = mpi->stride[1];
if (ati_hack && !mesa_buffer) {
mpi->flags &= ~MP_IMGFLAG_COMMON_PLANE;
if (!gl_buffer_uv[0]) mpglGenBuffers(2, gl_buffer_uv);
@@ -1021,19 +1023,23 @@ static uint32_t draw_image(mp_image_t *m
mpi2.flags = 0; mpi2.type = MP_IMGTYPE_TEMP;
mpi2.width = mpi2.w; mpi2.height = mpi2.h;
if (force_pbo && !(mpi->flags & MP_IMGFLAG_DIRECT) && !gl_bufferptr && get_image(&mpi2) == VO_TRUE) {
- int bpp = is_yuv ? 8 : mpi->bpp;
+ int bpp;
+ int line_bytes, line_bytes_c;
int xs, ys;
- mp_get_chroma_shift(image_format, &xs, &ys, NULL);
- memcpy_pic(mpi2.planes[0], mpi->planes[0], mpi->w * bpp / 8, mpi->h, mpi2.stride[0], mpi->stride[0]);
+ mp_get_chroma_shift(image_format, &xs, &ys, &bpp);
+ bpp = is_yuv ? (bpp + 7) & ~7 : mpi->bpp;
+ line_bytes = mpi->w * bpp / 8;
+ line_bytes_c = (mpi->w >> xs) * bpp / 8;
+ memcpy_pic(mpi2.planes[0], mpi->planes[0], line_bytes, mpi->h, mpi2.stride[0], mpi->stride[0]);
if (is_yuv) {
- memcpy_pic(mpi2.planes[1], mpi->planes[1], mpi->w >> xs, mpi->h >> ys, mpi2.stride[1], mpi->stride[1]);
- memcpy_pic(mpi2.planes[2], mpi->planes[2], mpi->w >> xs, mpi->h >> ys, mpi2.stride[2], mpi->stride[2]);
+ memcpy_pic(mpi2.planes[1], mpi->planes[1], line_bytes_c, mpi->h >> ys, mpi2.stride[1], mpi->stride[1]);
+ memcpy_pic(mpi2.planes[2], mpi->planes[2], line_bytes_c, mpi->h >> ys, mpi2.stride[2], mpi->stride[2]);
}
if (ati_hack) { // since we have to do a full upload we need to clear the borders
- clear_border(mpi2.planes[0], mpi->w * bpp / 8, mpi2.stride[0], mpi->h, mpi2.height, 0);
+ clear_border(mpi2.planes[0], line_bytes, mpi2.stride[0], mpi->h, mpi2.height, 0);
if (is_yuv) {
- clear_border(mpi2.planes[1], mpi->w >> xs, mpi2.stride[1], mpi->h >> ys, mpi2.height >> ys, 128);
- clear_border(mpi2.planes[2], mpi->w >> xs, mpi2.stride[2], mpi->h >> ys, mpi2.height >> ys, 128);
+ clear_border(mpi2.planes[1], line_bytes_c, mpi2.stride[1], mpi->h >> ys, mpi2.height >> ys, 128);
+ clear_border(mpi2.planes[2], line_bytes_c, mpi2.stride[2], mpi->h >> ys, mpi2.height >> ys, 128);
}
}
mpi = &mpi2;
More information about the MPlayer-cvslog
mailing list