From 0a786810af09f974be427b9bda9799be5ec34e88 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Wed, 16 Feb 2011 21:17:57 -0800 Subject: [PATCH] dvdsubdec: make up clut values if they weren't set --- gst/dvdspu/gstspu-vobsub-render.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/gst/dvdspu/gstspu-vobsub-render.c b/gst/dvdspu/gstspu-vobsub-render.c index 0605408..830017d 100644 --- a/gst/dvdspu/gstspu-vobsub-render.c +++ b/gst/dvdspu/gstspu-vobsub-render.c @@ -37,15 +37,33 @@ gstspu_vobsub_recalc_palette (GstDVDSpu * dvdspu, SpuState *state = &dvdspu->spu_state; gint i; - for (i = 0; i < 4; i++, dest++) { - guint32 col = state->vobsub.current_clut[idx[i]]; - - /* Convert incoming 4-bit alpha to 8 bit for blending */ - dest->A = (alpha[i] << 4) | alpha[i]; - dest->Y = ((guint16) ((col >> 16) & 0xff)) * dest->A; - /* U/V are stored as V/U in the clut words, so switch them */ - dest->V = ((guint16) ((col >> 8) & 0xff)) * dest->A; - dest->U = ((guint16) (col & 0xff)) * dest->A; + if (state->vobsub.current_clut[idx[0]] != 0) { + for (i = 0; i < 4; i++, dest++) { + guint32 col = state->vobsub.current_clut[idx[i]]; + + /* Convert incoming 4-bit alpha to 8 bit for blending */ + dest->A = (alpha[i] << 4) | alpha[i]; + dest->Y = ((guint16) ((col >> 16) & 0xff)) * dest->A; + /* U/V are stored as V/U in the clut words, so switch them */ + dest->V = ((guint16) ((col >> 8) & 0xff)) * dest->A; + dest->U = ((guint16) (col & 0xff)) * dest->A; + } + } else { + int y = 240; + + /* The CLUT presumably hasn't been set, so we'll just guess some + * values for the non-transparent colors (white, grey, black) */ + for (i = 0; i < 4; i++, dest++) { + dest->A = (alpha[i] << 4) | alpha[i]; + if (alpha[i] != 0) { + dest[0].Y = y * dest[0].A; + y -= 112; + if (y < 0) + y = 0; + } + dest[0].U = 128 * dest[0].A; + dest[0].V = 128 * dest[0].A; + } } } -- 2.7.4