Commit c8555cc6 authored by Jean-Paul Saman's avatar Jean-Paul Saman

Added transparency to vbi pages and added a callback to vbi-opaque setting to...

Added transparency to vbi pages and added a callback to vbi-opaque setting to change it at runtime from the gui. Threw some compiler fixes and cleanup in the mix.
parent 0d22111b
...@@ -73,6 +73,10 @@ static subpicture_t *Decode( decoder_t *, block_t ** ); ...@@ -73,6 +73,10 @@ static subpicture_t *Decode( decoder_t *, block_t ** );
#define PAGE_LONGTEXT N_("Open the indicated Teletext page." \ #define PAGE_LONGTEXT N_("Open the indicated Teletext page." \
"Default page is index 100") "Default page is index 100")
#define OPAQUE_TEXT N_("Text is always opaque")
#define OPAQUE_LONGTEXT N_("Setting vbi-opaque to false " \
"makes the boxed text transparent." )
vlc_module_begin(); vlc_module_begin();
set_description( _("VBI and Teletext decoder") ); set_description( _("VBI and Teletext decoder") );
set_shortname( "VBI & Teletext" ); set_shortname( "VBI & Teletext" );
...@@ -83,6 +87,8 @@ vlc_module_begin(); ...@@ -83,6 +87,8 @@ vlc_module_begin();
add_integer( "vbi-page", 100, NULL, add_integer( "vbi-page", 100, NULL,
PAGE_TEXT, PAGE_LONGTEXT, VLC_FALSE ); PAGE_TEXT, PAGE_LONGTEXT, VLC_FALSE );
add_bool( "vbi-opaque", VLC_TRUE, NULL,
OPAQUE_TEXT, OPAQUE_LONGTEXT, VLC_FALSE );
vlc_module_end(); vlc_module_end();
/**************************************************************************** /****************************************************************************
...@@ -96,11 +102,14 @@ struct decoder_sys_t ...@@ -96,11 +102,14 @@ struct decoder_sys_t
unsigned int i_wanted_page; unsigned int i_wanted_page;
unsigned int i_last_page; unsigned int i_last_page;
vlc_bool_t b_update; vlc_bool_t b_update;
vlc_bool_t b_opaque;
} }
static void event_handler( vbi_event *ev, void *user_data ); static void event_handler( vbi_event *ev, void *user_data );
static int RequestPage( vlc_object_t *p_this, char const *psz_cmd, static int RequestPage( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data ); vlc_value_t oldval, vlc_value_t newval, void *p_data );
static int Opaque( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
/***************************************************************************** /*****************************************************************************
* Open: probe the decoder and return score * Open: probe the decoder and return score
...@@ -112,8 +121,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -112,8 +121,6 @@ static int Open( vlc_object_t *p_this )
{ {
decoder_t *p_dec = (decoder_t *) p_this; decoder_t *p_dec = (decoder_t *) p_this;
decoder_sys_t *p_sys = NULL; decoder_sys_t *p_sys = NULL;
vlc_value_t val;
int i;
if( p_dec->fmt_in.i_codec != VLC_FOURCC('t','e','l','x') ) if( p_dec->fmt_in.i_codec != VLC_FOURCC('t','e','l','x') )
{ {
...@@ -150,6 +157,9 @@ static int Open( vlc_object_t *p_this ) ...@@ -150,6 +157,9 @@ static int Open( vlc_object_t *p_this )
"vbi-page" ); "vbi-page" );
var_AddCallback( p_dec->p_libvlc_global, "vbi-page", var_AddCallback( p_dec->p_libvlc_global, "vbi-page",
RequestPage, p_sys ); RequestPage, p_sys );
p_sys->b_opaque = var_CreateGetBool( p_dec, "vbi-opaque" );
var_AddCallback( p_dec, "vbi-opaque", Opaque, p_sys );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -184,6 +194,12 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -184,6 +194,12 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
uint8_t *p_pos; uint8_t *p_pos;
unsigned int i_left; unsigned int i_left;
/* part of kludge */
uint32_t *p_begin, *p_end;
unsigned int x = 0, y = 0;
vbi_opacity opacity;
/* end part of kludge */
if( (pp_block == NULL) || (*pp_block == NULL) ) if( (pp_block == NULL) || (*pp_block == NULL) )
return NULL; return NULL;
p_block = *pp_block; p_block = *pp_block;
...@@ -268,6 +284,44 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -268,6 +284,44 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
p_spu->p_region->picture.p->i_lines = p_page.rows * 10; p_spu->p_region->picture.p->i_lines = p_page.rows * 10;
p_spu->p_region->picture.p->i_pitch = p_page.columns * 12 * 4; p_spu->p_region->picture.p->i_pitch = p_page.columns * 12 * 4;
/* Kludge since zvbi doesn't provide an option to specify opacity. */
p_begin = (uint32_t *)p_spu->p_region->picture.p->p_pixels;
p_end = (uint32_t *)p_spu->p_region->picture.p->p_pixels+(fmt.i_width * fmt.i_height);
for( ; p_begin < p_end; p_begin++ )
{
opacity = p_page.text[ y / 10 * p_page.columns + x / 12 ].opacity;
switch( opacity )
{
/* Show video instead of this character */
case VBI_TRANSPARENT_SPACE:
*p_begin = 0;
break;
/* To make the boxed text "closed captioning" transparent
* change VLC_TRUE to VLC_FALSE.
*/
case VBI_OPAQUE:
if( p_sys->b_opaque )
break;
/* Full text transparency. only foreground color is show */
case VBI_TRANSPARENT_FULL:
/* Transparency for boxed text */
case VBI_SEMI_TRANSPARENT:
if( (*p_begin & 0xffffff00) == 0xff )
*p_begin = 0;
break;
default:
break;
}
x++;
if( x >= fmt.i_width )
{
x = 0;
y++;
}
}
/* end of kludge */
#if 0 #if 0
unsigned int i_total, i_textsize = 7000; unsigned int i_total, i_textsize = 7000;
char p_text[7000]; char p_text[7000];
...@@ -335,3 +389,13 @@ static int RequestPage( vlc_object_t *p_this, char const *psz_cmd, ...@@ -335,3 +389,13 @@ static int RequestPage( vlc_object_t *p_this, char const *psz_cmd,
return VLC_SUCCESS; return VLC_SUCCESS;
} }
static int Opaque( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data )
{
decoder_sys_t *p_sys = p_data;
if( p_sys )
p_sys->b_opaque = newval.b_bool;
return VLC_SUCCESS;
}
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