From 15006f7ba1072567a7397717279f4902d7f8ceda Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Sun, 5 Jun 2005 17:05:20 +0000 Subject: [PATCH] * modules/access/dvdnav.c, src/video_output/vout_subpictures.c: backport of #11304. --- include/vlc_spu.h | 4 +-- modules/access/dvdnav.c | 47 +++++++++++++++++------------ src/video_output/vout_subpictures.c | 38 ++++++----------------- 3 files changed, 40 insertions(+), 49 deletions(-) diff --git a/include/vlc_spu.h b/include/vlc_spu.h index afa33e1bfe..64d1d26601 100644 --- a/include/vlc_spu.h +++ b/include/vlc_spu.h @@ -48,8 +48,8 @@ struct spu_t int i_crop_x, i_crop_y, i_crop_width, i_crop_height; /**< cropping */ int i_margin; /**< force position of a subpicture */ - vlc_bool_t b_force_alpha; /**< force alpha palette of subpicture */ - uint8_t pi_alpha[4]; /**< forced alpha palette */ + vlc_bool_t b_force_palette; /**< force palette of subpicture */ + uint8_t palette[4][4]; /**< forced palette */ int ( *pf_control ) ( spu_t *, int, va_list ); diff --git a/modules/access/dvdnav.c b/modules/access/dvdnav.c index 99f2e111fb..d5de790fa6 100644 --- a/modules/access/dvdnav.c +++ b/modules/access/dvdnav.c @@ -129,9 +129,9 @@ struct demux_sys_t /* event */ event_thread_t *p_ev; - /* FIXME */ - uint8_t alpha[4]; - uint32_t clut[16]; + /* palette for menus */ + uint32_t clut[16]; + uint8_t palette[4][4]; /* */ int i_aspect; @@ -149,7 +149,7 @@ static int DemuxBlock( demux_t *, uint8_t *, int ); static void DemuxTitles( demux_t * ); static void ESSubtitleUpdate( demux_t * ); -static void ButtonUpdate( demux_t * ); +static void ButtonUpdate( demux_t *, vlc_bool_t ); static void ESNew( demux_t *, int ); static int ProbeDVD( demux_t *, char * ); @@ -320,7 +320,7 @@ static int Open( vlc_object_t *p_this ) var_Create( p_sys->p_input, "x-end", VLC_VAR_INTEGER ); var_Create( p_sys->p_input, "y-end", VLC_VAR_INTEGER ); var_Create( p_sys->p_input, "color", VLC_VAR_ADDRESS ); - var_Create( p_sys->p_input, "menu-contrast", VLC_VAR_ADDRESS ); + var_Create( p_sys->p_input, "menu-palette", VLC_VAR_ADDRESS ); var_Create( p_sys->p_input, "highlight", VLC_VAR_BOOL ); var_Create( p_sys->p_input, "highlight-mutex", VLC_VAR_MUTEX ); @@ -354,7 +354,7 @@ static void Close( vlc_object_t *p_this ) var_Destroy( p_sys->p_input, "y-start" ); var_Destroy( p_sys->p_input, "y-end" ); var_Destroy( p_sys->p_input, "color" ); - var_Destroy( p_sys->p_input, "menu-contrast" ); + var_Destroy( p_sys->p_input, "menu-palette" ); vlc_object_release( p_sys->p_input ); @@ -420,7 +420,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) pi64 = (int64_t*)va_arg( args, int64_t * ); if( p_sys->i_pgc_length > 0 ) { - *pi64 = (int64_t) ( (double)p_sys->i_pgc_length / (double)len ) * (double) pos; + *pi64 = p_sys->i_pgc_length * pos / len; return VLC_SUCCESS; } } @@ -754,7 +754,7 @@ static int Demux( demux_t *p_demux ) msg_Dbg( p_demux, "DVDNAV_HIGHLIGHT" ); msg_Dbg( p_demux, " - display=%d", event->display ); msg_Dbg( p_demux, " - buttonN=%d", event->buttonN ); - ButtonUpdate( p_demux ); + ButtonUpdate( p_demux, 0 ); break; } @@ -879,7 +879,7 @@ static void DemuxTitles( demux_t *p_demux ) /***************************************************************************** * Update functions: *****************************************************************************/ -static void ButtonUpdate( demux_t *p_demux ) +static void ButtonUpdate( demux_t *p_demux, vlc_bool_t b_mode ) { demux_sys_t *p_sys = p_demux->p_sys; vlc_value_t val; @@ -902,15 +902,22 @@ static void ButtonUpdate( demux_t *p_demux ) if( i_button > 0 && i_title == 0 ) { + int i; pci_t *pci = dvdnav_get_current_nav_pci( p_sys->dvdnav ); - dvdnav_get_highlight_area( pci, i_button, 1, &hl ); + dvdnav_get_highlight_area( pci, i_button, b_mode, &hl ); - /* I fear it is plain wrong */ - p_sys->alpha[0] = hl.palette&0x0f; - p_sys->alpha[1] = (hl.palette>>4)&0x0f; - p_sys->alpha[2] = (hl.palette>>8)&0x0f; - p_sys->alpha[3] = (hl.palette>>12)&0x0f; + for( i = 0; i < 4; i++ ) + { + uint32_t i_yuv = p_sys->clut[(hl.palette>>(16+i*4))&0x0f]; + uint8_t i_alpha = (hl.palette>>(i*4))&0x0f; + i_alpha = i_alpha == 0xf ? 0xff : i_alpha << 4; + + p_sys->palette[i][0] = (i_yuv >> 16) & 0xff; + p_sys->palette[i][1] = (i_yuv >> 0) & 0xff; + p_sys->palette[i][2] = (i_yuv >> 8) & 0xff; + p_sys->palette[i][3] = i_alpha; + } vlc_mutex_lock( p_mutex ); val.i_int = hl.sx; var_Set( p_sys->p_input, "x-start", val ); @@ -918,8 +925,8 @@ static void ButtonUpdate( demux_t *p_demux ) val.i_int = hl.sy; var_Set( p_sys->p_input, "y-start", val ); val.i_int = hl.ey; var_Set( p_sys->p_input, "y-end", val ); - val.p_address = (void *)p_sys->alpha; - var_Set( p_sys->p_input, "menu-contrast", val ); + val.p_address = (void *)p_sys->palette; + var_Set( p_sys->p_input, "menu-palette", val ); val.b_bool = VLC_TRUE; var_Set( p_sys->p_input, "highlight", val ); vlc_mutex_unlock( p_mutex ); @@ -946,7 +953,7 @@ static void ESSubtitleUpdate( demux_t *p_demux ) int i_spu = dvdnav_get_active_spu_stream( p_sys->dvdnav ); int32_t i_title, i_part; - ButtonUpdate( p_demux ); + ButtonUpdate( p_demux, 0 ); dvdnav_current_title_info( p_sys->dvdnav, &i_title, &i_part ); if( i_title > 0 ) return; @@ -1160,7 +1167,7 @@ static void ESNew( demux_t *p_demux, int i_id ) } tk->b_seen = VLC_TRUE; - if( tk->fmt.i_cat == VIDEO_ES ) ButtonUpdate( p_demux ); + if( tk->fmt.i_cat == VIDEO_ES ) ButtonUpdate( p_demux, 0 ); } /***************************************************************************** @@ -1227,6 +1234,7 @@ static int EventThread( vlc_object_t *p_this ) case ACTIONID_NAV_ACTIVATE: b_activated = VLC_TRUE; dvdnav_button_activate( p_sys->dvdnav, pci ); + ButtonUpdate( p_ev->p_demux, VLC_TRUE ); break; default: break; @@ -1255,6 +1263,7 @@ static int EventThread( vlc_object_t *p_this ) b_activated = VLC_TRUE; dvdnav_mouse_activate( p_sys->dvdnav, pci, valx.i_int, valy.i_int ); + ButtonUpdate( p_ev->p_demux, VLC_TRUE ); } p_ev->b_moved = VLC_FALSE; diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index 762a0d3088..12ef0f0e9c 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -599,13 +599,11 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, } /* Force palette if requested */ - if( p_spu->b_force_alpha && VLC_FOURCC('Y','U','V','P') == + if( p_spu->b_force_palette && VLC_FOURCC('Y','U','V','P') == p_region->fmt.i_chroma ) { - p_region->fmt.p_palette->palette[0][3] = p_spu->pi_alpha[0]; - p_region->fmt.p_palette->palette[1][3] = p_spu->pi_alpha[1]; - p_region->fmt.p_palette->palette[2][3] = p_spu->pi_alpha[2]; - p_region->fmt.p_palette->palette[3][3] = p_spu->pi_alpha[3]; + memcpy( p_region->fmt.p_palette->palette, + p_spu->palette, 16 ); } /* Scale SPU if necessary */ @@ -964,7 +962,7 @@ static void UpdateSPU( spu_t *p_spu, vlc_object_t *p_object ) { vlc_value_t val; - p_spu->b_force_alpha = VLC_FALSE; + p_spu->b_force_palette = VLC_FALSE; p_spu->b_force_crop = VLC_FALSE; if( var_Get( p_object, "highlight", &val ) || !val.b_bool ) return; @@ -979,32 +977,16 @@ static void UpdateSPU( spu_t *p_spu, vlc_object_t *p_object ) var_Get( p_object, "y-end", &val ); p_spu->i_crop_height = val.i_int - p_spu->i_crop_y; -#if 0 - if( var_Get( p_object, "color", &val ) == VLC_SUCCESS ) + if( var_Get( p_object, "menu-palette", &val ) == VLC_SUCCESS ) { - int i; - for( i = 0; i < 4; i++ ) - { - p_spu->pi_color[i] = ((uint8_t *)val.p_address)[i]; - } - } -#endif - - if( var_Get( p_object, "menu-contrast", &val ) == VLC_SUCCESS ) - { - int i; - for( i = 0; i < 4; i++ ) - { - p_spu->pi_alpha[i] = ((uint8_t *)val.p_address)[i]; - p_spu->pi_alpha[i] = p_spu->pi_alpha[i] == 0xf ? - 0xff : p_spu->pi_alpha[i] << 4; - } - p_spu->b_force_alpha = VLC_TRUE; + memcpy( p_spu->palette, val.p_address, 16 ); + p_spu->b_force_palette = VLC_TRUE; } - msg_Dbg( p_object, "crop: %i,%i,%i,%i, alpha: %i", + msg_Dbg( p_object, "crop: %i,%i,%i,%i, palette forced: %i", p_spu->i_crop_x, p_spu->i_crop_y, - p_spu->i_crop_width, p_spu->i_crop_height, p_spu->b_force_alpha ); + p_spu->i_crop_width, p_spu->i_crop_height, + p_spu->b_force_palette ); } /***************************************************************************** -- 2.39.2