#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-
-#include <vlc/vlc.h>
#include <assert.h>
#include <stdint.h>
-#include "vlc_vout.h"
-#include "vlc_bits.h"
-#include "vlc_codec.h"
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+
+#include <vlc_bits.h>
+#include <vlc_codec.h>
/* #define TELX_DEBUG */
#ifdef TELX_DEBUG
"interpretation mistake. Try using this wrong interpretation if " \
"your subtitles don't appear.")
-vlc_module_begin();
- set_description( _("Teletext subtitles decoder") );
- set_shortname( "Teletext" );
- set_capability( "decoder", 50 );
- set_category( CAT_INPUT );
- set_subcategory( SUBCAT_INPUT_SCODEC );
- set_callbacks( Open, Close );
+vlc_module_begin ()
+ set_description( N_("Teletext subtitles decoder") )
+ set_shortname( "Teletext" )
+ set_capability( "decoder", 50 )
+ set_category( CAT_INPUT )
+ set_subcategory( SUBCAT_INPUT_SCODEC )
+ set_callbacks( Open, Close )
add_integer( "telx-override-page", -1, NULL,
- OVERRIDE_PAGE_TEXT, OVERRIDE_PAGE_LONGTEXT, VLC_TRUE );
- add_bool( "telx-ignore-subtitle-flag", 0, NULL,
- IGNORE_SUB_FLAG_TEXT, IGNORE_SUB_FLAG_LONGTEXT, VLC_TRUE );
- add_bool( "telx-french-workaround", 0, NULL,
- FRENCH_WORKAROUND_TEXT, FRENCH_WORKAROUND_LONGTEXT, VLC_TRUE );
+ OVERRIDE_PAGE_TEXT, OVERRIDE_PAGE_LONGTEXT, true )
+ add_bool( "telx-ignore-subtitle-flag", false, NULL,
+ IGNORE_SUB_FLAG_TEXT, IGNORE_SUB_FLAG_LONGTEXT, true )
+ add_bool( "telx-french-workaround", false, NULL,
+ FRENCH_WORKAROUND_TEXT, FRENCH_WORKAROUND_LONGTEXT, true )
-vlc_module_end();
+vlc_module_end ()
/****************************************************************************
* Local structures
struct decoder_sys_t
{
int i_align;
- vlc_bool_t b_is_subtitle[9];
+ bool b_is_subtitle[9];
char ppsz_lines[32][128];
char psz_prev_text[512];
mtime_t prev_pts;
int i_page[9];
- vlc_bool_t b_erase[9];
- uint16_t * pi_active_national_set[9];
+ bool b_erase[9];
+ const uint16_t * pi_active_national_set[9];
int i_wanted_page, i_wanted_magazine;
- vlc_bool_t b_ignore_sub_flag;
+ bool b_ignore_sub_flag;
};
/****************************************************************************
* 0x08 0x09 0x0a 0x0b 0x0c 0x0d (apparently a control character) 0x0e 0x0f
*/
-static uint16_t ppi_national_subsets[][20] =
+static const uint16_t ppi_national_subsets[][20] =
{
{ 0x00a3, 0x0024, 0x0040, 0x00ab, 0x00bd, 0x00bb, 0x005e, 0x0023,
0x002d, 0x00bc, 0x00a6, 0x00be, 0x00f7 }, /* english ,000 */
0x00e9, 0x00e4, 0x00f6, 0x00e5, 0x00fc }, /* swedish,finnish,hungarian ,010 */
{ 0x0023, 0x016f, 0x010d, 0x0165, 0x017e, 0x00fd, 0x00ed, 0x0159,
- 0x00e9, 0x00e1, 0x0115, 0x00fa, 0x0161 }, /* czech,slovak ,011 */
+ 0x00e9, 0x00e1, 0x011b, 0x00fa, 0x0161 }, /* czech,slovak ,011 */
{ 0x0023, 0x0024, 0x00a7, 0x00c4, 0x00d6, 0x00dc, 0x005e, 0x005f,
0x00b0, 0x00e4, 0x00f6, 0x00fc, 0x00df }, /* german ,100 */
{
decoder_t *p_dec = (decoder_t *) p_this;
decoder_sys_t *p_sys = NULL;
- vlc_value_t val;
- int i;
+ int i_val;
+
- if( p_dec->fmt_in.i_codec != VLC_FOURCC('t','e','l','x'))
+ if( p_dec->fmt_in.i_codec != VLC_CODEC_TELETEXT)
{
return VLC_EGENERIC;
}
p_dec->pf_decode_sub = Decode;
- p_sys = p_dec->p_sys = malloc( sizeof(decoder_sys_t) );
+ p_sys = p_dec->p_sys = calloc( 1, sizeof(*p_sys) );
if( p_sys == NULL )
- {
- msg_Err( p_dec, "out of memory" );
return VLC_ENOMEM;
- }
-
- memset( p_sys, 0, sizeof(decoder_sys_t) );
+ p_dec->fmt_out.i_cat = SPU_ES;
+ p_dec->fmt_out.i_codec = 0;
p_sys->i_align = 0;
- for ( i = 0; i < 9; i++ )
+ for ( int i = 0; i < 9; i++ )
p_sys->pi_active_national_set[i] = ppi_national_subsets[1];
- var_Create( p_dec, "telx-override-page",
- VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
- var_Get( p_dec, "telx-override-page", &val );
- if( val.i_int == -1 && p_dec->fmt_in.subs.dvb.i_id != -1 )
+ i_val = var_CreateGetInteger( p_dec, "telx-override-page" );
+ if( i_val == -1 && p_dec->fmt_in.subs.teletext.i_magazine != -1 &&
+ ( p_dec->fmt_in.subs.teletext.i_magazine != 1 ||
+ p_dec->fmt_in.subs.teletext.i_page != 0 ) ) /* ignore if TS demux wants page 100 (unlikely to be sub) */
{
- 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;
-
- var_Create( p_dec, "telx-french-workaround",
- VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
- var_Get( p_dec, "telx-french-workaround", &val );
+ bool b_val;
+ p_sys->i_wanted_magazine = p_dec->fmt_in.subs.teletext.i_magazine;
+ p_sys->i_wanted_page = p_dec->fmt_in.subs.teletext.i_page;
+
+ b_val = var_CreateGetBool( p_dec, "telx-french-workaround" );
if( p_sys->i_wanted_page < 100 &&
- (val.b_bool || (p_sys->i_wanted_page % 16) >= 10))
+ (b_val || (p_sys->i_wanted_page % 16) >= 10))
{
/* See http://www.nada.kth.se/~ragge/vdr/ttxtsubs/TROUBLESHOOTING.txt
* paragraph about French channels - they mix up decimal and
(p_sys->i_wanted_page % 10);
}
}
- else if( val.i_int <= 0 )
+ else if( i_val <= 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);
+ p_sys->i_wanted_magazine = i_val / 100;
+ p_sys->i_wanted_page = (((i_val % 100) / 10) << 4)
+ |((i_val % 100) % 10);
}
- var_Create( p_dec, "telx-ignore-subtitle-flag",
- VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
- var_Get( p_dec, "telx-ignore-subtitle-flag", &val );
- p_sys->b_ignore_sub_flag = val.b_bool;
+ p_sys->b_ignore_sub_flag = var_CreateGetBool( p_dec,
+ "telx-ignore-subtitle-flag" );
- msg_Dbg( p_dec, "starting telx on magazine %d page %x flag %d",
+ msg_Dbg( p_dec, "starting telx on magazine %d page %02x flag %d",
p_sys->i_wanted_magazine, p_sys->i_wanted_page,
p_sys->b_ignore_sub_flag );
int i_wanted_page = 0x10 * ((i_conf_wanted_page % 100) / 10)
| (i_conf_wanted_page % 10);
#endif
- vlc_bool_t b_update = VLC_FALSE;
+ bool b_update = false;
char psz_text[512], *pt = psz_text;
char psz_line[256];
int i, total;
- if( pp_block == NULL || *pp_block == NULL ) return NULL;
+ if( pp_block == NULL || *pp_block == NULL )
+ return NULL;
p_block = *pp_block;
*pp_block = NULL;
for ( i = 1; i < 32; i++ )
{
if ( !p_sys->ppsz_lines[i][0] ) continue;
- /* b_update = VLC_TRUE; */
+ /* b_update = true; */
p_sys->ppsz_lines[i][0] = 0;
}
}
strncpy( p_sys->ppsz_lines[row], psz_line,
sizeof(p_sys->ppsz_lines[row]) - 1);
}
- b_update = VLC_TRUE;
+ b_update = true;
}
else if ( row < 24 )
{
strncpy( p_sys->ppsz_lines[row], t,
sizeof(p_sys->ppsz_lines[row]) - 1 );
- b_update = VLC_TRUE;
+ b_update = true;
}
if (t[0])
{
strncpy( p_sys->ppsz_lines[0], psz_line,
sizeof(p_sys->ppsz_lines[0]) - 1 );
- /* b_update = VLC_TRUE; */
+ /* b_update = true; */
}
}
/* else if (row == 26) { */
strcpy( p_sys->psz_prev_text, psz_text );
/* Create the subpicture unit */
- p_spu = p_dec->pf_spu_buffer_new( p_dec );
+ p_spu = decoder_NewSubpicture( p_dec, NULL );
if( !p_spu )
{
msg_Warn( p_dec, "can't get spu buffer" );
/* Create a new subpicture region */
memset( &fmt, 0, sizeof(video_format_t) );
- fmt.i_chroma = VLC_FOURCC('T','E','X','T');
- fmt.i_aspect = 0;
+ fmt.i_chroma = VLC_CODEC_TEXT;
fmt.i_width = fmt.i_height = 0;
fmt.i_x_offset = fmt.i_y_offset = 0;
- p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+ p_spu->p_region = subpicture_region_New( &fmt );
if( p_spu->p_region == NULL )
{
msg_Err( p_dec, "cannot allocate SPU region" );
/* Normal text subs, easy markup */
p_spu->p_region->i_align = SUBPICTURE_ALIGN_BOTTOM | p_sys->i_align;
- p_spu->i_x = p_sys->i_align ? 20 : 0;
- p_spu->i_y = 10;
-
+ p_spu->p_region->i_x = p_sys->i_align ? 20 : 0;
+ p_spu->p_region->i_y = 10;
p_spu->p_region->psz_text = strdup(psz_text);
+
p_spu->i_start = p_block->i_pts;
p_spu->i_stop = p_block->i_pts + p_block->i_length;
p_spu->b_ephemer = (p_block->i_length == 0);
- p_spu->b_absolute = VLC_FALSE;
- p_spu->b_pausable = VLC_TRUE;
+ p_spu->b_absolute = false;
dbg((p_dec, "%ld --> %ld\n", (long int) p_block->i_pts/100000, (long int)p_block->i_length/100000));
block_Release( p_block );
error:
if ( p_spu != NULL )
{
- p_dec->pf_spu_buffer_del( p_dec, p_spu );
+ decoder_DeleteSubpicture( p_dec, p_spu );
p_spu = NULL;
}