changeset 30482:794b61a63cc7

Fix subtitle display for DVDs using fade-in/fade-out. This does not do the actual fading, this is not supported by MPlayer, but will just use the highest alpha value used during display.
author reimar
date Sat, 06 Feb 2010 19:57:45 +0000
parents d155e2899ad7
children 74d33572f1ff
files spudec.c
diffstat 1 files changed, 17 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/spudec.c	Sat Feb 06 19:18:09 2010 +0000
+++ b/spudec.c	Sat Feb 06 19:57:45 2010 +0000
@@ -354,7 +354,7 @@
 
 static void spudec_process_control(spudec_handle_t *this, int pts100)
 {
-  int a,b; /* Temporary vars */
+  int a,b,c,d; /* Temporary vars */
   unsigned int date, type;
   unsigned int off;
   unsigned int start_off = 0;
@@ -417,10 +417,22 @@
 	break;
       case 0x04:
 	/* Alpha */
-	this->alpha[0] = this->packet[off] >> 4;
-	this->alpha[1] = this->packet[off] & 0xf;
-	this->alpha[2] = this->packet[off + 1] >> 4;
-	this->alpha[3] = this->packet[off + 1] & 0xf;
+	a = this->packet[off] >> 4;
+	b = this->packet[off] & 0xf;
+	c = this->packet[off + 1] >> 4;
+	d = this->packet[off + 1] & 0xf;
+	// Note: some DVDs change these values to create a fade-in/fade-out effect
+	// We can not handle this, so just keep the highest value during the display time.
+	if (display) {
+		a = FFMAX(a, this->alpha[0]);
+		b = FFMAX(b, this->alpha[1]);
+		c = FFMAX(c, this->alpha[2]);
+		d = FFMAX(d, this->alpha[3]);
+	}
+	this->alpha[0] = a;
+	this->alpha[1] = b;
+	this->alpha[2] = c;
+	this->alpha[3] = d;
 	mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Alpha %d, %d, %d, %d\n",
 	       this->alpha[0], this->alpha[1], this->alpha[2], this->alpha[3]);
 	off+=2;