summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmpdemux/demux_mkv.c4
-rw-r--r--vobsub.c21
2 files changed, 16 insertions, 9 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index c383872518..00acc803d7 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -356,13 +356,15 @@ vobsub_parse_custom_colors (sh_sub_t *sh, const char *start)
use_custom_colors ? "ON" : "OFF");
if ((start = strstr(start, "colors:")) != NULL)
{
+ unsigned int tmp;
start += 7;
while (isspace(*start))
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++;
diff --git a/vobsub.c b/vobsub.c
index 7a67b4ba6e..d76f744d79 100644
--- a/vobsub.c
+++ b/vobsub.c
@@ -817,6 +817,18 @@ unsigned int vobsub_palette_to_yuv(unsigned int pal)
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 = ( 0.299 * r + 0.587 * g + 0.114 * b) * 219 / 255 + 16.5;
+ u = (-0.16874 * r - 0.33126 * g + 0.5 * b) * 224 / 255 + 128.5;
+ v = ( 0.5 * r - 0.41869 * g - 0.08131 * b) * 224 / 255 + 128.5;
+ return y << 16 | u << 8 | v;
+}
+
static int
vobsub_parse_palette(vobsub_t *vob, const char *line)
{
@@ -863,7 +875,6 @@ vobsub_parse_cuspal(vobsub_t *vob, const char *line)
{
//colors: XXXXXX, XXXXXX, XXXXXX, XXXXXX
unsigned int n, tmp;
- int r, g, b, y, u, v;
n = 0;
line += 40;
while(1){
@@ -876,13 +887,7 @@ vobsub_parse_cuspal(vobsub_t *vob, const char *line)
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 == ',')