X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fcodec%2Fzvbi.c;h=dce7fea0aa5e53884f63f44c1dfbeca3ac510a3e;hb=fb0a060578bd8c7b2983e2b8ed0dffda8a51c631;hp=a9a560175ad253447794ee202527b32f54efa113;hpb=791b8caafd1957bfb1ac4a6defb188bb499adf54;p=vlc diff --git a/modules/codec/zvbi.c b/modules/codec/zvbi.c index a9a560175a..dce7fea0aa 100644 --- a/modules/codec/zvbi.c +++ b/modules/codec/zvbi.c @@ -41,7 +41,8 @@ # include "config.h" #endif -#include +#include +#include #include #include #include @@ -93,27 +94,29 @@ static subpicture_t *Decode( decoder_t *, block_t ** ); #define TELX_LONGTEXT N_( "Output teletext subtitles as text " \ "instead of as RGBA" ) -static int pi_pos_values[] = { 0, 1, 2, 4, 8, 5, 6, 9, 10 }; -static const char *ppsz_pos_descriptions[] = +// #define ZVBI_DEBUG + +static const int pi_pos_values[] = { 0, 1, 2, 4, 8, 5, 6, 9, 10 }; +static const char *const ppsz_pos_descriptions[] = { N_("Center"), N_("Left"), N_("Right"), N_("Top"), N_("Bottom"), N_("Top-Left"), N_("Top-Right"), N_("Bottom-Left"), N_("Bottom-Right") }; vlc_module_begin(); - set_description( _("VBI and Teletext decoder") ); - set_shortname( "VBI & Teletext" ); + set_description( N_("VBI and Teletext decoder") ); + set_shortname( N_("VBI & Teletext") ); set_capability( "decoder", 51 ); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_SCODEC ); set_callbacks( Open, Close ); add_integer( "vbi-page", 100, NULL, - PAGE_TEXT, PAGE_LONGTEXT, VLC_FALSE ); - add_bool( "vbi-opaque", VLC_TRUE, NULL, - OPAQUE_TEXT, OPAQUE_LONGTEXT, VLC_FALSE ); - add_integer( "vbi-position", 4, NULL, POS_TEXT, POS_LONGTEXT, VLC_FALSE ); + PAGE_TEXT, PAGE_LONGTEXT, false ); + add_bool( "vbi-opaque", true, NULL, + OPAQUE_TEXT, OPAQUE_LONGTEXT, false ); + add_integer( "vbi-position", 4, NULL, POS_TEXT, POS_LONGTEXT, false ); change_integer_list( pi_pos_values, ppsz_pos_descriptions, 0 ); - add_bool( "vbi-text", VLC_FALSE, NULL, - TELX_TEXT, TELX_LONGTEXT, VLC_FALSE ); + add_bool( "vbi-text", false, NULL, + TELX_TEXT, TELX_LONGTEXT, false ); vlc_module_end(); /**************************************************************************** @@ -122,22 +125,22 @@ vlc_module_end(); struct decoder_sys_t { - vbi_decoder * p_vbi_dec; - vbi_dvb_demux * p_dvb_demux; - unsigned int i_wanted_page; - unsigned int i_last_page; - vlc_bool_t b_update; - vlc_bool_t b_opaque; + vbi_decoder * p_vbi_dec; + vbi_dvb_demux * p_dvb_demux; + unsigned int i_wanted_page; + unsigned int i_last_page; + bool b_update; + bool b_opaque; /* Subtitles as text */ - vlc_bool_t b_text; + bool b_text; /* Positioning of Teletext images */ - int i_align; + int i_align; /* Misc */ -#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) - image_handler_t *p_image; +#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) || defined(HAVE_LIBSWSCALE_TREE) + image_handler_t *p_image; #endif }; @@ -168,30 +171,24 @@ static int Open( vlc_object_t *p_this ) decoder_sys_t *p_sys = NULL; if( p_dec->fmt_in.i_codec != VLC_FOURCC('t','e','l','x') ) - { return VLC_EGENERIC; - } p_dec->pf_decode_sub = Decode; p_sys = p_dec->p_sys = malloc( sizeof(decoder_sys_t) ); if( p_sys == NULL ) - { - msg_Err( p_dec, "out of memory" ); return VLC_ENOMEM; - } memset( p_sys, 0, sizeof(decoder_sys_t) ); -#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) +#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) || defined(HAVE_LIBSWSCALE_TREE) p_sys->p_image = image_HandlerCreate( VLC_OBJECT(p_dec) ); if( !p_sys->p_image ) { free( p_sys ); - msg_Err( p_dec, "out of memory" ); return VLC_ENOMEM; } #endif - p_sys->b_update = VLC_FALSE; + p_sys->b_update = false; p_sys->p_vbi_dec = vbi_decoder_new(); p_sys->p_dvb_demux = vbi_dvb_pes_demux_new( NULL, NULL ); @@ -225,7 +222,7 @@ static int Open( vlc_object_t *p_this ) if( p_sys->b_text ) p_dec->fmt_out.video.i_chroma = VLC_FOURCC('T','E','X','T'); else -#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) +#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) || defined(HAVE_LIBSWSCALE_TREE) p_dec->fmt_out.video.i_chroma = VLC_FOURCC('Y','U','V','A'); #else p_dec->fmt_out.video.i_chroma = VLC_FOURCC('R','G','B','A'); @@ -246,7 +243,7 @@ static void Close( vlc_object_t *p_this ) var_DelCallback( p_dec, "vbi-page", RequestPage, p_sys ); var_DelCallback( p_dec, "vbi-opaque", Opaque, p_sys ); -#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) +#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) || defined(HAVE_LIBSWSCALE_TREE) if( p_sys->p_image ) image_HandlerDelete( p_sys->p_image ); #endif if( p_sys->p_vbi_dec ) vbi_decoder_delete( p_sys->p_vbi_dec ); @@ -265,7 +262,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) block_t *p_block; subpicture_t *p_spu = NULL; video_format_t fmt; - vlc_bool_t b_cached = VLC_FALSE; + bool b_cached = false; vbi_page p_page; const uint8_t *p_pos; unsigned int i_left; @@ -302,12 +299,12 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) goto error; if( ( p_sys->i_wanted_page == p_sys->i_last_page ) && - ( p_sys->b_update != VLC_TRUE ) ) + ( p_sys->b_update != true ) ) goto error; - p_sys->b_update = VLC_FALSE; + p_sys->b_update = false; p_sys->i_last_page = p_sys->i_wanted_page; -#if 0 +#ifdef ZVBI_DEBUG msg_Dbg( p_dec, "we now have page: %d ready for display", p_sys->i_wanted_page ); #endif @@ -323,15 +320,18 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) /* Create a new subpicture region */ memset( &fmt, 0, sizeof(video_format_t) ); fmt.i_chroma = p_sys->b_text ? VLC_FOURCC('T','E','X','T') : -#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) +#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) || defined(HAVE_LIBSWSCALE_TREE) VLC_FOURCC('Y','U','V','A'); #else VLC_FOURCC('R','G','B','A'); #endif fmt.i_aspect = p_sys->b_text ? 0 : VOUT_ASPECT_FACTOR; - fmt.i_sar_num = fmt.i_sar_den = 1; - fmt.i_width = fmt.i_visible_width = p_page.columns * 12; - fmt.i_height = fmt.i_visible_height = p_page.rows * 10; + if( !p_sys->b_text ) + { + fmt.i_sar_num = fmt.i_sar_den = 1; + fmt.i_width = fmt.i_visible_width = p_page.columns * 12; + fmt.i_height = fmt.i_visible_height = p_page.rows * 10; + } fmt.i_bits_per_pixel = p_sys->b_text ? 0 : 32; fmt.i_x_offset = fmt.i_y_offset = 0; @@ -344,20 +344,23 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) p_spu->p_region->i_x = 0; p_spu->p_region->i_y = 0; - p_spu->p_region->i_align = SUBPICTURE_ALIGN_BOTTOM; + p_spu->p_region->i_align = p_sys->i_align; /* Normal text subs, easy markup */ p_spu->i_flags = SUBPICTURE_ALIGN_BOTTOM; - p_spu->i_start = (mtime_t) p_block->i_dts; + p_spu->i_start = (mtime_t) p_block->i_pts; p_spu->i_stop = (mtime_t) 0; - p_spu->b_ephemer = VLC_TRUE; - p_spu->b_absolute = VLC_FALSE; - p_spu->b_pausable = VLC_TRUE; - p_spu->i_width = fmt.i_width; - p_spu->i_height = fmt.i_height; - p_spu->i_original_picture_width = p_page.columns * 12; - p_spu->i_original_picture_height = p_page.rows * 10; + p_spu->b_ephemer = true; + p_spu->b_absolute = false; + p_spu->b_pausable = true; + if( !p_sys->b_text ) + { + p_spu->i_width = fmt.i_width; + p_spu->i_height = fmt.i_height; + p_spu->i_original_picture_width = p_page.columns * 12; + p_spu->i_original_picture_height = p_page.rows * 10; + } #ifdef WORDS_BIGENDIAN # define ZVBI_PIXFMT_RGBA32 VBI_PIXFMT_RGBA32_BE @@ -378,21 +381,19 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) if( i_total <= 40 ) goto error; p_spu->p_region->psz_text = strdup( &p_text[8] ); - p_spu->p_region->fmt.i_height = p_spu->p_region->fmt.i_visible_height = p_page.rows + 1; +#ifdef ZVBI_DEBUG msg_Info( p_dec, "page %x-%x(%d)\n%s", p_page.pgno, p_page.subno, i_total, p_text ); +#endif } else { -#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) +#if defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_SWSCALE_H) || defined(HAVE_LIBSWSCALE_TREE) video_format_t fmt_in; picture_t *p_pic, *p_dest; p_pic = ( picture_t * ) malloc( sizeof( picture_t ) ); if( !p_pic ) - { - msg_Err( p_dec, "out of memory" ); goto error; - } memset( &fmt_in, 0, sizeof( video_format_t ) ); memset( p_pic, 0, sizeof( picture_t ) ); @@ -415,7 +416,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) p_pic->p->i_lines = p_page.rows * 10; p_pic->p->i_pitch = p_page.columns * 12 * 4; -#if 0 +#ifdef ZVBI_DEBUG msg_Dbg( p_dec, "page %x-%x(%d,%d)", p_page.pgno, p_page.subno, p_page.rows, p_page.columns ); @@ -452,7 +453,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block ) #endif } -#undef PIXFMT_RGBA32 +#undef ZVBI_PIXFMT_RGBA32 vbi_unref_page( &p_page ); block_Release( p_block ); @@ -477,18 +478,20 @@ static void event_handler( vbi_event *ev, void *user_data ) if( ev->type == VBI_EVENT_TTX_PAGE ) { - /* msg_Info( p_dec, "Page %03x.%02x ", +#ifdef ZVBI_DEBUG + msg_Info( p_dec, "Page %03x.%02x ", ev->ev.ttx_page.pgno, ev->ev.ttx_page.subno & 0xFF); - */ +#endif if( p_sys->i_last_page == vbi_bcd2dec( ev->ev.ttx_page.pgno ) ) - p_sys->b_update = VLC_TRUE; + p_sys->b_update = true; if( ev->ev.ttx_page.clock_update ) msg_Dbg( p_dec, "clock" ); -/* if( ev->ev.ttx_page.header_update ) +#ifdef ZVBI_DEBUG + if( ev->ev.ttx_page.header_update ) msg_Dbg( p_dec, "header" ); -*/ +#endif } else if( ev->type == VBI_EVENT_CAPTION ) msg_Dbg( p_dec, "Caption line: %x", ev->ev.caption.pgno ); @@ -552,7 +555,7 @@ static int Opaque_32bpp( decoder_t *p_dec, vbi_page p_page, *p_begin = 0; break; /* To make the boxed text "closed captioning" transparent - * change VLC_TRUE to VLC_FALSE. + * change true to false. */ case VBI_OPAQUE: if( p_sys->b_opaque ) @@ -611,7 +614,7 @@ static int Opaque_8bpp( decoder_t *p_dec, vbi_page p_page, *p_begin = 0; break; /* To make the boxed text "closed captioning" transparent - * change VLC_TRUE to VLC_FALSE. + * change true to false. */ case VBI_OPAQUE: if( p_sys->b_opaque ) @@ -641,6 +644,7 @@ static int RequestPage( 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; + VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); if( (newval.i_int > 0) && (newval.i_int < 999) ) p_sys->i_wanted_page = newval.i_int; @@ -652,6 +656,7 @@ 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; + VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); if( p_sys ) p_sys->b_opaque = newval.b_bool; @@ -662,6 +667,7 @@ static int Position( 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; + VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); if( p_sys ) p_sys->i_align = newval.i_int;