summaryrefslogtreecommitdiffstats
path: root/video/mp_image.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-12-19 12:04:38 +0100
committerwm4 <wm4@nowhere>2013-01-13 20:04:11 +0100
commitaa6ba6372c627bc602647d225bdfb076f93bd291 (patch)
treedd9a9840b123af5f48881d4d52b1697671018c02 /video/mp_image.c
parentab94c64ed2d8b90bd7b0c348e79c2d8b8d055ee6 (diff)
downloadmpv-aa6ba6372c627bc602647d225bdfb076f93bd291.tar.bz2
mpv-aa6ba6372c627bc602647d225bdfb076f93bd291.tar.xz
mp_image: change how palette is handled
According to DOCS/OUTDATED-tech/colorspaces.txt, the following formats are supposed to be palettized: IMGFMT_BGR8 IMGFMT_RGB8, IMGFMT_BGR4_CHAR IMGFMT_RGB4_CHAR IMGFMT_BGR4 IMGFMT_RGB4 Of these, only BGR8 and RGB8 are actually treated as palettized in some way. ffmpeg has only one palettized format (AV_PIX_FMT_PAL8), and IMGFMT_BGR8 was inconsistently mapped to packed non-palettized RGB formats too (AV_PIX_FMT_BGR8). Moreover, vf_scale.c contained messy hacks to generate a palette when AV_PIX_FMT_BGR8 is output. (libswscale does not support AV_PIX_FMT_PAL8 output in the first place.) Get rid of all of this, and introduce IMGFMT_PAL8, which directly maps to AV_PIX_FMT_PAL8. Remove the palette creation code from vf_scale.c. IMGFMT_BGR8 maps to AV_PIX_FMT_RGB8 (don't ask me why it's swapped), without any palette use. Enabling it in vo_x11 or using it as vf_scale input seems to give correct results.
Diffstat (limited to 'video/mp_image.c')
-rw-r--r--video/mp_image.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/video/mp_image.c b/video/mp_image.c
index 7bcf3b1771..00f8cb2c28 100644
--- a/video/mp_image.c
+++ b/video/mp_image.c
@@ -105,7 +105,7 @@ static void mp_image_alloc_planes(struct mp_image *mpi)
mpi->stride[n] = FFALIGN(line_bytes, SWS_MIN_BYTE_ALIGN);
plane_size[n] = mpi->stride[n] * mpi->plane_h[n];
}
- if (mpi->flags & MP_IMGFLAG_RGB_PALETTE)
+ if (mpi->imgfmt == IMGFMT_PAL8)
plane_size[1] = MP_PALETTE_SIZE;
size_t sum = 0;
@@ -184,8 +184,6 @@ struct mp_image *mp_image_alloc(unsigned int imgfmt, int w, int h)
mpi->refcount = m_refcount_new();
mpi->refcount->free = av_free;
mpi->refcount->arg = mpi->planes[0];
- // NOTE: palette isn't free'd. Palette handling should be fixed instead.
-
return mpi;
}
@@ -318,6 +316,8 @@ void mp_image_copy(struct mp_image *dst, struct mp_image *src)
memcpy_pic(dst->planes[n], src->planes[n], line_bytes, dst->plane_h[n],
dst->stride[n], src->stride[n]);
}
+ if (dst->imgfmt == IMGFMT_PAL8)
+ memcpy(dst->planes[1], src->planes[1], MP_PALETTE_SIZE);
}
enum mp_csp mp_image_csp(struct mp_image *img)