diff options
author | James Courtier-Dutton <jcdutton@users.sourceforge.net> | 2002-01-15 20:22:43 +0000 |
---|---|---|
committer | James Courtier-Dutton <jcdutton@users.sourceforge.net> | 2002-01-15 20:22:43 +0000 |
commit | 9d9e5affa515e4d4fe2fabb738fd0ae0b77967f4 (patch) | |
tree | 57eb9d77d2c9fabcb69ac42e8d9d04e7a01337e1 | |
parent | f22590515f098d54921a1a68af85fe1165b50571 (diff) | |
download | xine-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.c | 48 | ||||
-rw-r--r-- | src/video_out/alphablend.c | 36 | ||||
-rw-r--r-- | src/xine-engine/osd.c | 4 | ||||
-rw-r--r-- | src/xine-engine/video_out.h | 5 | ||||
-rw-r--r-- | src/xine-engine/video_overlay.c | 41 |
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) ) { |