diff options
author | Torsten Jager <t.jager@gmx.de> | 2014-06-18 22:53:45 +0200 |
---|---|---|
committer | Torsten Jager <t.jager@gmx.de> | 2014-06-18 22:53:45 +0200 |
commit | 0c1831805f5fd12806841feaa8ce51d1b7eb081e (patch) | |
tree | e40f355e2fb63cb3e455f9a09a6b9a1fb99e9d14 /src | |
parent | 3a71697cc61f1a131dcec073ce4f4e2634e2cb49 (diff) | |
download | xine-lib-0c1831805f5fd12806841feaa8ce51d1b7eb081e.tar.gz xine-lib-0c1831805f5fd12806841feaa8ce51d1b7eb081e.tar.bz2 |
Fix overlay colors #2.
Keep old SD matrix only features working.
Diffstat (limited to 'src')
-rw-r--r-- | src/spu_dec/spudvb_decoder.c | 2 | ||||
-rw-r--r-- | src/spu_dec/spuhdmv_decoder.c | 3 | ||||
-rw-r--r-- | src/xine-engine/video_overlay.c | 14 |
3 files changed, 16 insertions, 3 deletions
diff --git a/src/spu_dec/spudvb_decoder.c b/src/spu_dec/spudvb_decoder.c index 553431ae5..1c58c0c97 100644 --- a/src/spu_dec/spudvb_decoder.c +++ b/src/spu_dec/spudvb_decoder.c @@ -1051,6 +1051,8 @@ static void draw_subtitles (dvb_spu_decoder_t * this) reg = this->dvbsub->regions[r].img; reg_width = this->dvbsub->regions[r].width; } + /* All DVB subs I have seen so far use same color matrix as main video. */ + _X_SET_CLUT_CM (&this->dvbsub->colours[this->dvbsub->regions[r].CLUT_id*256].u32, 4); this->stream->osd_renderer->set_palette( this->dvbsub->regions[r].osd, &this->dvbsub->colours[this->dvbsub->regions[r].CLUT_id*256].u32, &this->dvbsub->trans[this->dvbsub->regions[r].CLUT_id*256]); diff --git a/src/spu_dec/spuhdmv_decoder.c b/src/spu_dec/spuhdmv_decoder.c index 9ad912e14..2d457b85a 100644 --- a/src/spu_dec/spuhdmv_decoder.c +++ b/src/spu_dec/spuhdmv_decoder.c @@ -378,6 +378,9 @@ static subtitle_clut_t *segbuf_decode_palette(segment_buffer_t *buf) clut->trans[index] = alpha >> 4; } + /* HDMV subs always use same color matrix as main video. */ + _X_SET_CLUT_CM (clut->color, 4); + return clut; } diff --git a/src/xine-engine/video_overlay.c b/src/xine-engine/video_overlay.c index eb5abf201..ec749054b 100644 --- a/src/xine-engine/video_overlay.c +++ b/src/xine-engine/video_overlay.c @@ -494,15 +494,23 @@ static int video_overlay_event( video_overlay_t *this, int64_t vpts ) { return processed; } -void _x_overlay_clut_yuv2rgb(vo_overlay_t *overlay, int color_matrix) +void _x_overlay_clut_yuv2rgb(vo_overlay_t *overlay, int video_color_matrix) { + int cm = 10; /* ITU-R 601 (SD) */ + if (!overlay->rgb_clut) { - _x_clut_yuv2rgb(overlay->color, sizeof(overlay->color) / sizeof (overlay->color[0]), color_matrix); + uint8_t *p = (uint8_t *)overlay->color; + if ((p[3] == 'X') && (p[7] == 'C') && (p[11] == 'M')) { + cm = p[15]; + if ((cm >> 1) == 2) /* undefined */ + cm = video_color_matrix; + } + _x_clut_yuv2rgb(overlay->color, sizeof(overlay->color) / sizeof (overlay->color[0]), cm); overlay->rgb_clut++; } if (!overlay->hili_rgb_clut) { - _x_clut_yuv2rgb(overlay->hili_color, sizeof (overlay->color) / sizeof (overlay->color[0]), color_matrix); + _x_clut_yuv2rgb(overlay->hili_color, sizeof (overlay->color) / sizeof (overlay->color[0]), cm); overlay->hili_rgb_clut++; } } |