changeset 25292:a6a49a7a4be0

Move vobsub palette->yuv convert code into a common function.
author ulion
date Sat, 08 Dec 2007 12:15:03 +0000
parents c48b33da31d3
children 0a5be31447bb
files libmpdemux/demux_mkv.c vobsub.c vobsub.h
diffstat 3 files changed, 24 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_mkv.c	Sat Dec 08 04:29:11 2007 +0000
+++ b/libmpdemux/demux_mkv.c	Sat Dec 08 12:15:03 2007 +0000
@@ -22,6 +22,7 @@
 #include "mp_msg.h"
 #include "help_mp.h"
 
+#include "vobsub.h"
 #include "subreader.h"
 #include "libvo/sub.h"
 
@@ -305,7 +306,7 @@
 static int
 vobsub_parse_palette (sh_sub_t *sh, const char *start)
 {
-  int i, r, g, b, y, u, v, tmp;
+  int i, tmp;
 
   start += 8;
   while (isspace(*start))
@@ -314,14 +315,7 @@
     {
       if (sscanf(start, "%06x", &tmp) != 1)
         break;
-      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;
-      sh->palette[i] = y << 16 | u << 8 | v;
+      sh->palette[i] = vobsub_palette_to_yuv(tmp);
       start += 6;
       while ((*start == ',') || isspace(*start))
         start++;
--- a/vobsub.c	Sat Dec 08 04:29:11 2007 +0000
+++ b/vobsub.c	Sat Dec 08 12:15:03 2007 +0000
@@ -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 @@
     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 @@
     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 @@
 	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 == ',')
--- a/vobsub.h	Sat Dec 08 04:29:11 2007 +0000
+++ b/vobsub.h	Sat Dec 08 12:15:03 2007 +0000
@@ -15,6 +15,9 @@
 /// Get index in the valid streams by vobsub id.
 extern int vobsub_get_index_by_id(void *vobhandle, int id);
 
+/// Convert palette value in idx file to yuv.
+unsigned int vobsub_palette_to_yuv(unsigned int pal);
+
 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);
 extern void vobsub_out_close(void *me);