summaryrefslogtreecommitdiffstats
path: root/sub
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-10-08 00:14:51 +0200
committerwm4 <wm4@nowhere>2012-10-24 21:56:33 +0200
commitf6197249a783f00ae583e67d113ed737d677f12c (patch)
tree3fb6af12aca6403bddf06c1c4e06f597a5019078 /sub
parentfd5c4a19849b768986a0e652bb2f398c922f42dd (diff)
downloadmpv-f6197249a783f00ae583e67d113ed737d677f12c.tar.bz2
mpv-f6197249a783f00ae583e67d113ed737d677f12c.tar.xz
spudec: use csputils for color conversion
Just to get rid of that conversion copy&pasted from the internet. R and G are swapped for unknown reasons. Testing various subtitles seem to yield the same results as VLC. The sub-bitmap renderers output the correct colors. The colorspace conversion is used without problems for vo_gl, vo_gl3 and vo_vdpau. The problem is most likely that apparently, the DVD palette read from the subtitle track extradata is converted to YUV using vobsub_palette_to_yuv(), and swapped in the process. Or in other words, the YUV colors spu->global_palette are encoded with R and G swapped. Add some utility definition to csputils.c/h to make converting single color values easier.
Diffstat (limited to 'sub')
-rw-r--r--sub/spudec.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/sub/spudec.c b/sub/spudec.c
index 734b8f1846..353f72de7a 100644
--- a/sub/spudec.c
+++ b/sub/spudec.c
@@ -46,6 +46,7 @@
#include "vobsub.h"
#include "sub.h"
#include "mpcommon.h"
+#include "libvo/csputils.h"
typedef struct spu_packet_t packet_t;
struct spu_packet_t {
@@ -186,6 +187,9 @@ static int spudec_alloc_image(spudec_handle_t *this, int stride, int height)
static void setup_palette(spudec_handle_t *spu, uint32_t palette[256])
{
memset(palette, 0, sizeof(palette));
+ struct mp_csp_params csp = MP_CSP_PARAMS_DEFAULTS;
+ float cmatrix[3][4];
+ mp_get_yuv2rgb_coeffs(&csp, cmatrix);
for (int i = 0; i < 4; ++i) {
int alpha = spu->alpha[i];
// extend 4 -> 8 bit
@@ -194,16 +198,10 @@ static void setup_palette(spudec_handle_t *spu, uint32_t palette[256])
alpha = 0;
int color = spu->custom ? spu->cuspal[i] :
spu->global_palette[spu->palette[i]];
- int y = (color >> 16) & 0xff;
- int u = (color >> 8) & 0xff;
- int v = color & 0xff;
- // stolen from some site, likely incorrect
- int b = 1.164 * (y - 16) + 2.018 * (u - 128);
- int g = 1.164 * (y - 16) - 0.813 * (v - 128) - 0.391 * (u - 128);
- int r = 1.164 * (y - 16) + 1.596 * (v - 128);
-#define CL(x) FFMAX(FFMIN((x), 255), 0)
- palette[i] = (alpha << 24) | CL(r) | (CL(g) << 8) | (CL(b) << 16);
-#undef CL
+ uint8_t c[3] = {(color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff};
+ mp_map_color(cmatrix, c);
+ // R and G swapped, possibly due to vobsub_palette_to_yuv()
+ palette[i] = (alpha << 24) | (c[2] << 16) | (c[1] << 8) | c[0];
}
}