Commit 15006f7b authored by Gildas Bazin's avatar Gildas Bazin

* modules/access/dvdnav.c, src/video_output/vout_subpictures.c: backport of #11304.

parent 55821eac
...@@ -48,8 +48,8 @@ struct spu_t ...@@ -48,8 +48,8 @@ struct spu_t
int i_crop_x, i_crop_y, i_crop_width, i_crop_height; /**< cropping */ int i_crop_x, i_crop_y, i_crop_width, i_crop_height; /**< cropping */
int i_margin; /**< force position of a subpicture */ int i_margin; /**< force position of a subpicture */
vlc_bool_t b_force_alpha; /**< force alpha palette of subpicture */ vlc_bool_t b_force_palette; /**< force palette of subpicture */
uint8_t pi_alpha[4]; /**< forced alpha palette */ uint8_t palette[4][4]; /**< forced palette */
int ( *pf_control ) ( spu_t *, int, va_list ); int ( *pf_control ) ( spu_t *, int, va_list );
......
...@@ -129,9 +129,9 @@ struct demux_sys_t ...@@ -129,9 +129,9 @@ struct demux_sys_t
/* event */ /* event */
event_thread_t *p_ev; event_thread_t *p_ev;
/* FIXME */ /* palette for menus */
uint8_t alpha[4];
uint32_t clut[16]; uint32_t clut[16];
uint8_t palette[4][4];
/* */ /* */
int i_aspect; int i_aspect;
...@@ -149,7 +149,7 @@ static int DemuxBlock( demux_t *, uint8_t *, int ); ...@@ -149,7 +149,7 @@ static int DemuxBlock( demux_t *, uint8_t *, int );
static void DemuxTitles( demux_t * ); static void DemuxTitles( demux_t * );
static void ESSubtitleUpdate( 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 void ESNew( demux_t *, int );
static int ProbeDVD( demux_t *, char * ); static int ProbeDVD( demux_t *, char * );
...@@ -320,7 +320,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -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, "x-end", VLC_VAR_INTEGER );
var_Create( p_sys->p_input, "y-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, "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", VLC_VAR_BOOL );
var_Create( p_sys->p_input, "highlight-mutex", VLC_VAR_MUTEX ); var_Create( p_sys->p_input, "highlight-mutex", VLC_VAR_MUTEX );
...@@ -354,7 +354,7 @@ static void Close( vlc_object_t *p_this ) ...@@ -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-start" );
var_Destroy( p_sys->p_input, "y-end" ); var_Destroy( p_sys->p_input, "y-end" );
var_Destroy( p_sys->p_input, "color" ); 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 ); vlc_object_release( p_sys->p_input );
...@@ -420,7 +420,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -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 * ); pi64 = (int64_t*)va_arg( args, int64_t * );
if( p_sys->i_pgc_length > 0 ) 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; return VLC_SUCCESS;
} }
} }
...@@ -754,7 +754,7 @@ static int Demux( demux_t *p_demux ) ...@@ -754,7 +754,7 @@ static int Demux( demux_t *p_demux )
msg_Dbg( p_demux, "DVDNAV_HIGHLIGHT" ); msg_Dbg( p_demux, "DVDNAV_HIGHLIGHT" );
msg_Dbg( p_demux, " - display=%d", event->display ); msg_Dbg( p_demux, " - display=%d", event->display );
msg_Dbg( p_demux, " - buttonN=%d", event->buttonN ); msg_Dbg( p_demux, " - buttonN=%d", event->buttonN );
ButtonUpdate( p_demux ); ButtonUpdate( p_demux, 0 );
break; break;
} }
...@@ -879,7 +879,7 @@ static void DemuxTitles( demux_t *p_demux ) ...@@ -879,7 +879,7 @@ static void DemuxTitles( demux_t *p_demux )
/***************************************************************************** /*****************************************************************************
* Update functions: * 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; demux_sys_t *p_sys = p_demux->p_sys;
vlc_value_t val; vlc_value_t val;
...@@ -902,15 +902,22 @@ static void ButtonUpdate( demux_t *p_demux ) ...@@ -902,15 +902,22 @@ static void ButtonUpdate( demux_t *p_demux )
if( i_button > 0 && i_title == 0 ) if( i_button > 0 && i_title == 0 )
{ {
int i;
pci_t *pci = dvdnav_get_current_nav_pci( p_sys->dvdnav ); 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 );
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;
/* I fear it is plain wrong */ p_sys->palette[i][0] = (i_yuv >> 16) & 0xff;
p_sys->alpha[0] = hl.palette&0x0f; p_sys->palette[i][1] = (i_yuv >> 0) & 0xff;
p_sys->alpha[1] = (hl.palette>>4)&0x0f; p_sys->palette[i][2] = (i_yuv >> 8) & 0xff;
p_sys->alpha[2] = (hl.palette>>8)&0x0f; p_sys->palette[i][3] = i_alpha;
p_sys->alpha[3] = (hl.palette>>12)&0x0f; }
vlc_mutex_lock( p_mutex ); vlc_mutex_lock( p_mutex );
val.i_int = hl.sx; var_Set( p_sys->p_input, "x-start", val ); 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 ) ...@@ -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.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.i_int = hl.ey; var_Set( p_sys->p_input, "y-end", val );
val.p_address = (void *)p_sys->alpha; val.p_address = (void *)p_sys->palette;
var_Set( p_sys->p_input, "menu-contrast", val ); var_Set( p_sys->p_input, "menu-palette", val );
val.b_bool = VLC_TRUE; var_Set( p_sys->p_input, "highlight", val ); val.b_bool = VLC_TRUE; var_Set( p_sys->p_input, "highlight", val );
vlc_mutex_unlock( p_mutex ); vlc_mutex_unlock( p_mutex );
...@@ -946,7 +953,7 @@ static void ESSubtitleUpdate( demux_t *p_demux ) ...@@ -946,7 +953,7 @@ static void ESSubtitleUpdate( demux_t *p_demux )
int i_spu = dvdnav_get_active_spu_stream( p_sys->dvdnav ); int i_spu = dvdnav_get_active_spu_stream( p_sys->dvdnav );
int32_t i_title, i_part; int32_t i_title, i_part;
ButtonUpdate( p_demux ); ButtonUpdate( p_demux, 0 );
dvdnav_current_title_info( p_sys->dvdnav, &i_title, &i_part ); dvdnav_current_title_info( p_sys->dvdnav, &i_title, &i_part );
if( i_title > 0 ) return; if( i_title > 0 ) return;
...@@ -1160,7 +1167,7 @@ static void ESNew( demux_t *p_demux, int i_id ) ...@@ -1160,7 +1167,7 @@ static void ESNew( demux_t *p_demux, int i_id )
} }
tk->b_seen = VLC_TRUE; 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 ) ...@@ -1227,6 +1234,7 @@ static int EventThread( vlc_object_t *p_this )
case ACTIONID_NAV_ACTIVATE: case ACTIONID_NAV_ACTIVATE:
b_activated = VLC_TRUE; b_activated = VLC_TRUE;
dvdnav_button_activate( p_sys->dvdnav, pci ); dvdnav_button_activate( p_sys->dvdnav, pci );
ButtonUpdate( p_ev->p_demux, VLC_TRUE );
break; break;
default: default:
break; break;
...@@ -1255,6 +1263,7 @@ static int EventThread( vlc_object_t *p_this ) ...@@ -1255,6 +1263,7 @@ static int EventThread( vlc_object_t *p_this )
b_activated = VLC_TRUE; b_activated = VLC_TRUE;
dvdnav_mouse_activate( p_sys->dvdnav, pci, valx.i_int, dvdnav_mouse_activate( p_sys->dvdnav, pci, valx.i_int,
valy.i_int ); valy.i_int );
ButtonUpdate( p_ev->p_demux, VLC_TRUE );
} }
p_ev->b_moved = VLC_FALSE; p_ev->b_moved = VLC_FALSE;
......
...@@ -599,13 +599,11 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, ...@@ -599,13 +599,11 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
} }
/* Force palette if requested */ /* 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.i_chroma )
{ {
p_region->fmt.p_palette->palette[0][3] = p_spu->pi_alpha[0]; memcpy( p_region->fmt.p_palette->palette,
p_region->fmt.p_palette->palette[1][3] = p_spu->pi_alpha[1]; p_spu->palette, 16 );
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];
} }
/* Scale SPU if necessary */ /* Scale SPU if necessary */
...@@ -964,7 +962,7 @@ static void UpdateSPU( spu_t *p_spu, vlc_object_t *p_object ) ...@@ -964,7 +962,7 @@ static void UpdateSPU( spu_t *p_spu, vlc_object_t *p_object )
{ {
vlc_value_t val; 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; p_spu->b_force_crop = VLC_FALSE;
if( var_Get( p_object, "highlight", &val ) || !val.b_bool ) return; 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 ) ...@@ -979,32 +977,16 @@ static void UpdateSPU( spu_t *p_spu, vlc_object_t *p_object )
var_Get( p_object, "y-end", &val ); var_Get( p_object, "y-end", &val );
p_spu->i_crop_height = val.i_int - p_spu->i_crop_y; p_spu->i_crop_height = val.i_int - p_spu->i_crop_y;
#if 0 if( var_Get( p_object, "menu-palette", &val ) == VLC_SUCCESS )
if( var_Get( p_object, "color", &val ) == VLC_SUCCESS )
{ {
int i; memcpy( p_spu->palette, val.p_address, 16 );
for( i = 0; i < 4; i++ ) p_spu->b_force_palette = VLC_TRUE;
{
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;
} }
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_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 );
} }
/***************************************************************************** /*****************************************************************************
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment