summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Courtier-Dutton <jcdutton@users.sourceforge.net>2002-01-15 20:22:43 +0000
committerJames Courtier-Dutton <jcdutton@users.sourceforge.net>2002-01-15 20:22:43 +0000
commit9d9e5affa515e4d4fe2fabb738fd0ae0b77967f4 (patch)
tree57eb9d77d2c9fabcb69ac42e8d9d04e7a01337e1
parentf22590515f098d54921a1a68af85fe1165b50571 (diff)
downloadxine-lib-9d9e5affa515e4d4fe2fabb738fd0ae0b77967f4.tar.gz
xine-lib-9d9e5affa515e4d4fe2fabb738fd0ae0b77967f4.tar.bz2
Beginning of overlay highlights correction work.
XV colours look good, XShm colours do not. CVS patchset: 1411 CVS date: 2002/01/15 20:22:43
-rw-r--r--src/libspudec/xine_decoder.c48
-rw-r--r--src/video_out/alphablend.c36
-rw-r--r--src/xine-engine/osd.c4
-rw-r--r--src/xine-engine/video_out.h5
-rw-r--r--src/xine-engine/video_overlay.c41
5 files changed, 91 insertions, 43 deletions
diff --git a/src/libspudec/xine_decoder.c b/src/libspudec/xine_decoder.c
index de161bc2f..e92586a52 100644
--- a/src/libspudec/xine_decoder.c
+++ b/src/libspudec/xine_decoder.c
@@ -19,7 +19,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine_decoder.c,v 1.54 2002/01/06 19:48:16 jcdutton Exp $
+ * $Id: xine_decoder.c,v 1.55 2002/01/15 20:22:43 jcdutton Exp $
*
* stuff needed to turn libspu into a xine decoder plugin
*/
@@ -150,9 +150,16 @@ static void spudec_copy_nav_to_spu(spudec_decoder_t *this) {
this->overlay.clip_bottom = button_ptr->y_end;
if(button_ptr->btn_coln != 0) {
for (i = 0;i < 4; i++) {
- this->overlay.color[i] = this->state.clut[0xf & (this->pci.hli.btn_colit.btn_coli[button_ptr->btn_coln-1][0] >> (16 + 4*i))];
- this->overlay.trans[i] = 0xf & (this->pci.hli.btn_colit.btn_coli[button_ptr->btn_coln-1][0] >> (4*i));
+ this->overlay.clip_color[i] = this->state.clut[0xf & (this->pci.hli.btn_colit.btn_coli[button_ptr->btn_coln-1][0] >> (16 + 4*i))];
+ this->overlay.clip_trans[i] = 0xf & (this->pci.hli.btn_colit.btn_coli[button_ptr->btn_coln-1][0] >> (4*i));
}
+ } else {
+ for (i = 0;i < 4; i++) {
+ printf("libspudec:btn_coln = 0, clip_color = color\n");
+ this->overlay.clip_color[i] = this->overlay.color[i];
+ this->overlay.clip_trans[i] = this->overlay.trans[i];
+ }
+ }
/*************************
printf("libspudec:xine_decode.c:color3=%08x\n",this->overlay.color[3]);
printf("libspudec:xine_decode.c:color2=%08x\n",this->overlay.color[2]);
@@ -163,9 +170,6 @@ static void spudec_copy_nav_to_spu(spudec_decoder_t *this) {
printf("libspudec:xine_decode.c:trans1=%08x\n",this->overlay.trans[1]);
printf("libspudec:xine_decode.c:trans0=%08x\n",this->overlay.trans[0]);
*************************/
- } else {
- /* No colours present in the NAV packet */
- }
printf("libspudec:xine_decoder.c:NAV to SPU pts match!\n");
@@ -225,8 +229,17 @@ static void spu_process (spudec_decoder_t *this, uint32_t stream_id) {
#endif
if (this->pci.hli.hl_gi.hli_s_ptm == this->spu_stream_state[stream_id].pts) {
spudec_copy_nav_to_spu(this);
+ } else {
+ /* Subtitle and not a menu button */
+ int i;
+ for (i = 0;i < 4; i++) {
+ this->overlay.clip_color[i] = this->overlay.color[i];
+ this->overlay.clip_trans[i] = this->overlay.trans[i];
+ }
}
- if ( !(this->overlay.trans[0] | this->overlay.trans[1] | this->overlay.trans[2] | this->overlay.trans[3]) ) {
+
+ if ( !(this->overlay.trans[0] | this->overlay.trans[1] | this->overlay.trans[2] | this->overlay.trans[3] |
+ this->overlay.clip_trans[0] | this->overlay.clip_trans[1] | this->overlay.clip_trans[2] | this->overlay.clip_trans[3]) ) {
/* SPU is transparent so why bother displaying it. */
printf ("spu: transparent spu found, discarding it.\n" );
return;
@@ -348,8 +361,8 @@ static void spudec_decode_nav(spudec_decoder_t *this, buf_element_t *buf) {
p += header_len;
if (stream_id == 0xbf) { /* Private stream 2 */
- int i;
-/* for(i=0;i<80;i++) {
+/* int i;
+ * for(i=0;i<80;i++) {
* printf("%02x ",p[i]);
* }
* printf("\n p[0]=0x%02x\n",p[0]);
@@ -623,14 +636,15 @@ static void spudec_event_listener(void *this_gen, xine_event_t *event_gen) {
overlay->clip_bottom = but->bottom;
overlay->clip_left = but->left;
overlay->clip_right = but->right;
- overlay->color[0] = this->state.clut[but->color[0]];
- overlay->color[1] = this->state.clut[but->color[1]];
- overlay->color[2] = this->state.clut[but->color[2]];
- overlay->color[3] = this->state.clut[but->color[3]];
- overlay->trans[0] = but->trans[0];
- overlay->trans[1] = but->trans[1];
- overlay->trans[2] = but->trans[2];
- overlay->trans[3] = but->trans[3];
+ overlay->clip_color[0] = this->state.clut[but->color[0]];
+ overlay->clip_color[1] = this->state.clut[but->color[1]];
+ overlay->clip_color[2] = this->state.clut[but->color[2]];
+ overlay->clip_color[3] = this->state.clut[but->color[3]];
+ overlay->clip_trans[0] = but->trans[0];
+ overlay->clip_trans[1] = but->trans[1];
+ overlay->clip_trans[2] = but->trans[2];
+ overlay->clip_trans[3] = but->trans[3];
+ overlay->clip_rgb_clut = 0;
} else {
overlay_event->object.handle = this->menu_handle;
overlay_event->event_type = EVENT_HIDE_MENU;
diff --git a/src/video_out/alphablend.c b/src/video_out/alphablend.c
index c9d74ade6..17859a022 100644
--- a/src/video_out/alphablend.c
+++ b/src/video_out/alphablend.c
@@ -126,7 +126,7 @@ void blend_rgb16 (uint8_t * img, vo_overlay_t * img_overl,
int dst_width, int dst_height)
{
uint8_t *trans;
- clut_t* clut = (clut_t*) img_overl->color;
+ clut_t* clut = (clut_t*) img_overl->clip_color;
int src_width = img_overl->width;
int src_height = img_overl->height;
@@ -143,7 +143,7 @@ void blend_rgb16 (uint8_t * img, vo_overlay_t * img_overl,
+ (img_overl->y * img_height / dst_height) * img_width
+ (img_overl->x * img_width / dst_width);
- trans = img_overl->trans;
+ trans = img_overl->clip_trans;
for (y = dy = 0; y < src_height && rle < rle_limit;) {
int mask = !(img_overl->clip_top > y || img_overl->clip_bottom < y);
@@ -211,7 +211,7 @@ void blend_rgb24 (uint8_t * img, vo_overlay_t * img_overl,
int img_width, int img_height,
int dst_width, int dst_height)
{
- clut_t* clut = (clut_t*) img_overl->color;
+ clut_t* clut = (clut_t*) img_overl->clip_color;
uint8_t *trans;
int src_width = img_overl->width;
int src_height = img_overl->height;
@@ -227,7 +227,7 @@ void blend_rgb24 (uint8_t * img, vo_overlay_t * img_overl,
img_pix = img + 3 * ( (img_overl->y * img_height / dst_height) * img_width
+ (img_overl->x * img_width / dst_width));
- trans = img_overl->trans;
+ trans = img_overl->clip_trans;
for (dy = y = 0; y < src_height && rle < rle_limit; ) {
int mask = !(img_overl->clip_top > y || img_overl->clip_bottom < y);
@@ -298,7 +298,7 @@ void blend_rgb32 (uint8_t * img, vo_overlay_t * img_overl,
int img_width, int img_height,
int dst_width, int dst_height)
{
- clut_t* clut = (clut_t*) img_overl->color;
+ clut_t* clut = (clut_t*) img_overl->clip_color;
uint8_t *trans;
int src_width = img_overl->width;
int src_height = img_overl->height;
@@ -314,7 +314,7 @@ void blend_rgb32 (uint8_t * img, vo_overlay_t * img_overl,
img_pix = img + 4 * ( (img_overl->y * img_height / dst_height) * img_width
+ (img_overl->x * img_width / dst_width));
- trans = img_overl->trans;
+ trans = img_overl->clip_trans;
for (y = dy = 0; y < src_height && rle < rle_limit; ) {
int mask = !(img_overl->clip_top > y || img_overl->clip_bottom < y);
@@ -395,6 +395,7 @@ void blend_yuv (uint8_t * dst_img, vo_overlay_t * img_overl,
{
clut_t *my_clut;
uint8_t *my_trans;
+ int i;
int src_width = img_overl->width;
int src_height = img_overl->height;
@@ -410,9 +411,12 @@ void blend_yuv (uint8_t * dst_img, vo_overlay_t * img_overl,
(y_off / 2) * (dst_width / 2) + (x_off / 2) + 1;
uint8_t *dst_cb = dst_cr + (dst_width * dst_height) / 4;
- my_clut = (clut_t*) img_overl->color;
- my_trans = img_overl->trans;
+ my_clut = (clut_t*) img_overl->clip_color;
+ my_trans = img_overl->clip_trans;
+ for(i=0;i<4;i++) {
+// printf("video_out:[%d] clut=0x%04x trans=0x%02x\n",i, img_overl->clip_color[i],my_trans[i]);
+ }
for (y = 0; y < src_height; y++) {
mask = !(img_overl->clip_top > y || img_overl->clip_bottom < y);
@@ -439,9 +443,9 @@ void blend_yuv (uint8_t * dst_img, vo_overlay_t * img_overl,
mem_blend8(dst_y + x, my_clut[clr].y, o, (img_overl->clip_right-x) );
if (y & 1) {
mem_blend8(dst_cr + (x >> 1), my_clut[clr].cr, o,
- (img_overl->clip_right-x) >> 1);
+ (img_overl->clip_right-x+1) >> 1);
mem_blend8(dst_cb + (x >> 1), my_clut[clr].cb, o,
- (img_overl->clip_right-x) >> 1);
+ (img_overl->clip_right-x+1) >> 1);
}
o = 0;
} else {
@@ -454,14 +458,14 @@ void blend_yuv (uint8_t * dst_img, vo_overlay_t * img_overl,
if (o >= 15) {
memset(dst_y + x, my_clut[clr].y, rlelen);
if (y & 1) {
- memset(dst_cr + (x >> 1), my_clut[clr].cr, rlelen >> 1);
- memset(dst_cb + (x >> 1), my_clut[clr].cb, rlelen >> 1);
+ memset(dst_cr + (x >> 1), my_clut[clr].cr, (rlelen+1) >> 1);
+ memset(dst_cb + (x >> 1), my_clut[clr].cb, (rlelen+1) >> 1);
}
} else {
mem_blend8(dst_y + x, my_clut[clr].y, o, rlelen);
if (y & 1) {
- mem_blend8(dst_cr + (x >> 1), my_clut[clr].cr, o, rlelen >> 1);
- mem_blend8(dst_cb + (x >> 1), my_clut[clr].cb, o, rlelen >> 1);
+ mem_blend8(dst_cr + (x >> 1), my_clut[clr].cr, o, (rlelen+1) >> 1);
+ mem_blend8(dst_cb + (x >> 1), my_clut[clr].cb, o, (rlelen+1) >> 1);
}
}
}
@@ -501,8 +505,8 @@ void blend_yuy2 (uint8_t * dst_img, vo_overlay_t * img_overl,
uint8_t *dst_y = dst_img + 2 * (dst_width * y_off + x_off);
uint8_t *dst;
- my_clut = (clut_t*) img_overl->color;
- my_trans = img_overl->trans;
+ my_clut = (clut_t*) img_overl->clip_color;
+ my_trans = img_overl->clip_trans;
for (y = 0; y < src_height; y++) {
mask = !(img_overl->clip_top > y || img_overl->clip_bottom < y);
diff --git a/src/xine-engine/osd.c b/src/xine-engine/osd.c
index c9d3f0458..53411639a 100644
--- a/src/xine-engine/osd.c
+++ b/src/xine-engine/osd.c
@@ -240,8 +240,8 @@ static int osd_show (osd_object_t *osd, uint32_t vpts ) {
printf("osd_show num_rle = %d\n", this->event.object.overlay->num_rle);
#endif
- memcpy(this->event.object.overlay->color, osd->color, sizeof(osd->color));
- memcpy(this->event.object.overlay->trans, osd->trans, sizeof(osd->trans));
+ memcpy(this->event.object.overlay->clip_color, osd->color, sizeof(osd->color));
+ memcpy(this->event.object.overlay->clip_trans, osd->trans, sizeof(osd->trans));
this->event.event_type = EVENT_SHOW_SPU;
this->event.vpts = vpts;
diff --git a/src/xine-engine/video_out.h b/src/xine-engine/video_out.h
index 1dfbf70da..c591b25b5 100644
--- a/src/xine-engine/video_out.h
+++ b/src/xine-engine/video_out.h
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: video_out.h,v 1.37 2002/01/14 00:34:22 guenter Exp $
+ * $Id: video_out.h,v 1.38 2002/01/15 20:22:44 jcdutton Exp $
*
*
* xine version of video_out.h
@@ -340,6 +340,9 @@ struct vo_overlay_s {
int clip_bottom;
int clip_left;
int clip_right;
+ uint32_t clip_color[OVL_PALETTE_SIZE];
+ uint8_t clip_trans[OVL_PALETTE_SIZE];
+ int clip_rgb_clut; /* true if clut was converted to rgb*/
};
diff --git a/src/xine-engine/video_overlay.c b/src/xine-engine/video_overlay.c
index c010940bc..783c73d26 100644
--- a/src/xine-engine/video_overlay.c
+++ b/src/xine-engine/video_overlay.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: video_overlay.c,v 1.13 2002/01/07 16:57:48 jcdutton Exp $
+ * $Id: video_overlay.c,v 1.14 2002/01/15 20:22:44 jcdutton Exp $
*
*/
@@ -37,7 +37,7 @@
#include "video_overlay.h"
/*
-#define LOG_DEBUG 1
+#define LOG_DEBUG
*/
typedef struct video_overlay_events_s {
@@ -278,7 +278,7 @@ static int32_t video_overlay_add_event(video_overlay_instance_t *this_gen, void
this->video_overlay_events[new_event].event->object.pts=event->object.pts;
if ( this->video_overlay_events[new_event].event->object.overlay ) {
- fprintf(stderr,"video_overlay: error: event->object.overlay was not freed!\n");
+ fprintf(stderr,"video_overlay: add_event: event->object.overlay was not freed!\n");
}
if( event->object.overlay ) {
@@ -315,6 +315,10 @@ static void video_overlay_print_overlay( vo_overlay_t *ovl ) {
ovl->trans[0], ovl->trans[1], ovl->trans[2], ovl->trans[3]);
printf ("video_overlay: \tclip top=%d bottom=%d left=%d right=%d\n",
ovl->clip_top, ovl->clip_bottom, ovl->clip_left, ovl->clip_right);
+ printf ("video_overlay: \tclip_clut [%x %x %x %x]\n",
+ ovl->clip_color[0], ovl->clip_color[1], ovl->clip_color[2], ovl->clip_color[3]);
+ printf ("video_overlay: \tclip_trans [%d %d %d %d]\n",
+ ovl->clip_trans[0], ovl->clip_trans[1], ovl->clip_trans[2], ovl->clip_trans[3]);
#endif
return;
}
@@ -401,12 +405,13 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
case EVENT_MENU_SPU:
/* mixes palette and copy rle */
#ifdef LOG_DEBUG
- printf ("video_overlay.c:MENU SPU NOW\n");
+ printf ("video_overlay:MENU SPU NOW\n");
#endif
if (this->video_overlay_events[this_event].event->object.overlay != NULL) {
vo_overlay_t *event_overlay = this->video_overlay_events[this_event].event->object.overlay;
vo_overlay_t *overlay;
int menu_changed = 0;
+ printf ("video_overlay:overlay present\n");
#ifdef LOG_DEBUG
video_overlay_print_overlay( this->video_overlay_events[this_event].event->object.overlay ) ;
#endif
@@ -435,8 +440,9 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
overlay->width != event_overlay->width ||
overlay->height != event_overlay->height ||
overlay->x != event_overlay->x ||
- overlay->y != event_overlay->y )
+ overlay->y != event_overlay->y ) {
menu_changed = 1;
+ }
overlay->rle = event_overlay->rle;
@@ -469,6 +475,9 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
overlay->trans[3] = event_overlay->trans[3];
}
}
+#ifdef LOG_DEBUG
+ video_overlay_print_overlay( this->video_overlay_events[this_event].event->object.overlay ) ;
+#endif
/* let EVENT_MENU_BUTTON set the correct clipping box */
if( menu_changed ) {
@@ -483,13 +492,15 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
/* The null test was done at the start of this case statement */
free (this->video_overlay_events[this_event].event->object.overlay);
this->video_overlay_events[this_event].event->object.overlay = NULL;
+ } else {
+ printf ("video_overlay:overlay present\n");
}
break;
case EVENT_MENU_BUTTON:
/* mixes palette and copy clip coords */
#ifdef LOG_DEBUG
- printf ("MENU BUTTON NOW\n");
+ printf ("video_overlay:MENU BUTTON NOW\n");
#endif
if ( (this->video_overlay_events[this_event].event->object.overlay != NULL) &&
(this->video_overlay_objects[handle].overlay) &&
@@ -497,12 +508,22 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
this->video_overlay_objects[handle].pts) ) {
vo_overlay_t *overlay = this->video_overlay_objects[handle].overlay;
vo_overlay_t *event_overlay = this->video_overlay_events[this_event].event->object.overlay;
+ printf ("video_overlay:overlay present\n");
this->video_overlay_objects[handle].handle = handle;
overlay->clip_top = event_overlay->clip_top;
overlay->clip_bottom = event_overlay->clip_bottom;
overlay->clip_left = event_overlay->clip_left;
overlay->clip_right = event_overlay->clip_right;
-
+ overlay->clip_color[0] = event_overlay->clip_color[0];
+ overlay->clip_color[1] = event_overlay->clip_color[1];
+ overlay->clip_color[2] = event_overlay->clip_color[2];
+ overlay->clip_color[3] = event_overlay->clip_color[3];
+ overlay->clip_trans[0] = event_overlay->clip_trans[0];
+ overlay->clip_trans[1] = event_overlay->clip_trans[1];
+ overlay->clip_trans[2] = event_overlay->clip_trans[2];
+ overlay->clip_trans[3] = event_overlay->clip_trans[3];
+ overlay->clip_rgb_clut = event_overlay->clip_rgb_clut;
+/***********************************
if((event_overlay->color[0] +
event_overlay->color[1] +
event_overlay->color[2] +
@@ -523,7 +544,13 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
overlay->trans[2] = event_overlay->trans[2];
overlay->trans[3] = event_overlay->trans[3];
}
+***********************************/
+#ifdef LOG_DEBUG
+ video_overlay_print_overlay( this->video_overlay_events[this_event].event->object.overlay ) ;
+#endif
add_showing_handle( this, handle );
+ } else {
+ printf ("video_overlay:overlay not present\n");
}
if ( (this->video_overlay_events[this_event].event->object.pts !=
this->video_overlay_objects[handle].pts) ) {