summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/spu_dec/spudvb_decoder.c78
1 files changed, 44 insertions, 34 deletions
diff --git a/src/spu_dec/spudvb_decoder.c b/src/spu_dec/spudvb_decoder.c
index 149917ad5..197b1cd49 100644
--- a/src/spu_dec/spudvb_decoder.c
+++ b/src/spu_dec/spudvb_decoder.c
@@ -79,7 +79,9 @@ typedef struct {
region_t regions[MAX_REGIONS];
clut_t colours[MAX_REGIONS*256];
unsigned char trans[MAX_REGIONS*256];
- unsigned char lut24[4], lut28[4], lut48[16];
+ struct {
+ unsigned char lut24[4], lut28[4], lut48[16];
+ } lut[MAX_REGIONS];
} dvbsub_func_t;
typedef struct dvb_spu_class_s {
@@ -118,6 +120,33 @@ static clut_t default_clut[256];
static unsigned char default_trans[256];
static int default_colours_init = 0;
+static void reset_clut (dvbsub_func_t *dvbsub)
+{
+ int i, r;
+
+ /* Reset the colour LUTs */
+ for (r = 0; r < MAX_REGIONS; ++r)
+ {
+ memcpy (dvbsub->colours + r * 256, default_clut, sizeof (default_clut));
+ memcpy (dvbsub->trans + r * 256, default_trans, sizeof (default_trans));
+ }
+
+ /* Reset the colour index LUTs */
+ for (r = 0; r < MAX_REGIONS; ++r)
+ {
+ dvbsub->lut[r].lut24[0] = 0x0;
+ dvbsub->lut[r].lut24[1] = 0x7;
+ dvbsub->lut[r].lut24[2] = 0x8;
+ dvbsub->lut[r].lut24[3] = 0xF;
+ dvbsub->lut[r].lut28[0] = 0x00;
+ dvbsub->lut[r].lut28[1] = 0x77;
+ dvbsub->lut[r].lut28[2] = 0x88;
+ dvbsub->lut[r].lut28[3] = 0xFF;
+ for (i = 0; i < 16; ++i)
+ dvbsub->lut[r].lut48[i] = i | i << 4;
+ }
+}
+
static void update_osd(dvb_spu_decoder_t *this, int region_id)
{
dvbsub_func_t *dvbsub = this->dvbsub;
@@ -215,15 +244,15 @@ static void plot (dvb_spu_decoder_t * this, int r, int run_length, unsigned char
}
}
-static const uint8_t *lookup_lut (const dvbsub_func_t *dvbsub)
+static const uint8_t *lookup_lut (const dvbsub_func_t *dvbsub, int r)
{
static const uint8_t identity_lut[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
switch (dvbsub->compat_depth)
{
- case 012: return dvbsub->lut24;
- case 013: return dvbsub->lut28;
- case 023: return dvbsub->lut48;
+ case 012: return dvbsub->lut[r].lut24;
+ case 013: return dvbsub->lut[r].lut28;
+ case 023: return dvbsub->lut[r].lut48;
default: return identity_lut;
}
}
@@ -258,7 +287,7 @@ static void decode_2bit_pixel_code_string (dvb_spu_decoder_t * this, int r, int
{
dvbsub_func_t *dvbsub = this->dvbsub;
int j;
- const uint8_t *lut = lookup_lut (dvbsub);
+ const uint8_t *lut = lookup_lut (dvbsub, r);
if (dvbsub->in_scanline == 0)
dvbsub->in_scanline = 1;
@@ -324,7 +353,7 @@ static void decode_4bit_pixel_code_string (dvb_spu_decoder_t * this, int r, int
{
dvbsub_func_t *dvbsub = this->dvbsub;
int j;
- const uint8_t *lut = lookup_lut (dvbsub);
+ const uint8_t *lut = lookup_lut (dvbsub, r);
if (dvbsub->in_scanline == 0)
dvbsub->in_scanline = 1;
@@ -456,7 +485,7 @@ static void set_clut(dvb_spu_decoder_t *this,int CLUT_id,int CLUT_entry_id,int Y
dvbsub_func_t *dvbsub = this->dvbsub;
- if ((CLUT_id>=MAX_REGIONS) || (CLUT_entry_id>15)) {
+ if ((CLUT_id>=MAX_REGIONS) || (CLUT_entry_id>255)) {
return;
}
@@ -546,18 +575,18 @@ static void process_pixel_data_sub_block (dvb_spu_decoder_t * this, int r, int o
break;
case 0x20: /* 2-to-4bit colour index map */
/* should this be implemented since we have an 8-bit overlay? */
- dvbsub->lut24[0] = dvbsub->buf[dvbsub->i ] >> 4;
- dvbsub->lut24[1] = dvbsub->buf[dvbsub->i ] & 0x0f;
- dvbsub->lut24[2] = dvbsub->buf[dvbsub->i + 1] >> 4;
- dvbsub->lut24[3] = dvbsub->buf[dvbsub->i + 1] & 0x0f;
+ dvbsub->lut[r].lut24[0] = dvbsub->buf[dvbsub->i ] >> 4;
+ dvbsub->lut[r].lut24[1] = dvbsub->buf[dvbsub->i ] & 0x0f;
+ dvbsub->lut[r].lut24[2] = dvbsub->buf[dvbsub->i + 1] >> 4;
+ dvbsub->lut[r].lut24[3] = dvbsub->buf[dvbsub->i + 1] & 0x0f;
dvbsub->i += 2;
break;
case 0x21: /* 2-to-8bit colour index map */
- memcpy (dvbsub->lut28, dvbsub->buf + dvbsub->i, 4);
+ memcpy (dvbsub->lut[r].lut28, dvbsub->buf + dvbsub->i, 4);
dvbsub->i += 4;
break;
case 0x22:
- memcpy (dvbsub->lut48, dvbsub->buf + dvbsub->i, 16);
+ memcpy (dvbsub->lut[r].lut48, dvbsub->buf + dvbsub->i, 16);
dvbsub->i += 16;
break;
case 0xf0:
@@ -890,7 +919,6 @@ static void draw_subtitles (dvb_spu_decoder_t * this)
pthread_mutex_unlock(&this->dvbsub_osd_mutex);
}
-
static void spudec_decode_data (spu_decoder_t * this_gen, buf_element_t * buf)
{
dvb_spu_decoder_t *this = (dvb_spu_decoder_t *) this_gen;
@@ -959,25 +987,7 @@ static void spudec_decode_data (spu_decoder_t * this_gen, buf_element_t * buf)
/* completely ignore pts since it makes a lot of problems with various providers */
this->vpts = 0;
- /* Reset the colour LUTs */
- for (i = 0; i < MAX_REGIONS; ++i)
- {
- memcpy (this->dvbsub->colours + i * 256, default_clut, sizeof (default_clut));
- memcpy (this->dvbsub->trans + i * 256, default_trans, sizeof (default_trans));
- }
-
- /* Reset the colour index LUTs */
- this->dvbsub->lut24[0] = 0x0;
- this->dvbsub->lut24[1] = 0x7;
- this->dvbsub->lut24[2] = 0x8;
- this->dvbsub->lut24[3] = 0xF;
- this->dvbsub->lut28[0] = 0x00;
- this->dvbsub->lut28[1] = 0x77;
- this->dvbsub->lut28[2] = 0x88;
- this->dvbsub->lut28[3] = 0xFF;
- for (i = 0; i < 16; ++i)
- this->dvbsub->lut48[i] = i | i << 4;
-
+ reset_clut (this->dvbsub);
/* process the pes section */
PES_packet_length = this->pes_pkt_size;