Index: libmpdemux/demux_mkv.c =================================================================== --- libmpdemux/demux_mkv.c (revision 25320) +++ libmpdemux/demux_mkv.c (working copy) @@ -342,7 +342,7 @@ static int vobsub_parse_custom_colors (sh_sub_t *sh, const char *start) { - int use_custom_colors, i; + int use_custom_colors, i, tmp; use_custom_colors = 0; start += 14; @@ -361,8 +361,9 @@ start++; for (i = 0; i < 4; i++) { - if (sscanf(start, "%06x", &sh->colors[i]) != 1) + if (sscanf(start, "%06x", &tmp) != 1) break; + sh->colors[i] = vobsub_rgb_to_yuv(tmp); start += 6; while ((*start == ',') || isspace(*start)) start++; Index: vobsub.c =================================================================== --- vobsub.c (revision 25320) +++ vobsub.c (working copy) @@ -818,6 +818,18 @@ return y << 16 | u << 8 | v; } +unsigned int vobsub_rgb_to_yuv(unsigned int rgb) +{ + int r, g, b, y, u, v; + r = rgb >> 16 & 0xff; + g = rgb >> 8 & 0xff; + b = rgb & 0xff; + y = round(( 0.299 * r + 0.587 * g + 0.114 * b) * 219 / 255 + 16); + u = round((-0.16874 * r - 0.33126 * g + 0.5 * b) * 224 / 255 + 128); + v = round(( 0.5 * r - 0.41869 * g - 0.08131 * b) * 224 / 255 + 128); + return y << 16 | u << 8 | v; +} + static int vobsub_parse_palette(vobsub_t *vob, const char *line) { @@ -864,7 +876,6 @@ { //colors: XXXXXX, XXXXXX, XXXXXX, XXXXXX unsigned int n, tmp; - int r, g, b, y, u, v; n = 0; line += 40; while(1){ @@ -877,13 +888,7 @@ if (p - line !=6) return -1; tmp = strtoul(line, NULL, 16); - r = tmp >> 16 & 0xff; - g = tmp >> 8 & 0xff; - b = tmp & 0xff; - y = av_clip_uint8( 0.1494 * r + 0.6061 * g + 0.2445 * b); - u = av_clip_uint8( 0.6066 * r - 0.4322 * g - 0.1744 * b + 128); - v = av_clip_uint8(-0.08435 * r - 0.3422 * g + 0.4266 * b + 128); - vob->cuspal[n++] = y << 16 | u << 8 | v; + vob->cuspal[n++] = vobsub_rgb_to_yuv(tmp); if (n==4) break; if(*p == ',') Index: vobsub.h =================================================================== --- vobsub.h (revision 25320) +++ vobsub.h (working copy) @@ -17,6 +17,8 @@ /// Convert palette value in idx file to yuv. unsigned int vobsub_palette_to_yuv(unsigned int pal); +/// Convert rgb value to yuv. +unsigned int vobsub_rgb_to_yuv(unsigned int rgb); extern void *vobsub_out_open(const char *basename, const unsigned int *palette, unsigned int orig_width, unsigned int orig_height, const char *id, unsigned int index); extern void vobsub_out_output(void *me, const unsigned char *packet, int len, double pts);