[vlc-devel] commit: zvbi: teletext enhancements (Derk-Jan Hartman )
git version control
git at videolan.org
Thu Sep 11 20:28:11 CEST 2008
vlc | branch: master | Derk-Jan Hartman <hartman at videolan.org> | Thu Sep 11 17:12:23 2008 +0200| [badb1255ce1ce4c55dd332941198a56d29f18280] | committer: Derk-Jan Hartman
zvbi: teletext enhancements
* tell the fetcher to include navigation info in it's results
* add special values for vbi-page that can be used to go to
red, green, yellow, blue and index page
* hide the "clock" debug message
* add debug for some messages that we did not signal yet.
* only listen to most events (unhandled ones) ifdef ZVBI_DEBUG
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=badb1255ce1ce4c55dd332941198a56d29f18280
---
modules/codec/zvbi.c | 62 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 53 insertions(+), 9 deletions(-)
diff --git a/modules/codec/zvbi.c b/modules/codec/zvbi.c
index 468072c..bf93ea1 100644
--- a/modules/codec/zvbi.c
+++ b/modules/codec/zvbi.c
@@ -124,6 +124,14 @@ static const char *const ppsz_default_triplet[] = {
};
typedef enum {
+ ZVBI_KEY_RED = 'r' << 0x16,
+ ZVBI_KEY_GREEN = 'g' << 0x16,
+ ZVBI_KEY_YELLOW = 'y' << 0x16,
+ ZVBI_KEY_BLUE = 'b' << 0x16,
+ ZVBI_KEY_INDEX = 'i' << 0x16,
+} ttxt_key_id;
+
+typedef enum {
DATA_UNIT_EBU_TELETEXT_NON_SUBTITLE = 0x02,
DATA_UNIT_EBU_TELETEXT_SUBTITLE = 0x03,
DATA_UNIT_EBU_TELETEXT_INVERTED = 0x0C,
@@ -155,6 +163,9 @@ struct decoder_sys_t
unsigned int i_wanted_page;
/* */
bool b_opaque;
+ struct {
+ int pgno, subno;
+ } nav_link[6];
};
static subpicture_t *Decode( decoder_t *, block_t ** );
@@ -221,10 +232,12 @@ static int Open( vlc_object_t *p_this )
}
}
- vbi_event_handler_register( p_sys->p_vbi_dec, VBI_EVENT_TTX_PAGE |
- VBI_EVENT_CAPTION | VBI_EVENT_NETWORK |
- VBI_EVENT_ASPECT | VBI_EVENT_PROG_INFO,
- EventHandler, p_dec );
+ vbi_event_handler_register( p_sys->p_vbi_dec, VBI_EVENT_TTX_PAGE | VBI_EVENT_NETWORK |
+#ifdef ZVBI_DEBUG
+ VBI_EVENT_CAPTION | VBI_EVENT_TRIGGER |
+ VBI_EVENT_ASPECT | VBI_EVENT_PROG_INFO | VBI_EVENT_NETWORK_ID |
+#endif
+ 0 , EventHandler, p_dec );
/* Create the var on vlc_global. */
p_sys->i_wanted_page = var_CreateGetInteger( p_dec, "vbi-page" );
@@ -336,7 +349,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
b_cached = vbi_fetch_vt_page( p_sys->p_vbi_dec, &p_page,
vbi_dec2bcd( i_wanted_page ),
VBI_ANY_SUBNO, VBI_WST_LEVEL_3p5,
- 25, FALSE );
+ 25, true );
if( i_wanted_page == p_sys->i_last_page && !p_sys->b_update )
goto error;
@@ -401,6 +414,10 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
vbi_draw_vt_page( &p_page, ZVBI_PIXFMT_RGBA32,
p_spu->p_region->picture.p->p_pixels, 1, 1 );
+ vlc_mutex_lock( &p_sys->lock );
+ memcpy( p_sys->nav_link, &p_page.nav_link, sizeof( p_sys->nav_link )) ;
+ vlc_mutex_unlock( &p_sys->lock );
+
OpaquePage( p_pic, p_page, fmt, b_opaque );
}
@@ -504,22 +521,31 @@ static void EventHandler( vbi_event *ev, void *user_data )
#endif
if( p_sys->i_last_page == vbi_bcd2dec( ev->ev.ttx_page.pgno ) )
p_sys->b_update = true;
-
+#ifdef ZVBI_DEBUG
if( ev->ev.ttx_page.clock_update )
msg_Dbg( p_dec, "clock" );
-#ifdef ZVBI_DEBUG
if( ev->ev.ttx_page.header_update )
msg_Dbg( p_dec, "header" );
#endif
}
+ else if( ev->type == VBI_EVENT_CLOSE )
+ msg_Dbg( p_dec, "Close event" );
else if( ev->type == VBI_EVENT_CAPTION )
msg_Dbg( p_dec, "Caption line: %x", ev->ev.caption.pgno );
else if( ev->type == VBI_EVENT_NETWORK )
- msg_Dbg( p_dec, "Network change" );
+ {
+ msg_Dbg( p_dec, "Network change");
+ vbi_network n = ev->ev.network;
+ msg_Dbg( p_dec, "Network id:%d name: %s, call: %s ", n.nuid, n.name, n.call );
+ }
+ else if( ev->type == VBI_EVENT_TRIGGER )
+ msg_Dbg( p_dec, "Trigger event" );
else if( ev->type == VBI_EVENT_ASPECT )
msg_Dbg( p_dec, "Aspect update" );
- else if( ev->type == VBI_EVENT_NETWORK )
+ else if( ev->type == VBI_EVENT_PROG_INFO )
msg_Dbg( p_dec, "Program info received" );
+ else if( ev->type == VBI_EVENT_NETWORK_ID )
+ msg_Dbg( p_dec, "Network ID changed" );
}
static int OpaquePage( picture_t *p_src, const vbi_page p_page,
@@ -572,6 +598,24 @@ static int RequestPage( vlc_object_t *p_this, char const *psz_cmd,
VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval);
vlc_mutex_lock( &p_sys->lock );
+ switch( newval.i_int )
+ {
+ case ZVBI_KEY_RED:
+ p_sys->i_wanted_page = vbi_bcd2dec( p_sys->nav_link[0].pgno );
+ break;
+ case ZVBI_KEY_GREEN:
+ p_sys->i_wanted_page = vbi_bcd2dec( p_sys->nav_link[1].pgno );
+ break;
+ case ZVBI_KEY_YELLOW:
+ p_sys->i_wanted_page = vbi_bcd2dec( p_sys->nav_link[2].pgno );
+ break;
+ case ZVBI_KEY_BLUE:
+ p_sys->i_wanted_page = vbi_bcd2dec( p_sys->nav_link[3].pgno );
+ break;
+ case ZVBI_KEY_INDEX:
+ p_sys->i_wanted_page = vbi_bcd2dec( p_sys->nav_link[5].pgno ); /* #4 is SKIPPED */
+ break;
+ }
if( newval.i_int > 0 && newval.i_int < 999 )
p_sys->i_wanted_page = newval.i_int;
vlc_mutex_unlock( &p_sys->lock );
More information about the vlc-devel
mailing list