diff options
author | ulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-12-08 12:15:03 +0000 |
---|---|---|
committer | ulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-12-08 12:15:03 +0000 |
commit | 151e8cceec6bc6803fb29685b4f95b2ed0e0ca8c (patch) | |
tree | 7014fb277df4900c30cf083e1b5cdae6c0d50509 /vobsub.c | |
parent | 460de55771934eedfb870ef734bd3cdea6c4095f (diff) | |
download | mpv-151e8cceec6bc6803fb29685b4f95b2ed0e0ca8c.tar.bz2 mpv-151e8cceec6bc6803fb29685b4f95b2ed0e0ca8c.tar.xz |
Move vobsub palette->yuv convert code into a common function.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25320 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'vobsub.c')
-rw-r--r-- | vobsub.c | 27 |
1 files changed, 18 insertions, 9 deletions
@@ -13,6 +13,7 @@ #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> +#include <math.h> #include "config.h" #include "version.h" @@ -802,6 +803,21 @@ vobsub_parse_origin(vobsub_t *vob, const char *line) return 0; } +unsigned int vobsub_palette_to_yuv(unsigned int pal) +{ + int r, g, b, y, u, v; + // Palette in idx file is not rgb value, it was calculated by wrong forumla. + // Here's reversed forumla of the one used to generate palette in idx file. + r = pal >> 16 & 0xff; + g = pal >> 8 & 0xff; + b = pal & 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); + y = y * 219 / 255 + 16; + return y << 16 | u << 8 | v; +} + static int vobsub_parse_palette(vobsub_t *vob, const char *line) { @@ -810,7 +826,7 @@ vobsub_parse_palette(vobsub_t *vob, const char *line) n = 0; while (1) { const char *p; - int r, g, b, y, u, v, tmp; + int tmp; while (isspace(*line)) ++line; p = line; @@ -819,14 +835,7 @@ vobsub_parse_palette(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); - y = y * 219 / 255 + 16; - vob->palette[n++] = y << 16 | u << 8 | v; + vob->palette[n++] = vobsub_palette_to_yuv(tmp); if (n == 16) break; if (*p == ',') |