+#include <vlc_codec.h>
+#include <vlc_vout_osd.h>
+
+/*****************************************************************************
+ * Module descriptor.
+ *****************************************************************************/
+static int Open ( vlc_object_t * );
+static void Close( vlc_object_t * );
+
+#define PAGE_TEXT N_("Teletext page")
+#define PAGE_LONGTEXT N_("Open the indicated Teletext page." \
+ "Default page is index 100")
+
+#define OPAQUE_TEXT N_("Text is always opaque")
+#define OPAQUE_LONGTEXT N_("Setting vbi-opaque to false " \
+ "makes the boxed text transparent." )
+
+#define POS_TEXT N_("Teletext alignment")
+#define POS_LONGTEXT N_( \
+ "You can enforce the teletext position on the video " \
+ "(0=center, 1=left, 2=right, 4=top, 8=bottom, you can " \
+ "also use combinations of these values, eg. 6 = top-right).")
+
+#define TELX_TEXT N_("Teletext text subtitles")
+#define TELX_LONGTEXT N_( "Output teletext subtitles as text " \
+ "instead of as RGBA" )
+
+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( 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, 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, NULL );
+ add_bool( "vbi-text", false, NULL,
+ TELX_TEXT, TELX_LONGTEXT, false )
+vlc_module_end ()
+
+/****************************************************************************
+ * Local structures
+ ****************************************************************************/
+
+// #define ZVBI_DEBUG
+
+//Guessing table for missing "default region triplet"
+static const int pi_default_triplet[] = {
+ 0, 0, // slo cze
+ 8, // pol
+ 24,24,24,24, //ssc scr slv rum
+ 32,32,32,32,32, //est lit rus bul ukr
+ 48,48, //gre ell
+ 64, //ara
+ 88, //heb
+ 16 }; //default
+static const char *const ppsz_default_triplet[] = {
+ "slo", "cze",
+ "pol",
+ "ssc", "scr", "slv", "rum",
+ "est", "lit", "rus", "bul", "ukr",
+ "gre", "ell",
+ "ara",
+ "heb",
+ NULL
+};
+
+typedef enum {
+ ZVBI_KEY_RED = 'r' << 16,
+ ZVBI_KEY_GREEN = 'g' << 16,
+ ZVBI_KEY_YELLOW = 'y' << 16,
+ ZVBI_KEY_BLUE = 'b' << 16,
+ ZVBI_KEY_INDEX = 'i' << 16,
+} ttxt_key_id;