[vlc-devel] commit: zvbi: Support capturing keys 0-9 in order to select a TTXT page. ( 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 20:26:28 2008 +0200| [0ce423573b54c19b30ae225bcd9e7cfcf5512d90] | committer: Derk-Jan Hartman 

zvbi: Support capturing keys 0-9 in order to select a TTXT page.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0ce423573b54c19b30ae225bcd9e7cfcf5512d90
---

 modules/codec/zvbi.c |   41 ++++++++++++++++++++++++++++++++++++++---
 1 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/modules/codec/zvbi.c b/modules/codec/zvbi.c
index bf93ea1..0cedf30 100644
--- a/modules/codec/zvbi.c
+++ b/modules/codec/zvbi.c
@@ -46,8 +46,9 @@
 #include <assert.h>
 #include <libzvbi.h>
 
-#include "vlc_vout.h"
-#include "vlc_codec.h"
+#include <vlc_vout.h>
+#include <vlc_codec.h>
+#include <vlc_osd.h>
 
 /*****************************************************************************
  * Module descriptor.
@@ -166,6 +167,7 @@ struct decoder_sys_t
     struct {
         int pgno, subno;
     }                 nav_link[6];
+    int               i_key[3];
 };
 
 static subpicture_t *Decode( decoder_t *, block_t ** );
@@ -186,6 +188,8 @@ static int Opaque( vlc_object_t *p_this, char const *psz_cmd,
                    vlc_value_t oldval, vlc_value_t newval, void *p_data );
 static int Position( vlc_object_t *p_this, char const *psz_cmd,
                      vlc_value_t oldval, vlc_value_t newval, void *p_data );
+static int EventKey( 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
@@ -207,6 +211,7 @@ static int Open( vlc_object_t *p_this )
         return VLC_ENOMEM;
     memset( p_sys, 0, sizeof(decoder_sys_t) );
 
+    p_sys->i_key[0] = p_sys->i_key[1] = p_sys->i_key[2] = '*' - '0';
     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 );
@@ -263,6 +268,9 @@ static int Open( vlc_object_t *p_this )
     p_sys->b_text = var_CreateGetBool( p_dec, "vbi-text" );
 //    var_AddCallback( p_dec, "vbi-text", Text, p_sys );
 
+    /* Listen for keys */
+    var_AddCallback( p_dec->p_libvlc, "key-pressed", EventKey, p_sys );
+
     es_format_Init( &p_dec->fmt_out, SPU_ES, VLC_FOURCC( 's','p','u',' ' ) );
     if( p_sys->b_text )
         p_dec->fmt_out.video.i_chroma = VLC_FOURCC('T','E','X','T');
@@ -282,6 +290,7 @@ static void Close( vlc_object_t *p_this )
     var_DelCallback( p_dec, "vbi-position", Position, p_sys );
     var_DelCallback( p_dec, "vbi-opaque", Opaque, p_sys );
     var_DelCallback( p_dec, "vbi-page", RequestPage, p_sys );
+    var_DelCallback( p_dec->p_libvlc, "key-pressed", EventKey, p_sys );
 
     vlc_mutex_destroy( &p_sys->lock );
 
@@ -493,7 +502,6 @@ static subpicture_t *Subpicture( decoder_t *p_dec, video_format_t *p_fmt,
     p_spu->b_absolute = false;
     p_spu->b_pausable = true;
 
-
     if( !b_text )
     {
         p_spu->i_width =
@@ -648,3 +656,30 @@ static int Position( vlc_object_t *p_this, char const *psz_cmd,
 
     return VLC_SUCCESS;
 }
+
+static int EventKey( 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 > '9' )
+        return VLC_SUCCESS;
+
+    vlc_mutex_lock( &p_sys->lock );
+    p_sys->i_key[0] = p_sys->i_key[1];
+    p_sys->i_key[1] = p_sys->i_key[2];
+    p_sys->i_key[2] = (int)(newval.i_int - '0');
+    vout_OSDMessage( p_this, DEFAULT_CHAN, "%s: %c%c%c", _("Page"), (char)(p_sys->i_key[0]+'0'), (char)(p_sys->i_key[1]+'0'), (char)(p_sys->i_key[2]+'0') );
+
+    if( p_sys->i_key[0] > 0 && p_sys->i_key[0] <= 8 &&
+        p_sys->i_key[1] >= 0 && p_sys->i_key[1] <= 9 &&
+        p_sys->i_key[2] >= 0 && p_sys->i_key[2] <= 9 )
+    {
+        p_sys->i_wanted_page = p_sys->i_key[0]*100 + p_sys->i_key[1]*10 + p_sys->i_key[2];
+        p_sys->i_key[0] = p_sys->i_key[1] = p_sys->i_key[2] = '*' - '0';
+    }
+    vlc_mutex_unlock( &p_sys->lock );
+
+    return VLC_SUCCESS;
+}




More information about the vlc-devel mailing list