+ else if( !strncmp( "palette:", line, 8 ) )
+ {
+ int i;
+
+ /* Store the palette of the subs */
+ if( sscanf( line, "palette: %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x",
+ &p_sys->palette[0], &p_sys->palette[1], &p_sys->palette[2], &p_sys->palette[3],
+ &p_sys->palette[4], &p_sys->palette[5], &p_sys->palette[6], &p_sys->palette[7],
+ &p_sys->palette[8], &p_sys->palette[9], &p_sys->palette[10], &p_sys->palette[11],
+ &p_sys->palette[12], &p_sys->palette[13], &p_sys->palette[14], &p_sys->palette[15] ) == 16 )
+ {
+ for( i = 0; i < 16; i++ )
+ {
+ uint8_t r = 0, g = 0, b = 0;
+ uint8_t y = 0, u = 0, v = 0;
+ r = (p_sys->palette[i] >> 16) & 0xff;
+ g = (p_sys->palette[i] >> 8) & 0xff;
+ b = (p_sys->palette[i] >> 0) & 0xff;
+ /* msg_Dbg( p_demux, "palette %d: R=%x, G=%x, B=%x", i, r, g, b ); */
+ y = (uint8_t) __MIN(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235);
+ u = (uint8_t) __MIN(abs(r * -1214 + g * -2384 + b * 3598 + 4096 + 1048576) >> 13, 240);
+ v = (uint8_t) __MIN(abs(r * 3598 + g * -3013 + b * -585 + 4096 + 1048576) >> 13, 240);
+ p_sys->palette[i] = 0;
+ p_sys->palette[i] |= (y&0xff)<<16;
+ p_sys->palette[i] |= (u&0xff);
+ p_sys->palette[i] |= (v&0xff)<<8;
+ /* msg_Dbg( p_demux, "palette %d: y=%x, u=%x, v=%x", i, y, u, v ); */
+
+ }
+ p_sys->b_palette = VLC_TRUE;
+ msg_Dbg( p_demux, "vobsub palette read" );
+ }
+ else
+ {
+ msg_Warn( p_demux, "reading original palette failed" );
+ }
+ }