Commit db7c8885 authored by Christophe Massiot's avatar Christophe Massiot

* modules/demux/ts.c: Parse the telx descriptor and create pseudo ES

   for different languages. Slightly changed the way the dvbsub parser
   works to allow correct streaming with --sout-all or --programs.
 * modules/mux/mpeg/ts.c: Changes to allow descriptor pass-through with
   telx and dvbsub. This is kind of kludgy.
 * module/codec/telx.c: Got rid of the ugly static variables and use 
   info from the TS demux.
parent e9254221
...@@ -40,15 +40,6 @@ ...@@ -40,15 +40,6 @@
# define dbg( a ) # define dbg( a )
#endif #endif
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static int telx_conf_cb ( vlc_object_t *, /* variable's object */
char const *, /* variable name */
vlc_value_t, /* old value */
vlc_value_t, /* new value */
void * ); /* callback data */
/***************************************************************************** /*****************************************************************************
* Module descriptor. * Module descriptor.
*****************************************************************************/ *****************************************************************************/
...@@ -56,12 +47,13 @@ static int Open ( vlc_object_t * ); ...@@ -56,12 +47,13 @@ static int Open ( vlc_object_t * );
static void Close( vlc_object_t * ); static void Close( vlc_object_t * );
static subpicture_t *Decode( decoder_t *, block_t ** ); static subpicture_t *Decode( decoder_t *, block_t ** );
#define OVERRIDE_PAGE_TEXT N_("Override page")
#define PAGE_TEXT N_("Teletext page") #define OVERRIDE_PAGE_LONGTEXT N_("Override the indicated page, try this if " \
#define PAGE_LONGTEXT N_("Set displayed teletext page for subtitles, 0 for all pages, 888 should be a standard value. Just leave it to zero if your stream has only one language for subtitles.") "your subtitles don't appear (0 = autodetect, usually 888 or 889).")
#define IGNORE_SUB_FLAG_TEXT N_("Ignore subtitle flag") #define IGNORE_SUB_FLAG_TEXT N_("Ignore subtitle flag")
#define IGNORE_SUB_FLAG_LONGTEXT N_("Ignore the subtitle flag, try this if your subtitles don't appear.") #define IGNORE_SUB_FLAG_LONGTEXT N_("Ignore the subtitle flag, try this if " \
"your subtitles don't appear.")
vlc_module_begin(); vlc_module_begin();
set_description( _("Teletext subtitles decoder") ); set_description( _("Teletext subtitles decoder") );
...@@ -71,9 +63,9 @@ vlc_module_begin(); ...@@ -71,9 +63,9 @@ vlc_module_begin();
set_subcategory( SUBCAT_INPUT_SCODEC ); set_subcategory( SUBCAT_INPUT_SCODEC );
set_callbacks( Open, Close ); set_callbacks( Open, Close );
add_integer( "telx-page", 0, telx_conf_cb, PAGE_TEXT, PAGE_LONGTEXT, add_integer( "telx-override-page", -1, NULL,
VLC_FALSE ); OVERRIDE_PAGE_TEXT, OVERRIDE_PAGE_LONGTEXT, VLC_TRUE );
add_bool( "telx-ignore-subtitle-flag", 0, telx_conf_cb, add_bool( "telx-ignore-subtitle-flag", 0, NULL,
IGNORE_SUB_FLAG_TEXT, IGNORE_SUB_FLAG_LONGTEXT, VLC_TRUE ); IGNORE_SUB_FLAG_TEXT, IGNORE_SUB_FLAG_LONGTEXT, VLC_TRUE );
vlc_module_end(); vlc_module_end();
...@@ -92,15 +84,14 @@ struct decoder_sys_t ...@@ -92,15 +84,14 @@ struct decoder_sys_t
int i_page[9]; int i_page[9];
vlc_bool_t b_erase[9]; vlc_bool_t b_erase[9];
uint16_t * pi_active_national_set[9]; uint16_t * pi_active_national_set[9];
int i_wanted_page, i_wanted_magazine;
vlc_bool_t b_ignore_sub_flag;
}; };
/**************************************************************************** /****************************************************************************
* Local data * Local data
****************************************************************************/ ****************************************************************************/
static int i_conf_wanted_page = 0; /* default 0 = all pages */
static vlc_bool_t b_ignore_sub_flag = 0;
/* /*
* My doc only mentions 13 national characters, but experiments show there * My doc only mentions 13 national characters, but experiments show there
* are more, in france for example I already found two more (0x9 and 0xb). * are more, in france for example I already found two more (0x9 and 0xb).
...@@ -188,14 +179,36 @@ static int Open( vlc_object_t *p_this ) ...@@ -188,14 +179,36 @@ static int Open( vlc_object_t *p_this )
for ( i = 0; i < 9; i++ ) for ( i = 0; i < 9; i++ )
p_sys->pi_active_national_set[i] = ppi_national_subsets[1]; p_sys->pi_active_national_set[i] = ppi_national_subsets[1];
var_Create( p_dec, "telx-page", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Create( p_dec, "telx-override-page",
var_Get( p_dec, "telx-page", &val ); VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
i_conf_wanted_page = val.i_int; var_Get( p_dec, "telx-override-page", &val );
if( val.i_int == -1 )
{
p_sys->i_wanted_magazine = p_dec->fmt_in.subs.dvb.i_id >> 16;
if( p_sys->i_wanted_magazine == 0 )
p_sys->i_wanted_magazine = 8;
p_sys->i_wanted_page = p_dec->fmt_in.subs.dvb.i_id & 0xff;
}
else if( val.i_int == 0 )
{
p_sys->i_wanted_magazine = -1;
p_sys->i_wanted_page = -1;
}
else
{
p_sys->i_wanted_magazine = val.i_int / 100;
p_sys->i_wanted_page = (((val.i_int % 100) / 10) << 4)
| ((val.i_int % 100) % 10);
}
var_Create( p_dec, "telx-ignore-subtitle-flag", var_Create( p_dec, "telx-ignore-subtitle-flag",
VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
var_Get( p_dec, "telx-ignore-subtitle-flag", &val ); var_Get( p_dec, "telx-ignore-subtitle-flag", &val );
b_ignore_sub_flag = val.b_bool; p_sys->b_ignore_sub_flag = val.b_bool;
msg_Dbg( p_dec, "starting telx on magazine %d page %x flag %d",
p_sys->i_wanted_magazine, p_sys->i_wanted_page,
p_sys->b_ignore_sub_flag );
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -207,30 +220,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -207,30 +220,6 @@ static int Open( vlc_object_t *p_this )
/* return VLC_EGENERIC; */ /* return VLC_EGENERIC; */
} }
/*****************************************************************************
* Config callback
*****************************************************************************/
static int telx_conf_cb ( vlc_object_t * obj, /* variable's object */
char const * name, /* variable name */
vlc_value_t oldv, /* old value */
vlc_value_t newv, /* new value */
void * data) /* callback data */
{
if ( !strcmp(name, "telx-page") )
{
i_conf_wanted_page = newv.i_int;
dbg((obj, "display teletext page changed to %d\n", i_conf_wanted_page));
}
else if ( !strcmp(name, "telx-ignore-subtitle-flag") )
{
b_ignore_sub_flag = newv.b_bool;
dbg((obj, "ignore sub flag changed to %d\n", (int) b_ignore_sub_flag));
}
return 0;
}
/***************************************************************************** /*****************************************************************************
* Close: * Close:
*****************************************************************************/ *****************************************************************************/
...@@ -430,9 +419,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -430,9 +419,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
video_format_t fmt; video_format_t fmt;
/* int erase = 0; */ /* int erase = 0; */
int len, offset; int len, offset;
#if 0
int i_wanted_magazine = i_conf_wanted_page / 100; int i_wanted_magazine = i_conf_wanted_page / 100;
int i_wanted_page = 0x10 * ((i_conf_wanted_page % 100) / 10) int i_wanted_page = 0x10 * ((i_conf_wanted_page % 100) / 10)
| (i_conf_wanted_page % 10); | (i_conf_wanted_page % 10);
#endif
vlc_bool_t b_update = VLC_FALSE; vlc_bool_t b_update = VLC_FALSE;
char psz_text[512], *pt = psz_text; char psz_text[512], *pt = psz_text;
char psz_line[256]; char psz_line[256];
...@@ -472,7 +463,9 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -472,7 +463,9 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
magazine = (7 & row) == 0 ? 8 : (7 & row); magazine = (7 & row) == 0 ? 8 : (7 & row);
row >>= 3; row >>= 3;
if ( i_conf_wanted_page && magazine != i_wanted_magazine ) continue; if ( p_sys->i_wanted_page != -1
&& magazine != p_sys->i_wanted_magazine )
continue;
if ( row == 0 ) if ( row == 0 )
{ {
...@@ -486,7 +479,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -486,7 +479,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
<< (a * 4); << (a * 4);
} }
/* if (!b_ignore_sub_flag && !(1 & flag>>15)) */ /* if (!p_sys->b_ignore_sub_flag && !(1 & flag>>15)) */
/* continue; */ /* continue; */
p_sys->i_page[magazine] = (0xF0 & bytereverse( hamming_8_4(packet[7]) )) | p_sys->i_page[magazine] = (0xF0 & bytereverse( hamming_8_4(packet[7]) )) |
...@@ -502,7 +495,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -502,7 +495,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
p_sys->pi_active_national_set[magazine] = p_sys->pi_active_national_set[magazine] =
ppi_national_subsets[7 & (flag >> 21)]; ppi_national_subsets[7 & (flag >> 21)];
p_sys->b_is_subtitle[magazine] = b_ignore_sub_flag p_sys->b_is_subtitle[magazine] = p_sys->b_ignore_sub_flag
|| ( (1 & (flag >> 15)) || ( (1 & (flag >> 15))
&& (1 & (flag>>16)) ); && (1 & (flag>>16)) );
...@@ -516,7 +509,8 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -516,7 +509,8 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
(1 & (flag>>19))? " inhibit" : "", (1 & (flag>>19))? " inhibit" : "",
(1 & (flag>>20)) )); (1 & (flag>>20)) ));
if ( (i_conf_wanted_page && p_sys->i_page[magazine] != i_wanted_page) if ( (p_sys->i_wanted_page != -1
&& p_sys->i_page[magazine] != p_sys->i_wanted_page)
|| !p_sys->b_is_subtitle[magazine] ) || !p_sys->b_is_subtitle[magazine] )
continue; continue;
...@@ -560,9 +554,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -560,9 +554,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
int i; int i;
/* row 1-23 : normal lines */ /* row 1-23 : normal lines */
if ( (i_conf_wanted_page && p_sys->i_page[magazine] != i_wanted_page) if ( (p_sys->i_wanted_page != -1
&& p_sys->i_page[magazine] != p_sys->i_wanted_page)
|| !p_sys->b_is_subtitle[magazine] || !p_sys->b_is_subtitle[magazine]
|| (!i_conf_wanted_page && p_sys->i_page[magazine] > 0x99) ) || (p_sys->i_wanted_page == -1
&& p_sys->i_page[magazine] > 0x99) )
continue; continue;
decode_string( psz_line, sizeof(psz_line), p_sys, magazine, decode_string( psz_line, sizeof(psz_line), p_sys, magazine,
...@@ -615,7 +611,8 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -615,7 +611,8 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
else if ( row == 25 ) else if ( row == 25 )
{ {
/* row 25 : alternate header line */ /* row 25 : alternate header line */
if ( (i_conf_wanted_page && p_sys->i_page[magazine] != i_wanted_page) if ( (p_sys->i_wanted_page != -1
&& p_sys->i_page[magazine] != p_sys->i_wanted_page)
|| !p_sys->b_is_subtitle[magazine] ) || !p_sys->b_is_subtitle[magazine] )
continue; continue;
......
This diff is collapsed.
...@@ -2496,15 +2496,29 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c ) ...@@ -2496,15 +2496,29 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c )
dvbpsi_PMTESAddDescriptor( p_es, 0x05, 4, data ); dvbpsi_PMTESAddDescriptor( p_es, 0x05, 4, data );
} }
else if( p_stream->i_codec == VLC_FOURCC('t','e','l','x') ) else if( p_stream->i_codec == VLC_FOURCC('t','e','l','x') )
{
if( p_stream->i_decoder_specific_info )
{ {
dvbpsi_PMTESAddDescriptor( p_es, 0x56, dvbpsi_PMTESAddDescriptor( p_es, 0x56,
p_stream->i_decoder_specific_info, p_stream->i_decoder_specific_info,
p_stream->p_decoder_specific_info ); p_stream->p_decoder_specific_info );
} }
#ifdef _DVBPSI_DR_59_H_ continue;
}
else if( p_stream->i_codec == VLC_FOURCC('d','v','b','s') ) else if( p_stream->i_codec == VLC_FOURCC('d','v','b','s') )
{ {
/* DVB subtitles */ /* DVB subtitles */
if( p_stream->i_decoder_specific_info )
{
/* pass-through from the TS demux */
dvbpsi_PMTESAddDescriptor( p_es, 0x59,
p_stream->i_decoder_specific_info,
p_stream->p_decoder_specific_info );
}
#ifdef _DVBPSI_DR_59_H_
else
{
/* from the dvbsub transcoder */
dvbpsi_subtitling_dr_t descr; dvbpsi_subtitling_dr_t descr;
dvbpsi_subtitle_t sub; dvbpsi_subtitle_t sub;
dvbpsi_descriptor_t *p_descr; dvbpsi_descriptor_t *p_descr;
...@@ -2521,9 +2535,10 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c ) ...@@ -2521,9 +2535,10 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c )
/* Work around bug in old libdvbpsi */ p_descr->i_length = 8; /* Work around bug in old libdvbpsi */ p_descr->i_length = 8;
dvbpsi_PMTESAddDescriptor( p_es, p_descr->i_tag, dvbpsi_PMTESAddDescriptor( p_es, p_descr->i_tag,
p_descr->i_length, p_descr->p_data ); p_descr->i_length, p_descr->p_data );
continue;
} }
#endif /* _DVBPSI_DR_59_H_ */ #endif /* _DVBPSI_DR_59_H_ */
continue;
}
if( p_stream->lang[0] != 0 ) if( p_stream->lang[0] != 0 )
{ {
......
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