diff options
author | Thomas Vander Stichele <thomas@apestaart.org> | 2004-03-14 22:34:33 +0000 |
---|---|---|
committer | Thomas Vander Stichele <thomas@apestaart.org> | 2004-03-14 22:34:33 +0000 |
commit | 7a778ee4b7ec09a1f5b2185c9cceee3910dfbdf2 (patch) | |
tree | f863b467dea9559a6ec9c48affbfae11f8104164 /gst/vbidec | |
parent | a19db4bbdc4a15ea0d8f4d28e9a1302c9c3d1657 (diff) | |
download | gst-plugins-bad-7a778ee4b7ec09a1f5b2185c9cceee3910dfbdf2.tar.gz gst-plugins-bad-7a778ee4b7ec09a1f5b2185c9cceee3910dfbdf2.tar.bz2 gst-plugins-bad-7a778ee4b7ec09a1f5b2185c9cceee3910dfbdf2.zip |
gst-indent
Original commit message from CVS:
gst-indent
Diffstat (limited to 'gst/vbidec')
-rw-r--r-- | gst/vbidec/gstvbidec.c | 259 | ||||
-rw-r--r-- | gst/vbidec/gstvbidec.h | 2 | ||||
-rw-r--r-- | gst/vbidec/vbidata.c | 1840 | ||||
-rw-r--r-- | gst/vbidec/vbidata.h | 20 | ||||
-rw-r--r-- | gst/vbidec/vbiscreen.c | 1138 | ||||
-rw-r--r-- | gst/vbidec/vbiscreen.h | 40 |
6 files changed, 1747 insertions, 1552 deletions
diff --git a/gst/vbidec/gstvbidec.c b/gst/vbidec/gstvbidec.c index 1670142f..2a92b297 100644 --- a/gst/vbidec/gstvbidec.c +++ b/gst/vbidec/gstvbidec.c @@ -43,39 +43,41 @@ //typedef struct _GstVBIDec GstVBIDec; typedef struct _GstVBIDecClass GstVBIDecClass; -struct _GstVBIDec { - GstElement element; +struct _GstVBIDec +{ + GstElement element; /* pads */ - GstPad *sinkpad, - *srcpad; - char caption[128]; - vbiscreen_t *vbiscreen; - vbidata_t *vbidata; - int caption_type; - gboolean dvd_input; + GstPad *sinkpad, *srcpad; + char caption[128]; + vbiscreen_t *vbiscreen; + vbidata_t *vbidata; + int caption_type; + gboolean dvd_input; }; -struct _GstVBIDecClass { +struct _GstVBIDecClass +{ GstElementClass parent_class; }; -GType gst_vbidec_get_type(void); +GType gst_vbidec_get_type (void); /* elementfactory information */ -static GstElementDetails gst_vbidec_details = GST_ELEMENT_DETAILS ( - "VBI decoder", - "Codec/Decoder/Video", - "Decodes closed captions and XDS data from VBI data", - "David I. Lehn <dlehn@users.sourceforge.net>" -); +static GstElementDetails gst_vbidec_details = +GST_ELEMENT_DETAILS ("VBI decoder", + "Codec/Decoder/Video", + "Decodes closed captions and XDS data from VBI data", + "David I. Lehn <dlehn@users.sourceforge.net>"); /* VBIDec signals and args */ -enum { +enum +{ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_VERBOSE, ARG_CAPTION_TYPE, @@ -83,20 +85,17 @@ enum { }; static GstStaticPadTemplate gst_vbidec_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_vbidec_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "text/plain" ) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("text/plain") + ); #define GST_TYPE_VBIDEC_CAPTION_TYPE_TYPE (gst_vbidec_caption_type_get_type()) @@ -105,35 +104,38 @@ gst_vbidec_caption_type_get_type (void) { static GType vbidec_caption_type_type = 0; static GEnumValue vbidec_caption_type[] = { - { CAPTURE_OFF, "0", "Closed Captions off"}, - { CAPTURE_CC1, "1", "Closed Caption CC1"}, - { CAPTURE_CC2, "2", "Closed Caption CC2"}, - { CAPTURE_CC3, "4", "Closed Caption CC3"}, - { CAPTURE_CC4, "5", "Closed Caption CC4"}, - { CAPTURE_T1, "6", "Closed Caption T1"}, - { CAPTURE_T2, "7", "Closed Caption T2"}, - { CAPTURE_T3, "8", "Closed Caption T3"}, - { CAPTURE_T4, "9", "Closed Caption T4"}, + {CAPTURE_OFF, "0", "Closed Captions off"}, + {CAPTURE_CC1, "1", "Closed Caption CC1"}, + {CAPTURE_CC2, "2", "Closed Caption CC2"}, + {CAPTURE_CC3, "4", "Closed Caption CC3"}, + {CAPTURE_CC4, "5", "Closed Caption CC4"}, + {CAPTURE_T1, "6", "Closed Caption T1"}, + {CAPTURE_T2, "7", "Closed Caption T2"}, + {CAPTURE_T3, "8", "Closed Caption T3"}, + {CAPTURE_T4, "9", "Closed Caption T4"}, {0, NULL, NULL}, }; if (!vbidec_caption_type_type) { - vbidec_caption_type_type = g_enum_register_static ("GstVBIDecCaptionTypeType", vbidec_caption_type); + vbidec_caption_type_type = + g_enum_register_static ("GstVBIDecCaptionTypeType", + vbidec_caption_type); } return vbidec_caption_type_type; } -static void gst_vbidec_base_init (gpointer g_class); -static void gst_vbidec_class_init (GstVBIDecClass *klass); -static void gst_vbidec_init (GstVBIDec *vbidec); +static void gst_vbidec_base_init (gpointer g_class); +static void gst_vbidec_class_init (GstVBIDecClass * klass); +static void gst_vbidec_init (GstVBIDec * vbidec); -static void gst_vbidec_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_vbidec_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_vbidec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_vbidec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_vbidec_chain (GstPad *pad, GstData *_data); +static void gst_vbidec_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_vbidec_signals[LAST_SIGNAL] = { 0 };*/ GType @@ -143,17 +145,18 @@ gst_vbidec_get_type (void) if (!vbidec_type) { static const GTypeInfo vbidec_info = { - sizeof(GstVBIDecClass), + sizeof (GstVBIDecClass), gst_vbidec_base_init, NULL, - (GClassInitFunc)gst_vbidec_class_init, + (GClassInitFunc) gst_vbidec_class_init, NULL, NULL, - sizeof(GstVBIDec), + sizeof (GstVBIDec), 0, - (GInstanceInitFunc)gst_vbidec_init, + (GInstanceInitFunc) gst_vbidec_init, }; - vbidec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstVBIDec", &vbidec_info, 0); + vbidec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstVBIDec", &vbidec_info, 0); } return vbidec_type; } @@ -171,62 +174,66 @@ gst_vbidec_base_init (gpointer g_class) gst_static_pad_template_get (&gst_vbidec_sink_template)); } static void -gst_vbidec_class_init(GstVBIDecClass *klass) +gst_vbidec_class_init (GstVBIDecClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - gobject_class->set_property = gst_vbidec_set_property; - gobject_class->get_property = gst_vbidec_get_property; + gobject_class->set_property = gst_vbidec_set_property; + gobject_class->get_property = gst_vbidec_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VERBOSE, g_param_spec_boolean ("verbose", "verbose", "verbose", - FALSE, G_PARAM_WRITABLE)); + FALSE, G_PARAM_WRITABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CAPTION_TYPE, g_param_spec_enum ("caption type", "caption type", "Closed Caption Type", - GST_TYPE_VBIDEC_CAPTION_TYPE_TYPE, CAPTURE_OFF, G_PARAM_READWRITE)); + GST_TYPE_VBIDEC_CAPTION_TYPE_TYPE, CAPTURE_OFF, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DVD_INPUT, - g_param_spec_boolean ("dvd input", "dvd input", "VBI is encapsulated in MPEG2 GOP user_data field (as on DVDs)", - FALSE, G_PARAM_READWRITE)); + g_param_spec_boolean ("dvd input", "dvd input", + "VBI is encapsulated in MPEG2 GOP user_data field (as on DVDs)", + FALSE, G_PARAM_READWRITE)); } static void -gst_vbidec_init (GstVBIDec *vbidec) +gst_vbidec_init (GstVBIDec * vbidec) { /* create the sink and src pads */ - vbidec->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_vbidec_sink_template), "sink"); + vbidec->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_vbidec_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (vbidec), vbidec->sinkpad); - gst_pad_set_chain_function (vbidec->sinkpad, GST_DEBUG_FUNCPTR (gst_vbidec_chain)); + gst_pad_set_chain_function (vbidec->sinkpad, + GST_DEBUG_FUNCPTR (gst_vbidec_chain)); - vbidec->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_vbidec_src_template), "src"); + vbidec->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_vbidec_src_template), "src"); gst_element_add_pad (GST_ELEMENT (vbidec), vbidec->srcpad); - vbidec->vbiscreen = vbiscreen_new(0, 0, 1.0, 0, (void *)vbidec); - vbidec->vbidata = vbidata_new_line(vbidec->vbiscreen, 0); + vbidec->vbiscreen = vbiscreen_new (0, 0, 1.0, 0, (void *) vbidec); + vbidec->vbidata = vbidata_new_line (vbidec->vbiscreen, 0); vbidec->caption_type = CAPTURE_OFF; - vbidata_capture_mode(vbidec->vbidata, vbidec->caption_type); + vbidata_capture_mode (vbidec->vbidata, vbidec->caption_type); vbidec->dvd_input = FALSE; } static void -line21_decode(GstVBIDec *vbidec, guint8 *data, guint32 size) +line21_decode (GstVBIDec * vbidec, guint8 * data, guint32 size) { - vbidata_process_line(vbidec->vbidata, data, 0); + vbidata_process_line (vbidec->vbidata, data, 0); } static void -dvd_user_data_decode(GstVBIDec *vbidec, guint8 *data, guint32 size) +dvd_user_data_decode (GstVBIDec * vbidec, guint8 * data, guint32 size) { //char caption[128]; //int ci; /* caption index */ - int i; /* buf index */ + int i; /* buf index */ int num_disp_field; guint8 b1, b2; int w; @@ -235,29 +242,29 @@ dvd_user_data_decode(GstVBIDec *vbidec, guint8 *data, guint32 size) //g_print("== %p %d\n", data, size); i = 0; /* Check for Closed Captioning data */ - if (data[i] != 0x43 || data[i+1] != 0x43 || - data[i+2] != 0x01 || data[i+3] != 0xf8) { + if (data[i] != 0x43 || data[i + 1] != 0x43 || + data[i + 2] != 0x01 || data[i + 3] != 0xf8) { g_print ("non-CC data\n"); return; } //g_print ("CC data\n"); - i += 4; /* above */ - i += 4; /* ? */ + i += 4; /* above */ + i += 4; /* ? */ num_disp_field = data[i] & 0x3f; //g_print ("ndf %d\n", num_disp_field); while ((data[i] & 0xfe) == 0xfe) { if (data[i] & 0x1) { - b1 = data[i+1] & 0x7f; - b2 = data[i+2] & 0x7f; + b1 = data[i + 1] & 0x7f; + b2 = data[i + 2] & 0x7f; w = (b2 << 8) | b1; - vbidata_process_16b(vbidec->vbidata, 0, w); + vbidata_process_16b (vbidec->vbidata, 0, w); } i += 3; } } static void -gst_vbidec_chain (GstPad *pad, GstData *_data) +gst_vbidec_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstVBIDec *vbidec = GST_VBIDEC (gst_pad_get_parent (pad)); @@ -270,39 +277,40 @@ gst_vbidec_chain (GstPad *pad, GstData *_data) pts = GST_BUFFER_TIMESTAMP (buf); /* - g_print("** user_data: addr:%p len:%d state:%d\n", data, size, 0); - { - int i; - guint8 ud; - g_print("** \""); - for (i=0; i<size; i++) { - ud = data[i]; - if (isprint((char)ud)) { - g_print("%c", (char)ud); - } else { - g_print("[0x%02x]", ud); - } - } - g_print("\"\n"); - } - */ + g_print("** user_data: addr:%p len:%d state:%d\n", data, size, 0); + { + int i; + guint8 ud; + g_print("** \""); + for (i=0; i<size; i++) { + ud = data[i]; + if (isprint((char)ud)) { + g_print("%c", (char)ud); + } else { + g_print("[0x%02x]", ud); + } + } + g_print("\"\n"); + } + */ if (vbidec->dvd_input) { - dvd_user_data_decode(vbidec, data, size); + dvd_user_data_decode (vbidec, data, size); } else { - line21_decode(vbidec, data, size); + line21_decode (vbidec, data, size); } - gst_buffer_unref(buf); + gst_buffer_unref (buf); } void -gst_vbidec_show_text (GstVBIDec *vbidec, char *text, int len) +gst_vbidec_show_text (GstVBIDec * vbidec, char *text, int len) { //fprintf(stderr, "%*s\n", len, text); if (len > 0) { if (GST_PAD_IS_USABLE (vbidec->srcpad)) { GstBuffer *buf = gst_buffer_new_and_alloc (len); + memcpy (GST_BUFFER_DATA (buf), text, len); GST_BUFFER_SIZE (buf) = len; // FIXME @@ -315,7 +323,8 @@ gst_vbidec_show_text (GstVBIDec *vbidec, char *text, int len) } static void -gst_vbidec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_vbidec_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstVBIDec *vbidec; @@ -325,15 +334,15 @@ gst_vbidec_set_property (GObject *object, guint prop_id, const GValue *value, GP switch (prop_id) { case ARG_VERBOSE: - vbidata_set_verbose(vbidec->vbidata, g_value_get_boolean (value)); - vbiscreen_set_verbose(vbidec->vbiscreen, g_value_get_boolean (value)); + vbidata_set_verbose (vbidec->vbidata, g_value_get_boolean (value)); + vbiscreen_set_verbose (vbidec->vbiscreen, g_value_get_boolean (value)); break; case ARG_DVD_INPUT: - vbidec->dvd_input = g_value_get_boolean(value); + vbidec->dvd_input = g_value_get_boolean (value); break; case ARG_CAPTION_TYPE: - vbidec->caption_type = g_value_get_enum(value); - vbidata_capture_mode(vbidec->vbidata, vbidec->caption_type); + vbidec->caption_type = g_value_get_enum (value); + vbidata_capture_mode (vbidec->vbidata, vbidec->caption_type); break; default: break; @@ -341,7 +350,8 @@ gst_vbidec_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_vbidec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_vbidec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVBIDec *vbidec; @@ -351,10 +361,10 @@ gst_vbidec_get_property (GObject *object, guint prop_id, GValue *value, GParamSp switch (prop_id) { case ARG_DVD_INPUT: - g_value_set_boolean(value, vbidec->dvd_input); + g_value_set_boolean (value, vbidec->dvd_input); break; case ARG_CAPTION_TYPE: - g_value_set_enum(value, vbidec->caption_type); + g_value_set_enum (value, vbidec->caption_type); break; default: break; @@ -362,19 +372,14 @@ gst_vbidec_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "vbidec", GST_RANK_NONE, GST_TYPE_VBIDEC); + return gst_element_register (plugin, "vbidec", GST_RANK_NONE, + GST_TYPE_VBIDEC); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "vbidec", - "Decodes closed captions and XDS data from VBI data", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "vbidec", + "Decodes closed captions and XDS data from VBI data", + plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/vbidec/gstvbidec.h b/gst/vbidec/gstvbidec.h index 8a5ea7e5..e495f25c 100644 --- a/gst/vbidec/gstvbidec.h +++ b/gst/vbidec/gstvbidec.h @@ -19,4 +19,4 @@ typedef struct _GstVBIDec GstVBIDec; -void gst_vbidec_show_text (GstVBIDec *vbidec, char *text, int len); +void gst_vbidec_show_text (GstVBIDec * vbidec, char *text, int len); diff --git a/gst/vbidec/vbidata.c b/gst/vbidec/vbidata.c index fc0af5fa..75a85e48 100644 --- a/gst/vbidec/vbidata.c +++ b/gst/vbidec/vbidata.c @@ -48,159 +48,166 @@ static int pll = 0; struct vbidata_s { - int fd; - vbiscreen_t *vs; - /*tvtime_osd_t *osd;*/ - char buf[ 65536 ]; - int wanttop; - int wanttext; - - unsigned int colour; - int row, ital; - int indent, ul; - int chan; - - unsigned int current_colour; - int current_row, current_ital; - int current_indent, current_ul; - int current_chan; - int current_istext; - - int initialised; - int enabled; - int lastcode; - int lastcount; - int verbose; - - /* XDS data */ - char xds_packet[ 2048 ]; - int xds_cursor; - - char *program_name; - char *network_name; - char *call_letters; - const char *rating; - const char *program_type; - int start_day; - int start_month; - int start_min; - int start_hour; - int length_hour; - int length_min; - int length_elapsed_hour; - int length_elapsed_min; - int length_elapsed_sec; - char *program_desc[8]; + int fd; + vbiscreen_t *vs; + /*tvtime_osd_t *osd; */ + char buf[65536]; + int wanttop; + int wanttext; + + unsigned int colour; + int row, ital; + int indent, ul; + int chan; + + unsigned int current_colour; + int current_row, current_ital; + int current_indent, current_ul; + int current_chan; + int current_istext; + + int initialised; + int enabled; + int lastcode; + int lastcount; + int verbose; + + /* XDS data */ + char xds_packet[2048]; + int xds_cursor; + + char *program_name; + char *network_name; + char *call_letters; + const char *rating; + const char *program_type; + int start_day; + int start_month; + int start_min; + int start_hour; + int length_hour; + int length_min; + int length_elapsed_hour; + int length_elapsed_min; + int length_elapsed_sec; + char *program_desc[8]; }; /* this is NOT exactly right */ //static char *ccode = " !\"#$%&'()\0341+,-./0123456789:;<=>?@" static char *ccode = " !\"#$%&'()a+,-./0123456789:;<=>?@" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // "abcdefghijklmnopqrstuvwxyz" // "[\0351]\0355\0363\0372abcdefghijklmnopqr" - "[e]iouabcdefghijklmnopqr" + "[e]iouabcdefghijklmnopqr" // "stuvwxyz\0347\0367\0245\0244\0240"; - "stuvwxyzcoNn "; + "stuvwxyzcoNn "; static char *wccode = "\0256\0260\0275\0277T\0242\0243#\0340 " - "\0350\0354\0362\0371"; + "\0350\0354\0362\0371"; static char *extcode1 = "\0301\0311\0323\0332\0334\0374" - "`\0241*'-\0251S*\"\"\0300\0302" - "\0307\0310\0312\0313\0353\0316\0317\0357" - "\0324\0331\0371\0333\0253\0273"; + "`\0241*'-\0251S*\"\"\0300\0302" + "\0307\0310\0312\0313\0353\0316\0317\0357" "\0324\0331\0371\0333\0253\0273"; static char *extcode2 = "\0303\0343\0315\0314\0354\0322\0362\0325" - "{}\\^_|~\0304\0344\0326\0366\0337\0245\0244|" - "\0305\0345\0330\0370++++"; + "{}\\^_|~\0304\0344\0326\0366\0337\0245\0244|" "\0305\0345\0330\0370++++"; -int parityok(int n) +int +parityok (int n) { /* check parity for 2 bytes packed in n */ - int j, k; - for (k = 0, j = 0; j < 7; j++) - if (n & (1 << j)) - k++; - if ((k & 1) && (n & 0x80)) - return 0; - for (k = 0, j = 8; j < 15; j++) - if (n & (1 << j)) - k++; - if ((k & 1) && (n & 0x8000)) - return 0; - return 1; + int j, k; + + for (k = 0, j = 0; j < 7; j++) + if (n & (1 << j)) + k++; + if ((k & 1) && (n & 0x80)) + return 0; + for (k = 0, j = 8; j < 15; j++) + if (n & (1 << j)) + k++; + if ((k & 1) && (n & 0x8000)) + return 0; + return 1; } -int decodebit(unsigned char *data, int threshold) +int +decodebit (unsigned char *data, int threshold) { - return ((data[0] + data[1] + data[2] + data[3] + data[4] + data[5] + - data[6] + data[7] + data[8] + data[9] + data[10] + data[11] + - data[12] + data[13] + data[14] + data[15] + data[16] + data[17] + - data[18] + data[19] + data[20] + data[21] + data[22] + data[23] + - data[24] + data[25] + data[26] + data[27] + data[28] + data[29] + - data[30] + data[31])>>5 > threshold); + return ((data[0] + data[1] + data[2] + data[3] + data[4] + data[5] + + data[6] + data[7] + data[8] + data[9] + data[10] + data[11] + + data[12] + data[13] + data[14] + data[15] + data[16] + data[17] + + data[18] + data[19] + data[20] + data[21] + data[22] + data[23] + + data[24] + data[25] + data[26] + data[27] + data[28] + data[29] + + data[30] + data[31]) >> 5 > threshold); } -int ccdecode(unsigned char *vbiline) +int +ccdecode (unsigned char *vbiline) { - int max = 0, maxval = 0, minval = 255, i = 0, clk = 0, tmp = 0; - int sample, packedbits = 0; - - for (i=0; i<250; i++) { - sample = vbiline[i]; - if (sample - maxval > 10) - (maxval = sample, max = i); - if (sample < minval) - minval = sample; - if (maxval - sample > 40) - break; - } - sample = ((maxval + minval) >> 1); - pll = max; - - /* found clock lead-in, double-check start */ + int max = 0, maxval = 0, minval = 255, i = 0, clk = 0, tmp = 0; + int sample, packedbits = 0; + + for (i = 0; i < 250; i++) { + sample = vbiline[i]; + if (sample - maxval > 10) + (maxval = sample, max = i); + if (sample < minval) + minval = sample; + if (maxval - sample > 40) + break; + } + sample = ((maxval + minval) >> 1); + pll = max; + + /* found clock lead-in, double-check start */ #ifndef PAL_DECODE - i = max + 478; + i = max + 478; #else - i = max + 538; + i = max + 538; #endif - if (!decodebit(&vbiline[i], sample)) - return 0; + if (!decodebit (&vbiline[i], sample)) + return 0; #ifndef PAL_DECODE - tmp = i + 57; /* tmp = data bit zero */ + tmp = i + 57; /* tmp = data bit zero */ #else - tmp = i + 71; + tmp = i + 71; #endif - for (i = 0; i < 16; i++) { + for (i = 0; i < 16; i++) { #ifndef PAL_DECODE - clk = tmp + i * 57; + clk = tmp + i * 57; #else - clk = tmp + i * 71; + clk = tmp + i * 71; #endif - if (decodebit(&vbiline[clk], sample)) { - packedbits |= 1 << i; - } + if (decodebit (&vbiline[clk], sample)) { + packedbits |= 1 << i; } - if (parityok(packedbits)) - return packedbits; - return 0; + } + if (parityok (packedbits)) + return packedbits; + return 0; } /* ccdecode */ -const char *movies[] = { "N/A", "G", "PG", "PG-13", "R", - "NC-17", "X", "Not Rated" }; -const char *usa_tv[] = { "Not Rated", "TV-Y", "TV-Y7", "TV-G", - "TV-PG", "TV-14", "TV-MA", "Not Rated" }; -const char *cane_tv[] = { "Exempt", "C", "C8+", "G", "PG", - "14+", "18+", "Reserved" }; -const char *canf_tv[] = { "Exempt", "G", "8 ans +", "13 ans +", - "16 ans +", "18 ans +", "Reserved", - "Reserved" }; +const char *movies[] = { "N/A", "G", "PG", "PG-13", "R", + "NC-17", "X", "Not Rated" +}; +const char *usa_tv[] = { "Not Rated", "TV-Y", "TV-Y7", "TV-G", + "TV-PG", "TV-14", "TV-MA", "Not Rated" +}; +const char *cane_tv[] = { "Exempt", "C", "C8+", "G", "PG", + "14+", "18+", "Reserved" +}; +const char *canf_tv[] = { "Exempt", "G", "8 ans +", "13 ans +", + "16 ans +", "18 ans +", "Reserved", + "Reserved" +}; const char *months[] = { 0, "Jan", "Feb", "Mar", "Apr", "May", - "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; -static const char *eia608_program_type[ 96 ] = { +static const char *eia608_program_type[96] = { "education", "entertainment", "movie", "news", "religious", "sports", "other", "action", "advertisement", "animated", "anthology", "automobile", "awards", "baseball", "basketball", "bulletin", "business", @@ -220,245 +227,318 @@ static const char *eia608_program_type[ 96 ] = { }; -static void parse_xds_packet( vbidata_t *vbi, char *packet, int length ) +static void +parse_xds_packet (vbidata_t * vbi, char *packet, int length) { - int sum = 0; - int i; - - if( !vbi ) return; - - /* Check the checksum for validity of the packet. */ - for( i = 0; i < length - 1; i++ ) { - sum += packet[ i ]; + int sum = 0; + int i; + + if (!vbi) + return; + + /* Check the checksum for validity of the packet. */ + for (i = 0; i < length - 1; i++) { + sum += packet[i]; + } + if ((((~sum) & 0x7f) + 1) != packet[length - 1]) { + return; + } + + /* Stick a null at the end, and cut off the last two characters. */ + packet[length - 2] = '\0'; + length -= 2; + + if (packet[0] == 0x01 && packet[1] == 0x03) { + if (vbi->program_name && !strcmp (vbi->program_name, packet + 2)) { + return; } - if( (((~sum) & 0x7f) + 1) != packet[ length - 1 ] ) { - return; + if (vbi->verbose) + fprintf (stderr, "Current program name: '%s'\n", packet + 2); + if (vbi->program_name) + free (vbi->program_name); + vbi->program_name = strdup (packet + 2); + /*tvtime_osd_set_show_name( vbi->osd, vbi->program_name ); */ + } else if (packet[0] == 0x03 && packet[1] == 0x03) { + if (vbi->verbose) + fprintf (stderr, "Future program name: '%s'\n", packet + 2); + } else if (packet[0] == 0x05 && packet[1] == 0x01) { + if (vbi->network_name && !strcmp (vbi->network_name, packet + 2)) { + return; } - /* Stick a null at the end, and cut off the last two characters. */ - packet[ length - 2 ] = '\0'; - length -= 2; - - if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x03 ) { - if( vbi->program_name && !strcmp(vbi->program_name, packet + 2 ) ) { - return; - } - if( vbi->verbose ) fprintf( stderr, "Current program name: '%s'\n", packet + 2 ); - if( vbi->program_name ) free( vbi->program_name ); - vbi->program_name = strdup(packet + 2); - /*tvtime_osd_set_show_name( vbi->osd, vbi->program_name );*/ - } else if( packet[ 0 ] == 0x03 && packet[ 1 ] == 0x03 ) { - if( vbi->verbose ) fprintf( stderr, "Future program name: '%s'\n", packet + 2 ); - } else if( packet[ 0 ] == 0x05 && packet[ 1 ] == 0x01 ) { - if( vbi->network_name && !strcmp(vbi->network_name, packet + 2 ) ) { - return; - } - - if( vbi->verbose ) fprintf( stderr, "Network name: '%s'\n", packet + 2 ); - if( vbi->network_name ) free( vbi->network_name ); - vbi->network_name = strdup( packet + 2 ); - /*tvtime_osd_set_network_name( vbi->osd, vbi->network_name );*/ - } else if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x05 ) { - int movie_rating = packet[ 2 ] & 7; - int scheme = (packet[ 2 ] & 56) >> 3; - int tv_rating = packet[ 3 ] & 7; - int VSL = packet[ 3 ] & 56; - const char * str; - - switch( VSL | scheme ) { - case 3: /* Canadian English TV */ - str = cane_tv[ tv_rating ]; - break; - case 7: /* Canadian French TV */ - str = canf_tv[ tv_rating ]; - break; - case 19: /* Reserved */ - case 31: - str = ""; - break; - default: - if( ((VSL | scheme) & 3) == 1 ) { - /* USA TV */ - str = usa_tv[ tv_rating ]; - } else { - /* MPAA Movie Rating */ - str = movies[ movie_rating ]; - } - break; - } - - if( vbi->rating && !strcmp(vbi->rating, str ) ) { - return; - } - - if( vbi->verbose ) fprintf( stderr, "Show rating: %s", str ); - if( ((VSL | scheme) & 3) == 1 || ((VSL | scheme) & 3) == 0 ) { - /* show VSLD for the americans */ - if( (VSL | scheme) & 32 ) { - if( vbi->verbose ) fprintf( stderr, " V" ); - } - if( (VSL | scheme) & 16 ) { - if( vbi->verbose ) fprintf( stderr, " S" ); - } - if( (VSL | scheme) & 8 ) { - if( vbi->verbose ) fprintf( stderr, " L" ); - } - if( (VSL | scheme) & 4 ) { - if( vbi->verbose ) fprintf( stderr, " D" ); - } - } - if( vbi->verbose ) fprintf( stderr, "\n" ); - vbi->rating = str; - /*tvtime_osd_set_show_rating( vbi->osd, vbi->rating );*/ - } else if( packet[ 0 ] == 0x05 && packet[ 1 ] == 0x02 ) { - if( vbi->call_letters && !strcmp(vbi->call_letters, packet + 2 ) ) { - return; - } - - if( vbi->verbose ) fprintf( stderr, "Network call letters: '%s'\n", packet + 2 ); - if( vbi->call_letters ) free( vbi->call_letters ); - vbi->call_letters = strdup( packet + 2 ); - /*tvtime_osd_set_network_call( vbi->osd, vbi->call_letters );*/ - } else if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x01 ) { - int month = packet[5];// & 15; - int day = packet[4];// & 31; - int hour = packet[3];// & 31; - int min = packet[2];// & 63; - char str[33]; - if( vbi->verbose ) fprintf( stderr, "Program Start: %02d %s, %02d:%02d\n", - day & 31, months[month & 15], hour & 31, min & 63 ); - // packet[ 3 ], packet[ 4 ], packet[ 5 ], packet[ 6 ] ); - //packet[ 5 ] & 31, packet[ 6 ], packet[ 4 ] & 31, packet[ 3 ] & 63 ); - vbi->start_month = month & 15; - vbi->start_day = day & 31; - vbi->start_hour = hour & 31; - vbi->start_min = hour & 63; - snprintf( str, 32, "%02d %s, %02d:%02d", - day & 31, months[month & 15], hour & 31, min & 63 ); - /*tvtime_osd_set_show_start( vbi->osd, str );*/ - } else if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x04 ) { - if( vbi->verbose ) fprintf( stderr, "Program type: " ); - for( i = 0; i < length - 2; i++ ) { - int cur = packet[ 2 + i ] - 0x20; - if( cur >= 0 && cur < 96 ) { - if( vbi->verbose ) fprintf( stderr, "%s%s", i ? ", " : "", eia608_program_type[ cur ] ); - /* this will cause us to keep only the last type we check */ - vbi->program_type = eia608_program_type[ cur ]; - } - } - if( vbi->verbose ) fprintf( stderr, "\n" ); - } else if( packet[ 0 ] < 0x03 && packet[ 1 ] >= 0x10 && packet[ 1 ] <= 0x17 ) { - - if( vbi->program_desc[ packet[1] & 0xf ] && - !strcmp(vbi->program_desc[ packet[1] & 0xf ], packet + 2 ) ) { - return; - } - - if( vbi->verbose ) fprintf( stderr, "Program Description: Line %d", packet[1] & 0xf ); - if( vbi->verbose ) fprintf( stderr, "%s\n", packet + 2 ); - if( vbi->program_desc[ packet[1] & 0xf ] ) - free( vbi->program_desc[ packet[1] & 0xf ] ); - vbi->program_desc[ packet[1] & 0xf ] = strdup( packet + 2 ); - } else if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x02 ) { - char str[ 33 ]; - str[0] = 0; - if( vbi->verbose ) fprintf( stderr, "Program Length: %02d:%02d", - packet[ 3 ] & 63, packet[ 2 ] & 63 ); - vbi->length_hour = packet[ 3 ] & 63; - vbi->length_min = packet[ 2 ] & 63; - snprintf( str, 32, "%02d:%02d", - packet[ 3 ] & 63, packet[ 2 ] & 63 ); - if( length > 4 ) { - if( vbi->verbose ) fprintf( stderr, " Elapsed: %02d:%02d", packet[ 5 ] & 63, - packet[ 4 ] & 63 ); - vbi->length_elapsed_hour = packet[ 5 ] & 63; - vbi->length_elapsed_min = packet[ 4 ] & 63; - snprintf( str, 32, "%02d:%02d/%02d:%02d", - packet[ 5 ] & 63, packet[ 4 ] & 63, - packet[ 3 ] & 63, packet[ 2 ] & 63 ); - } else { - vbi->length_elapsed_hour = 0; - vbi->length_elapsed_min = 0; - } - - if( length > 6 ) { - if( vbi->verbose ) fprintf( stderr, ".%02d", packet[ 6 ] & 63 ); - vbi->length_elapsed_hour = packet[ 6 ] & 63; - snprintf( str, 32, "%02d:%02d.%02d/%02d:%02d", - packet[ 5 ] & 63, packet[ 4 ] & 63, packet[ 6 ] & 63, - packet[ 3 ] & 63, packet[ 2 ] & 63 ); - } else { - vbi->length_elapsed_hour = 0; - } - /*tvtime_osd_set_show_length( vbi->osd, str );*/ - if( vbi->verbose ) fprintf( stderr, "\n" ); - } else if( packet[ 0 ] == 0x05 && packet[ 1 ] == 0x04 ) { - if( vbi->verbose ) fprintf( stderr, "Transmission Signal Identifier (TSID): 0x%04x\n", - packet[ 2 ] << 24 | packet[ 3 ] << 16 | packet[ 4 ] << 8 | packet[ 5 ] ); - } else { - /* unknown */ - - if( vbi->verbose ) fprintf( stderr, "Unknown XDS packet, class " ); - switch( packet[ 0 ] ) { - case 0x1: if( vbi->verbose ) fprintf( stderr, "CURRENT start\n" ); break; - case 0x2: if( vbi->verbose ) fprintf( stderr, "CURRENT continue\n" ); break; + if (vbi->verbose) + fprintf (stderr, "Network name: '%s'\n", packet + 2); + if (vbi->network_name) + free (vbi->network_name); + vbi->network_name = strdup (packet + 2); + /*tvtime_osd_set_network_name( vbi->osd, vbi->network_name ); */ + } else if (packet[0] == 0x01 && packet[1] == 0x05) { + int movie_rating = packet[2] & 7; + int scheme = (packet[2] & 56) >> 3; + int tv_rating = packet[3] & 7; + int VSL = packet[3] & 56; + const char *str; + + switch (VSL | scheme) { + case 3: /* Canadian English TV */ + str = cane_tv[tv_rating]; + break; + case 7: /* Canadian French TV */ + str = canf_tv[tv_rating]; + break; + case 19: /* Reserved */ + case 31: + str = ""; + break; + default: + if (((VSL | scheme) & 3) == 1) { + /* USA TV */ + str = usa_tv[tv_rating]; + } else { + /* MPAA Movie Rating */ + str = movies[movie_rating]; + } + break; + } - case 0x3: if( vbi->verbose ) fprintf( stderr, "FUTURE start\n" ); break; - case 0x4: if( vbi->verbose ) fprintf( stderr, "FUTURE continue\n" ); break; + if (vbi->rating && !strcmp (vbi->rating, str)) { + return; + } - case 0x5: if( vbi->verbose ) fprintf( stderr, "CHANNEL start\n" ); break; - case 0x6: if( vbi->verbose ) fprintf( stderr, "CHANNEL continue\n" ); break; + if (vbi->verbose) + fprintf (stderr, "Show rating: %s", str); + if (((VSL | scheme) & 3) == 1 || ((VSL | scheme) & 3) == 0) { + /* show VSLD for the americans */ + if ((VSL | scheme) & 32) { + if (vbi->verbose) + fprintf (stderr, " V"); + } + if ((VSL | scheme) & 16) { + if (vbi->verbose) + fprintf (stderr, " S"); + } + if ((VSL | scheme) & 8) { + if (vbi->verbose) + fprintf (stderr, " L"); + } + if ((VSL | scheme) & 4) { + if (vbi->verbose) + fprintf (stderr, " D"); + } + } + if (vbi->verbose) + fprintf (stderr, "\n"); + vbi->rating = str; + /*tvtime_osd_set_show_rating( vbi->osd, vbi->rating ); */ + } else if (packet[0] == 0x05 && packet[1] == 0x02) { + if (vbi->call_letters && !strcmp (vbi->call_letters, packet + 2)) { + return; + } - case 0x7: if( vbi->verbose ) fprintf( stderr, "MISC start\n" ); break; - case 0x8: if( vbi->verbose ) fprintf( stderr, "MISC continue\n" ); break; + if (vbi->verbose) + fprintf (stderr, "Network call letters: '%s'\n", packet + 2); + if (vbi->call_letters) + free (vbi->call_letters); + vbi->call_letters = strdup (packet + 2); + /*tvtime_osd_set_network_call( vbi->osd, vbi->call_letters ); */ + } else if (packet[0] == 0x01 && packet[1] == 0x01) { + int month = packet[5]; // & 15; + int day = packet[4]; // & 31; + int hour = packet[3]; // & 31; + int min = packet[2]; // & 63; + char str[33]; + + if (vbi->verbose) + fprintf (stderr, "Program Start: %02d %s, %02d:%02d\n", + day & 31, months[month & 15], hour & 31, min & 63); + // packet[ 3 ], packet[ 4 ], packet[ 5 ], packet[ 6 ] ); + //packet[ 5 ] & 31, packet[ 6 ], packet[ 4 ] & 31, packet[ 3 ] & 63 ); + vbi->start_month = month & 15; + vbi->start_day = day & 31; + vbi->start_hour = hour & 31; + vbi->start_min = hour & 63; + snprintf (str, 32, "%02d %s, %02d:%02d", + day & 31, months[month & 15], hour & 31, min & 63); + /*tvtime_osd_set_show_start( vbi->osd, str ); */ + } else if (packet[0] == 0x01 && packet[1] == 0x04) { + if (vbi->verbose) + fprintf (stderr, "Program type: "); + for (i = 0; i < length - 2; i++) { + int cur = packet[2 + i] - 0x20; + + if (cur >= 0 && cur < 96) { + if (vbi->verbose) + fprintf (stderr, "%s%s", i ? ", " : "", eia608_program_type[cur]); + /* this will cause us to keep only the last type we check */ + vbi->program_type = eia608_program_type[cur]; + } + } + if (vbi->verbose) + fprintf (stderr, "\n"); + } else if (packet[0] < 0x03 && packet[1] >= 0x10 && packet[1] <= 0x17) { - case 0x9: if( vbi->verbose ) fprintf( stderr, "PUB start\n" ); break; - case 0xa: if( vbi->verbose ) fprintf( stderr, "PUB continue\n" ); break; + if (vbi->program_desc[packet[1] & 0xf] && + !strcmp (vbi->program_desc[packet[1] & 0xf], packet + 2)) { + return; + } - case 0xb: if( vbi->verbose ) fprintf( stderr, "RES start\n" ); break; - case 0xc: if( vbi->verbose ) fprintf( stderr, "RES continue\n" ); break; + if (vbi->verbose) + fprintf (stderr, "Program Description: Line %d", packet[1] & 0xf); + if (vbi->verbose) + fprintf (stderr, "%s\n", packet + 2); + if (vbi->program_desc[packet[1] & 0xf]) + free (vbi->program_desc[packet[1] & 0xf]); + vbi->program_desc[packet[1] & 0xf] = strdup (packet + 2); + } else if (packet[0] == 0x01 && packet[1] == 0x02) { + char str[33]; + + str[0] = 0; + if (vbi->verbose) + fprintf (stderr, "Program Length: %02d:%02d", + packet[3] & 63, packet[2] & 63); + vbi->length_hour = packet[3] & 63; + vbi->length_min = packet[2] & 63; + snprintf (str, 32, "%02d:%02d", packet[3] & 63, packet[2] & 63); + if (length > 4) { + if (vbi->verbose) + fprintf (stderr, " Elapsed: %02d:%02d", packet[5] & 63, packet[4] & 63); + vbi->length_elapsed_hour = packet[5] & 63; + vbi->length_elapsed_min = packet[4] & 63; + snprintf (str, 32, "%02d:%02d/%02d:%02d", + packet[5] & 63, packet[4] & 63, packet[3] & 63, packet[2] & 63); + } else { + vbi->length_elapsed_hour = 0; + vbi->length_elapsed_min = 0; + } - case 0xd: if( vbi->verbose ) fprintf( stderr, "UNDEF start\n" ); break; - case 0xe: if( vbi->verbose ) fprintf( stderr, "UNDEF continue\n" ); break; - } - for( i = 0; i < length; i++ ) { - if( vbi->verbose ) fprintf( stderr, "0x%02x ", packet[ i ] ); - } - if( vbi->verbose ) fprintf( stderr, "\n" ); + if (length > 6) { + if (vbi->verbose) + fprintf (stderr, ".%02d", packet[6] & 63); + vbi->length_elapsed_hour = packet[6] & 63; + snprintf (str, 32, "%02d:%02d.%02d/%02d:%02d", + packet[5] & 63, packet[4] & 63, packet[6] & 63, + packet[3] & 63, packet[2] & 63); + } else { + vbi->length_elapsed_hour = 0; } + /*tvtime_osd_set_show_length( vbi->osd, str ); */ + if (vbi->verbose) + fprintf (stderr, "\n"); + } else if (packet[0] == 0x05 && packet[1] == 0x04) { + if (vbi->verbose) + fprintf (stderr, "Transmission Signal Identifier (TSID): 0x%04x\n", + packet[2] << 24 | packet[3] << 16 | packet[4] << 8 | packet[5]); + } else { + /* unknown */ + + if (vbi->verbose) + fprintf (stderr, "Unknown XDS packet, class "); + switch (packet[0]) { + case 0x1: + if (vbi->verbose) + fprintf (stderr, "CURRENT start\n"); + break; + case 0x2: + if (vbi->verbose) + fprintf (stderr, "CURRENT continue\n"); + break; + + case 0x3: + if (vbi->verbose) + fprintf (stderr, "FUTURE start\n"); + break; + case 0x4: + if (vbi->verbose) + fprintf (stderr, "FUTURE continue\n"); + break; + + case 0x5: + if (vbi->verbose) + fprintf (stderr, "CHANNEL start\n"); + break; + case 0x6: + if (vbi->verbose) + fprintf (stderr, "CHANNEL continue\n"); + break; + + case 0x7: + if (vbi->verbose) + fprintf (stderr, "MISC start\n"); + break; + case 0x8: + if (vbi->verbose) + fprintf (stderr, "MISC continue\n"); + break; + + case 0x9: + if (vbi->verbose) + fprintf (stderr, "PUB start\n"); + break; + case 0xa: + if (vbi->verbose) + fprintf (stderr, "PUB continue\n"); + break; + + case 0xb: + if (vbi->verbose) + fprintf (stderr, "RES start\n"); + break; + case 0xc: + if (vbi->verbose) + fprintf (stderr, "RES continue\n"); + break; + + case 0xd: + if (vbi->verbose) + fprintf (stderr, "UNDEF start\n"); + break; + case 0xe: + if (vbi->verbose) + fprintf (stderr, "UNDEF continue\n"); + break; + } + for (i = 0; i < length; i++) { + if (vbi->verbose) + fprintf (stderr, "0x%02x ", packet[i]); + } + if (vbi->verbose) + fprintf (stderr, "\n"); + } } -static int xds_decode( vbidata_t *vbi, int b1, int b2 ) +static int +xds_decode (vbidata_t * vbi, int b1, int b2) { - if( !vbi ) return 0; - if( vbi->xds_cursor > 2046 ) { - vbi->xds_cursor = 0; - } + if (!vbi) + return 0; + if (vbi->xds_cursor > 2046) { + vbi->xds_cursor = 0; + } - if( !vbi->xds_cursor && b1 > 0xf ) { - return 0; - } + if (!vbi->xds_cursor && b1 > 0xf) { + return 0; + } - if( b1 < 0xf && (b1 & 0x2) ) { - /* ignore the continue and thus 'support' continuation of - a single packet */ - return 1; - } else if( b1 < 0xf ) { - /* kill old packet cause we got a new one */ - vbi->xds_cursor = 0; - } + if (b1 < 0xf && (b1 & 0x2)) { + /* ignore the continue and thus 'support' continuation of + a single packet */ + return 1; + } else if (b1 < 0xf) { + /* kill old packet cause we got a new one */ + vbi->xds_cursor = 0; + } - vbi->xds_packet[ vbi->xds_cursor ] = b1; - vbi->xds_packet[ vbi->xds_cursor + 1 ] = b2; - vbi->xds_cursor += 2; + vbi->xds_packet[vbi->xds_cursor] = b1; + vbi->xds_packet[vbi->xds_cursor + 1] = b2; + vbi->xds_cursor += 2; - if( b1 == 0xf ) { - parse_xds_packet( vbi, vbi->xds_packet, vbi->xds_cursor ); - vbi->xds_cursor = 0; - } + if (b1 == 0xf) { + parse_xds_packet (vbi, vbi->xds_packet, vbi->xds_cursor); + vbi->xds_cursor = 0; + } - return 1; + return 1; } #define NOMODE 0 @@ -473,33 +553,33 @@ static int xds_decode( vbidata_t *vbi, int b1, int b2 ) #define T3 3 #define T4 4 -const unsigned int colours[] = { - 0xFFFFFFFFU, /* white */ - 0xFF00FF00U, /* green */ - 0xFF0000FFU, /* blue */ - 0xFF00C7C7U, /* cyan */ - 0xFFFF0000U, /* red */ - 0xFFFFFF00U, /* yellow */ - 0xFFC700C7U /* magenta */ +const unsigned int colours[] = { + 0xFFFFFFFFU, /* white */ + 0xFF00FF00U, /* green */ + 0xFF0000FFU, /* blue */ + 0xFF00C7C7U, /* cyan */ + 0xFFFF0000U, /* red */ + 0xFFFFFF00U, /* yellow */ + 0xFFC700C7U /* magenta */ }; const int rows[] = { - 11, - 0, /* unused */ - 1, - 2, - 3, - 4, - 12, - 13, - 14, - 15, - 5, - 6, - 7, - 8, - 9, - 10 + 11, + 0, /* unused */ + 1, + 2, + 3, + 4, + 12, + 13, + 14, + 15, + 5, + 6, + 7, + 8, + 9, + 10 }; #define ROLL_2 6 @@ -509,580 +589,610 @@ const int rows[] = { #define PAINT_ON 10 -static int Process16b( vbidata_t *vbi, int bottom, int w1 ) +static int +Process16b (vbidata_t * vbi, int bottom, int w1) { - int b1, b2; + int b1, b2; - b1 = w1 & 0x7f; - b2 = (w1 >> 8) & 0x7f; + b1 = w1 & 0x7f; + b2 = (w1 >> 8) & 0x7f; - if( !b1 && !b2 ) { - return 0; + if (!b1 && !b2) { + return 0; + } + + if (vbi->enabled && b1 >= 0x10 && b1 <= 0x1F && b2 >= 0x20 && b2 <= 0x7F) { + int code; + + if ((b2 & 64)) { + /* Preamble Code */ + /* This sets up colors and indenting */ + + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } + + vbi->current_chan = (b1 & 8) >> 3; + if (!bottom == vbi->wanttop) { + if (vbi->chan != vbi->current_chan) + return 0; + } else + return 0; + + vbi->current_ital = (b2 & 1); + if (!(b2 & 16)) { + vbi->current_colour = colours[(b2 & 30) >> 1]; + vbi->current_indent = 0; + } else { + vbi->current_colour = 0xFFFFFFFFU; /* white */ + vbi->current_indent = 4 * ((b2 & 14) >> 1); + } + vbi->current_row = rows[((b1 & 7) << 1) | ((b2 & 32) >> 5)]; + vbi->current_ul = b2 & 1; + + if (vbi->verbose) + fprintf (stderr, "field: %d chan %d, ital %d, ul %d, colour 0x%x, " + "indent %d, row %d\n", bottom, vbi->current_chan, + vbi->current_ital, vbi->current_ul, vbi->current_colour, + vbi->current_indent, vbi->current_row); + + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + + vbiscreen_new_caption (vbi->vs, vbi->indent, vbi->ital, + vbi->colour, vbi->row); + + } + + vbi->lastcode = (b1 << 8) | b2; + vbi->lastcount = 0; + return 1; } - if( vbi->enabled && - b1 >= 0x10 && b1 <= 0x1F && b2 >= 0x20 && b2 <= 0x7F ) { - int code; - if( (b2 & 64) ) { - /* Preamble Code */ - /* This sets up colors and indenting */ - - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - - vbi->current_chan = (b1 & 8) >> 3; - if( !bottom == vbi->wanttop ) { - if( vbi->chan != vbi->current_chan ) - return 0; - } else return 0; - - vbi->current_ital = (b2 & 1); - if( !(b2 & 16) ) { - vbi->current_colour = colours[ (b2 & 30) >> 1 ]; - vbi->current_indent = 0; - } else { - vbi->current_colour = 0xFFFFFFFFU; /* white */ - vbi->current_indent = 4*( (b2 & 14) >> 1 ); - } - vbi->current_row = rows[ ((b1 & 7) << 1) | ((b2 & 32) >> 5) ]; - vbi->current_ul = b2 & 1; - - if( vbi->verbose ) fprintf( stderr, "field: %d chan %d, ital %d, ul %d, colour 0x%x, " - "indent %d, row %d\n", bottom, vbi->current_chan, - vbi->current_ital, vbi->current_ul, vbi->current_colour, - vbi->current_indent, vbi->current_row ); - - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - - vbiscreen_new_caption( vbi->vs, vbi->indent, vbi->ital, - vbi->colour, vbi->row ); - - } - - vbi->lastcode = ( b1 << 8) | b2; - vbi->lastcount = 0; - return 1; - } - - if( (b1 & 8) == 1 ) { - /* Midrow code */ - if( !vbi->initialised ) return 0; - - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - - if( vbi->verbose ) fprintf( stderr, "Midrow TODO: Add me.\n" ); - - vbi->lastcode = ( b1 << 8) | b2; - return 1; - } - - if( (b1 & 2) && !(b2 & 64) ) { - if( !vbi->initialised ) return 0; - - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - - if( vbi->verbose ) fprintf( stderr, "Tab Offset: %d columns\n", b2 & 3 ); - if( vbi->wanttext && vbi->current_istext && - vbi->current_chan == vbi->chan && !bottom == vbi->wanttop ) { - vbiscreen_tab( vbi->vs, b2 & 3 ); - } - vbi->lastcode = ( b1 << 8) | b2; - return 1; - } - - switch( (code = b2 & 15) ) { - case 0: /* POP-UP */ - case 5: /* ROLL UP 2 */ - case 6: /* ROLL UP 3 */ - case 7: /* ROLL UP 4 */ - case 9: /* PAINT-ON */ - case 10:/* TEXT */ - case 11:/* TEXT */ - vbi->initialised = 1; - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - /* This is the repeated Control Code */ - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - switch( code ) { - case 0: /* POP-UP */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Pop-Up\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, POP_UP ); - } - break; - case 5: /* ROLL UP 2 */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Roll-Up 2 (RU2)\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, ROLL_2 ); - } - break; - case 6: /* ROLL UP 3 */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Roll-Up 3 (RU3)\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, ROLL_3 ); - } - break; - case 7: /* ROLL UP 4 */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Roll-Up 4 (RU4)\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, ROLL_4 ); - } - break; - case 9: /* PAINT-ON */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Paint-On\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, PAINT_ON ); - } - break; - case 10:/* TEXT */ - if( vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Text Restart\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 1; - vbiscreen_set_mode( vbi->vs, 0, 0 ); - } - break; - case 11:/* TEXT */ - if( vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Resume Text Display\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 1; - vbiscreen_set_mode( vbi->vs, 0, 0 ); - } - break; - default: /* impossible */ - break; - } - break; - case 1: - if( !vbi->initialised ) return 0; - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - } - if( !bottom == vbi->wanttop && vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Backspace\n"); - vbiscreen_backspace( vbi->vs ); - } - break; - case 2: - case 3: - if( !vbi->initialised ) return 0; - fprintf( stderr, "Reserved\n"); - break; - case 4: - if( !vbi->initialised ) return 0; - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - } - if( !bottom == vbi->wanttop && vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Delete to End of Row\n"); - vbiscreen_delete_to_end( vbi->vs ); - } - break; - case 8: - if( !vbi->initialised ) return 0; - if( vbi->verbose ) - fprintf( stderr, "Flash On\n"); - break; - case 12: - case 13: - case 14: - case 15: - if( !vbi->initialised ) return 0; - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - - switch( code ) { - case 12: - /* Show buffer 1, Fill buffer 2 */ - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Erase Displayed Memory\n"); - vbiscreen_erase_displayed( vbi->vs ); - } - break; - case 13: - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Carriage Return\n"); - vbiscreen_carriage_return( vbi->vs ); - } - break; - case 14: - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Erase Non-Displayed\n"); - vbiscreen_erase_non_displayed( vbi->vs ); - } - break; - case 15: - /* Show buffer 2, Fill Buffer 1 */ - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "End Of Caption\n"); - vbiscreen_end_of_caption( vbi->vs ); - } - break; - default: /* impossible */ - return 0; - break; - } - break; - default: /* Impossible */ - return 0; - break; - } - - if( vbi->lastcode != ((b1 << 8) | b2) ) { - vbi->lastcount = 0; - } - - vbi->lastcode = (b1 << 8) | b2; - return 1; - } + if ((b1 & 8) == 1) { + /* Midrow code */ + if (!vbi->initialised) + return 0; - if( bottom && xds_decode( vbi, b1, b2 ) ) { - return 1; - } + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } - if( !vbi->enabled ) return 0; + if (vbi->verbose) + fprintf (stderr, "Midrow TODO: Add me.\n"); - vbi->lastcode = 0; - vbi->lastcount = 0; + vbi->lastcode = (b1 << 8) | b2; + return 1; + } - if( !vbi->initialised ) - return 0; + if ((b1 & 2) && !(b2 & 64)) { + if (!vbi->initialised) + return 0; + + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } + + if (vbi->verbose) + fprintf (stderr, "Tab Offset: %d columns\n", b2 & 3); + if (vbi->wanttext && vbi->current_istext && + vbi->current_chan == vbi->chan && !bottom == vbi->wanttop) { + vbiscreen_tab (vbi->vs, b2 & 3); + } + vbi->lastcode = (b1 << 8) | b2; + return 1; + } - if( !bottom != vbi->wanttop || vbi->current_chan != vbi->chan || - vbi->current_istext != vbi->wanttext ) { - return 0; + switch ((code = b2 & 15)) { + case 0: /* POP-UP */ + case 5: /* ROLL UP 2 */ + case 6: /* ROLL UP 3 */ + case 7: /* ROLL UP 4 */ + case 9: /* PAINT-ON */ + case 10: /* TEXT */ + case 11: /* TEXT */ + vbi->initialised = 1; + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + /* This is the repeated Control Code */ + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } + switch (code) { + case 0: /* POP-UP */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Pop-Up\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, POP_UP); + } + break; + case 5: /* ROLL UP 2 */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Roll-Up 2 (RU2)\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, ROLL_2); + } + break; + case 6: /* ROLL UP 3 */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Roll-Up 3 (RU3)\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, ROLL_3); + } + break; + case 7: /* ROLL UP 4 */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Roll-Up 4 (RU4)\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, ROLL_4); + } + break; + case 9: /* PAINT-ON */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Paint-On\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, PAINT_ON); + } + break; + case 10: /* TEXT */ + if (vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Text Restart\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 1; + vbiscreen_set_mode (vbi->vs, 0, 0); + } + break; + case 11: /* TEXT */ + if (vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Resume Text Display\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 1; + vbiscreen_set_mode (vbi->vs, 0, 0); + } + break; + default: /* impossible */ + break; + } + break; + case 1: + if (!vbi->initialised) + return 0; + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + } + if (!bottom == vbi->wanttop && vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Backspace\n"); + vbiscreen_backspace (vbi->vs); + } + break; + case 2: + case 3: + if (!vbi->initialised) + return 0; + fprintf (stderr, "Reserved\n"); + break; + case 4: + if (!vbi->initialised) + return 0; + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + } + if (!bottom == vbi->wanttop && vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Delete to End of Row\n"); + vbiscreen_delete_to_end (vbi->vs); + } + break; + case 8: + if (!vbi->initialised) + return 0; + if (vbi->verbose) + fprintf (stderr, "Flash On\n"); + break; + case 12: + case 13: + case 14: + case 15: + if (!vbi->initialised) + return 0; + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } + + switch (code) { + case 12: + /* Show buffer 1, Fill buffer 2 */ + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Erase Displayed Memory\n"); + vbiscreen_erase_displayed (vbi->vs); + } + break; + case 13: + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Carriage Return\n"); + vbiscreen_carriage_return (vbi->vs); + } + break; + case 14: + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Erase Non-Displayed\n"); + vbiscreen_erase_non_displayed (vbi->vs); + } + break; + case 15: + /* Show buffer 2, Fill Buffer 1 */ + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "End Of Caption\n"); + vbiscreen_end_of_caption (vbi->vs); + } + break; + default: /* impossible */ + return 0; + break; + } + break; + default: /* Impossible */ + return 0; + break; } - if( b1 == 0x11 || b1 == 0x19 || - b1 == 0x12 || b1 == 0x13 || - b1 == 0x1A || b1 == 0x1B ) { - switch( b1 ) { - case 0x1A: - case 0x12: - /* use extcode1 */ - if( b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F ) - if( vbi->verbose ) - fprintf( stderr, "char %d (%c), char %d (%c)\n", b1, - extcode1[b1-32] , b2, extcode1[b2-32] ); - - break; - case 0x13: - case 0x1B: - /* use extcode2 */ - if( b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F ) - if( vbi->verbose ) - fprintf( stderr, "char %d (%c), char %d (%c)\n", b1, - extcode2[b1-32] , b2, extcode2[b2-32] ); - - break; - case 0x11: - case 0x19: - /* use wcode */ - if( b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F ) - if( vbi->verbose ) - fprintf( stderr, "char %d (%c), char %d (%c)\n", b1, - wccode[b1-32] , b2, wccode[b2-32] ); - - break; - default: - break; - } - } else if( b1 ) { - /* use ccode */ - if( b1 < 32 ) b1 = 32; - if( b2 < 32 ) b2 = 32; - if( vbi->verbose ) - fprintf( stderr, "vbidata: data: %c %c\n", ccode[b1-32], - ccode[b2-32] ); - vbiscreen_print( vbi->vs, ccode[b1-32], ccode[b2-32] ); + if (vbi->lastcode != ((b1 << 8) | b2)) { + vbi->lastcount = 0; } + vbi->lastcode = (b1 << 8) | b2; + return 1; + } + if (bottom && xds_decode (vbi, b1, b2)) { return 1; + } + + if (!vbi->enabled) + return 0; + + vbi->lastcode = 0; + vbi->lastcount = 0; + + if (!vbi->initialised) + return 0; + + if (!bottom != vbi->wanttop || vbi->current_chan != vbi->chan || + vbi->current_istext != vbi->wanttext) { + return 0; + } + + if (b1 == 0x11 || b1 == 0x19 || + b1 == 0x12 || b1 == 0x13 || b1 == 0x1A || b1 == 0x1B) { + switch (b1) { + case 0x1A: + case 0x12: + /* use extcode1 */ + if (b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F) + if (vbi->verbose) + fprintf (stderr, "char %d (%c), char %d (%c)\n", b1, + extcode1[b1 - 32], b2, extcode1[b2 - 32]); + + break; + case 0x13: + case 0x1B: + /* use extcode2 */ + if (b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F) + if (vbi->verbose) + fprintf (stderr, "char %d (%c), char %d (%c)\n", b1, + extcode2[b1 - 32], b2, extcode2[b2 - 32]); + + break; + case 0x11: + case 0x19: + /* use wcode */ + if (b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F) + if (vbi->verbose) + fprintf (stderr, "char %d (%c), char %d (%c)\n", b1, + wccode[b1 - 32], b2, wccode[b2 - 32]); + + break; + default: + break; + } + } else if (b1) { + /* use ccode */ + if (b1 < 32) + b1 = 32; + if (b2 < 32) + b2 = 32; + if (vbi->verbose) + fprintf (stderr, "vbidata: data: %c %c\n", ccode[b1 - 32], + ccode[b2 - 32]); + vbiscreen_print (vbi->vs, ccode[b1 - 32], ccode[b2 - 32]); + } + + + return 1; } /* Process16b */ -int ProcessLine( vbidata_t *vbi, unsigned char *s, int bottom ) +int +ProcessLine (vbidata_t * vbi, unsigned char *s, int bottom) { - int w1; - /*char *outbuf = NULL;*/ + int w1; - if( !vbi ) return 0; + /*char *outbuf = NULL; */ - w1 = ccdecode(s); + if (!vbi) + return 0; - return Process16b(vbi, bottom, w1); + w1 = ccdecode (s); + + return Process16b (vbi, bottom, w1); } /* ProcessLine */ -vbidata_t *vbidata_new_file( const char *filename, vbiscreen_t *vs, - /*tvtime_osd_t* osd,*/ int verbose ) +vbidata_t * +vbidata_new_file (const char *filename, vbiscreen_t * vs, + /*tvtime_osd_t* osd, */ int verbose) { - vbidata_t *vbi = (vbidata_t *) malloc( sizeof( vbidata_t ) ); - if( !vbi ) { - return 0; - } + vbidata_t *vbi = (vbidata_t *) malloc (sizeof (vbidata_t)); - vbi->fd = open( filename, O_RDONLY ); - if( vbi->fd < 0 ) { - fprintf( stderr, "vbidata: Can't open %s: %s\n", - filename, strerror( errno ) ); - free( vbi ); - return 0; - } + if (!vbi) { + return 0; + } + + vbi->fd = open (filename, O_RDONLY); + if (vbi->fd < 0) { + fprintf (stderr, "vbidata: Can't open %s: %s\n", + filename, strerror (errno)); + free (vbi); + return 0; + } - vbi->vs = vs; - /*vbi->osd = osd;*/ - vbi->verbose = verbose; + vbi->vs = vs; + /*vbi->osd = osd; */ + vbi->verbose = verbose; - vbidata_reset( vbi ); + vbidata_reset (vbi); - return vbi; + return vbi; } -vbidata_t *vbidata_new_line( vbiscreen_t *vs, int verbose ) +vbidata_t * +vbidata_new_line (vbiscreen_t * vs, int verbose) { - vbidata_t *vbi = (vbidata_t *) malloc( sizeof( vbidata_t ) ); - if( !vbi ) { - return 0; - } + vbidata_t *vbi = (vbidata_t *) malloc (sizeof (vbidata_t)); + + if (!vbi) { + return 0; + } - vbi->vs = vs; - /*vbi->osd = osd;*/ - vbi->verbose = verbose; + vbi->vs = vs; + /*vbi->osd = osd; */ + vbi->verbose = verbose; - vbidata_reset( vbi ); + vbidata_reset (vbi); - return vbi; + return vbi; } -void vbidata_delete( vbidata_t *vbi ) +void +vbidata_delete (vbidata_t * vbi) { - if( !vbi ) return; - if( vbi->fd != 0 ) { - close( vbi->fd ); - } - free( vbi ); + if (!vbi) + return; + if (vbi->fd != 0) { + close (vbi->fd); + } + free (vbi); } -void vbidata_reset( vbidata_t *vbi ) +void +vbidata_reset (vbidata_t * vbi) { - if( !vbi ) return; - - vbi->wanttop = 0; - vbi->wanttext = 0; - vbi->colour = 0xFFFFFFFFU; - vbi->row = 0; - - vbi->ital = 0; - vbi->indent = 0; - vbi->ul=0; - - vbi->chan=0; - - vbi->initialised = 0; - vbi->enabled = 0; - - memset(vbi->program_desc, 0, 8*sizeof(char*) ); - vbi->program_name = NULL; - vbi->network_name = NULL; - vbi->call_letters = NULL; - vbi->rating = NULL; - vbi->program_type = NULL; - - vbi->start_day = 0; - vbi->start_month = 0; - vbi->start_min = 0; - vbi->start_hour = 0; - vbi->length_hour = 0; - vbi->length_min = 0; - vbi->length_elapsed_hour = 0; - vbi->length_elapsed_min = 0; - vbi->length_elapsed_sec = 0; - - /* - tvtime_osd_set_network_call( vbi->osd, "" ); - tvtime_osd_set_network_name( vbi->osd, "" ); - tvtime_osd_set_show_name( vbi->osd, "" ); - tvtime_osd_set_show_rating( vbi->osd, "" ); - tvtime_osd_set_show_start( vbi->osd, "" ); - tvtime_osd_set_show_length( vbi->osd, "" ); - */ - - - - vbi->lastcode = 0; - vbi->lastcount = 0; - vbi->xds_packet[ 0 ] = 0; - vbi->xds_cursor = 0; - vbiscreen_reset( vbi->vs ); + if (!vbi) + return; + + vbi->wanttop = 0; + vbi->wanttext = 0; + vbi->colour = 0xFFFFFFFFU; + vbi->row = 0; + + vbi->ital = 0; + vbi->indent = 0; + vbi->ul = 0; + + vbi->chan = 0; + + vbi->initialised = 0; + vbi->enabled = 0; + + memset (vbi->program_desc, 0, 8 * sizeof (char *)); + vbi->program_name = NULL; + vbi->network_name = NULL; + vbi->call_letters = NULL; + vbi->rating = NULL; + vbi->program_type = NULL; + + vbi->start_day = 0; + vbi->start_month = 0; + vbi->start_min = 0; + vbi->start_hour = 0; + vbi->length_hour = 0; + vbi->length_min = 0; + vbi->length_elapsed_hour = 0; + vbi->length_elapsed_min = 0; + vbi->length_elapsed_sec = 0; + + /* + tvtime_osd_set_network_call( vbi->osd, "" ); + tvtime_osd_set_network_name( vbi->osd, "" ); + tvtime_osd_set_show_name( vbi->osd, "" ); + tvtime_osd_set_show_rating( vbi->osd, "" ); + tvtime_osd_set_show_start( vbi->osd, "" ); + tvtime_osd_set_show_length( vbi->osd, "" ); + */ + + + + vbi->lastcode = 0; + vbi->lastcount = 0; + vbi->xds_packet[0] = 0; + vbi->xds_cursor = 0; + vbiscreen_reset (vbi->vs); } -void vbidata_set_verbose( vbidata_t *vbi, int verbose ) +void +vbidata_set_verbose (vbidata_t * vbi, int verbose) { - vbi->verbose = verbose; + vbi->verbose = verbose; } -void vbidata_capture_mode( vbidata_t *vbi, int mode ) +void +vbidata_capture_mode (vbidata_t * vbi, int mode) { - if( !vbi ) return; - switch( mode ) { + if (!vbi) + return; + switch (mode) { case CAPTURE_OFF: - vbi->enabled = 0; - break; + vbi->enabled = 0; + break; case CAPTURE_CC1: - vbi->wanttop = 1; - vbi->wanttext = 0; - vbi->chan = 0; - vbi->enabled = 1; - break; + vbi->wanttop = 1; + vbi->wanttext = 0; + vbi->chan = 0; + vbi->enabled = 1; + break; case CAPTURE_CC2: - vbi->wanttop = 1; - vbi->wanttext = 0; - vbi->chan = 1; - vbi->enabled = 1; - break; + vbi->wanttop = 1; + vbi->wanttext = 0; + vbi->chan = 1; + vbi->enabled = 1; + break; case CAPTURE_CC3: - vbi->wanttop = 0; - vbi->wanttext = 0; - vbi->chan = 0; - vbi->enabled = 1; - break; + vbi->wanttop = 0; + vbi->wanttext = 0; + vbi->chan = 0; + vbi->enabled = 1; + break; case CAPTURE_CC4: - vbi->wanttop = 0; - vbi->wanttext = 0; - vbi->chan = 1; - vbi->enabled = 1; - break; + vbi->wanttop = 0; + vbi->wanttext = 0; + vbi->chan = 1; + vbi->enabled = 1; + break; case CAPTURE_T1: - vbi->wanttop = 1; - vbi->wanttext = 1; - vbi->chan = 0; - vbi->enabled = 1; - break; + vbi->wanttop = 1; + vbi->wanttext = 1; + vbi->chan = 0; + vbi->enabled = 1; + break; case CAPTURE_T2: - vbi->wanttop = 1; - vbi->wanttext = 1; - vbi->chan = 1; - vbi->enabled = 1; - break; + vbi->wanttop = 1; + vbi->wanttext = 1; + vbi->chan = 1; + vbi->enabled = 1; + break; case CAPTURE_T3: - vbi->wanttop = 0; - vbi->wanttext = 1; - vbi->chan = 0; - vbi->enabled = 1; - break; + vbi->wanttop = 0; + vbi->wanttext = 1; + vbi->chan = 0; + vbi->enabled = 1; + break; case CAPTURE_T4: - vbi->wanttop = 0; - vbi->wanttext = 1; - vbi->chan = 1; - vbi->enabled = 1; - break; + vbi->wanttop = 0; + vbi->wanttext = 1; + vbi->chan = 1; + vbi->enabled = 1; + break; default: - vbi->enabled = 0; - break; - } + vbi->enabled = 0; + break; + } } -void vbidata_process_frame( vbidata_t *vbi, int printdebug ) +void +vbidata_process_frame (vbidata_t * vbi, int printdebug) { - if( read( vbi->fd, vbi->buf, 65536 ) < 65536 ) { - fprintf( stderr, "error, can't read vbi data.\n" ); - return; - } + if (read (vbi->fd, vbi->buf, 65536) < 65536) { + fprintf (stderr, "error, can't read vbi data.\n"); + return; + } - ProcessLine( vbi, &vbi->buf[ DO_LINE*2048 ], 0 ); - ProcessLine( vbi, &vbi->buf[ (16+DO_LINE)*2048 ], 1 ); + ProcessLine (vbi, &vbi->buf[DO_LINE * 2048], 0); + ProcessLine (vbi, &vbi->buf[(16 + DO_LINE) * 2048], 1); } -void vbidata_process_line( vbidata_t *vbi, unsigned char *s, int bottom) +void +vbidata_process_line (vbidata_t * vbi, unsigned char *s, int bottom) { - ProcessLine( vbi, s, bottom ); + ProcessLine (vbi, s, bottom); } -void vbidata_process_16b( vbidata_t *vbi, int bottom, int w) +void +vbidata_process_16b (vbidata_t * vbi, int bottom, int w) { - Process16b( vbi, bottom, w ); + Process16b (vbi, bottom, w); } - diff --git a/gst/vbidec/vbidata.h b/gst/vbidec/vbidata.h index 66b2cc3c..78d902af 100644 --- a/gst/vbidec/vbidata.h +++ b/gst/vbidec/vbidata.h @@ -44,16 +44,16 @@ typedef struct vbidata_s vbidata_t; #define CAPTURE_T3 8 #define CAPTURE_T4 9 -vbidata_t *vbidata_new_file( const char *filename, vbiscreen_t *vs, - /*tvtime_osd_t* osd,*/ int verbose ); -vbidata_t *vbidata_new_line( vbiscreen_t *vs, int verbose ); +vbidata_t *vbidata_new_file (const char *filename, vbiscreen_t * vs, + /*tvtime_osd_t* osd, */ int verbose); +vbidata_t *vbidata_new_line (vbiscreen_t * vs, int verbose); -void vbidata_delete( vbidata_t *vbi ); -void vbidata_reset( vbidata_t *vbi ); -void vbidata_set_verbose( vbidata_t *vbi, int verbose ); -void vbidata_capture_mode( vbidata_t *vbi, int mode ); -void vbidata_process_frame( vbidata_t *vbi, int printdebug ); -void vbidata_process_line( vbidata_t *vbi, unsigned char *s, int bottom ); -void vbidata_process_16b( vbidata_t *vbi, int bottom, int w ); +void vbidata_delete (vbidata_t * vbi); +void vbidata_reset (vbidata_t * vbi); +void vbidata_set_verbose (vbidata_t * vbi, int verbose); +void vbidata_capture_mode (vbidata_t * vbi, int mode); +void vbidata_process_frame (vbidata_t * vbi, int printdebug); +void vbidata_process_line (vbidata_t * vbi, unsigned char *s, int bottom); +void vbidata_process_16b (vbidata_t * vbi, int bottom, int w); #endif /* VBIDATA_H_INCLUDED */ diff --git a/gst/vbidec/vbiscreen.c b/gst/vbidec/vbiscreen.c index bcce79e2..f441ba78 100644 --- a/gst/vbidec/vbiscreen.c +++ b/gst/vbidec/vbiscreen.c @@ -50,7 +50,8 @@ #define FONT_SIZE 20 typedef struct osd_string_s osd_string_t; -struct osd_string_s { +struct osd_string_s +{ int width; int height; int r, g, b; @@ -58,684 +59,765 @@ struct osd_string_s { GstVBIDec *vbidec; }; -osd_string_t *osd_string_new(char *c, int s, int w, int h, int a, void *user_data) { +osd_string_t * +osd_string_new (char *c, int s, int w, int h, int a, void *user_data) +{ osd_string_t *os; - os = (osd_string_t *)malloc(sizeof(osd_string_t)); + + os = (osd_string_t *) malloc (sizeof (osd_string_t)); if (!os) return NULL; os->width = 0; os->height = 0; os->r = os->g = os->b = 0; os->visible = 1; - os->vbidec = (GstVBIDec *)user_data; + os->vbidec = (GstVBIDec *) user_data; return os; } -void osd_string_show_text(osd_string_t *os, char *s, int len ) { + +void +osd_string_show_text (osd_string_t * os, char *s, int len) +{ /* FIXME: just print data when it gets here */ if (len > 0) { - gst_vbidec_show_text(os->vbidec, s, len); + gst_vbidec_show_text (os->vbidec, s, len); } } -int osd_string_get_height(osd_string_t *os) { +int +osd_string_get_height (osd_string_t * os) +{ return os->height; } -int osd_string_get_width(osd_string_t *os) { + +int +osd_string_get_width (osd_string_t * os) +{ return os->width; } -void osd_string_delete(osd_string_t *os) { - free(os); + +void +osd_string_delete (osd_string_t * os) +{ + free (os); } -void osd_string_set_colour_rgb(osd_string_t *os, int r, int g, int b) { + +void +osd_string_set_colour_rgb (osd_string_t * os, int r, int g, int b) +{ os->r = r; os->g = g; os->b = b; } -void blit_colour_packed422_scanline( unsigned char *d, int w, int luma, int cb, int cr) { + +void +blit_colour_packed422_scanline (unsigned char *d, int w, int luma, int cb, + int cr) +{ } -int osd_string_visible(osd_string_t *os) { +int +osd_string_visible (osd_string_t * os) +{ return os->visible; } -void osd_string_composite_packed422_scanline(osd_string_t *os, unsigned char *a, unsigned char *b, int w, int x, int y) { + +void +osd_string_composite_packed422_scanline (osd_string_t * os, unsigned char *a, + unsigned char *b, int w, int x, int y) +{ } -struct vbiscreen_s { +struct vbiscreen_s +{ + + osd_string_t *line[ROWS]; - osd_string_t *line[ ROWS ]; + char buffers[ROWS * COLS * 2]; + char text[2 * ROWS * COLS]; + char hiddenbuf[COLS]; + char paintbuf[ROWS * COLS]; - char buffers[ ROWS * COLS * 2 ]; - char text[ 2 * ROWS * COLS ]; - char hiddenbuf[ COLS ]; - char paintbuf[ ROWS * COLS ]; + unsigned int fgcolour; + unsigned int bgcolour; + int bg_luma, bg_cb, bg_cr; - unsigned int fgcolour; - unsigned int bgcolour; - int bg_luma, bg_cb, bg_cr; + int frame_width; + int frame_height; + int frame_aspect; - int frame_width; - int frame_height; - int frame_aspect; + int x, y; /* where to draw console */ + int width, height; /* the size box we have to draw in */ + int rowheight, charwidth; - int x, y; /* where to draw console */ - int width, height; /* the size box we have to draw in */ - int rowheight, charwidth; - - int curx, cury; /* cursor position */ - int rows, cols; /* 32 cols 15 rows */ - int captions, style; /* CC (1) or Text (0), RU2 RU3 RU4 POP_UP PAINT_ON */ - int first_line; /* where to start drawing */ - int curbuffer; - int top_of_screen; /* a pointer into line[] */ - int indent; - int got_eoc; - int scroll; + int curx, cury; /* cursor position */ + int rows, cols; /* 32 cols 15 rows */ + int captions, style; /* CC (1) or Text (0), RU2 RU3 RU4 POP_UP PAINT_ON */ + int first_line; /* where to start drawing */ + int curbuffer; + int top_of_screen; /* a pointer into line[] */ + int indent; + int got_eoc; + int scroll; - char *fontfile; - int fontsize; - int verbose; + char *fontfile; + int fontsize; + int verbose; - void *user_data; + void *user_data; }; -vbiscreen_t *vbiscreen_new( int video_width, int video_height, - double video_aspect, int verbose, void *user_data ) +vbiscreen_t * +vbiscreen_new (int video_width, int video_height, + double video_aspect, int verbose, void *user_data) { - int i=0, fontsize = FONT_SIZE; - vbiscreen_t *vs = (vbiscreen_t *)malloc(sizeof(struct vbiscreen_s)); + int i = 0, fontsize = FONT_SIZE; + vbiscreen_t *vs = (vbiscreen_t *) malloc (sizeof (struct vbiscreen_s)); - if( !vs ) { - return NULL; - } + if (!vs) { + return NULL; + } - vs->verbose = verbose; - vs->x = 0; - vs->y = 0; - vs->frame_width = video_width; - vs->frame_height = video_height; - vs->frame_aspect = video_aspect; - vs->curx = 0; - vs->cury = 0; - vs->fgcolour = 0xFFFFFFFFU; /* white */ - vs->bgcolour = 0xFF000000U; /* black */ - vs->bg_luma = 16; - vs->bg_cb = 128; - vs->bg_cr = 128; - vs->rows = ROWS; - vs->cols = COLS; - /*vs->fontfile = DATADIR "/FreeMonoBold.ttf";*/ - vs->fontfile = NULL; - vs->fontsize = fontsize; - vs->width = video_width; - vs->height = video_height; - vs->first_line = 0; - vs->captions = 0; - vs->style = 0; - vs->curbuffer = 0; - vs->top_of_screen = 0; - vs->indent = 0; - memset( vs->buffers, 0, 2 * COLS * ROWS ); - memset( vs->hiddenbuf, 0, COLS ); - memset( vs->paintbuf, 0, ROWS * COLS ); - vs->scroll = 0; - - vs->user_data = user_data; - - vs->line[0] = osd_string_new( vs->fontfile, fontsize, video_width, - video_height, - video_aspect, - user_data); - - if( !vs->line[0] ) { - vs->fontfile = "./FreeMonoBold.ttf"; - - vs->line[0] = osd_string_new( vs->fontfile, fontsize, - video_width, - video_height, - video_aspect, - user_data); - } + vs->verbose = verbose; + vs->x = 0; + vs->y = 0; + vs->frame_width = video_width; + vs->frame_height = video_height; + vs->frame_aspect = video_aspect; + vs->curx = 0; + vs->cury = 0; + vs->fgcolour = 0xFFFFFFFFU; /* white */ + vs->bgcolour = 0xFF000000U; /* black */ + vs->bg_luma = 16; + vs->bg_cb = 128; + vs->bg_cr = 128; + vs->rows = ROWS; + vs->cols = COLS; + /*vs->fontfile = DATADIR "/FreeMonoBold.ttf"; */ + vs->fontfile = NULL; + vs->fontsize = fontsize; + vs->width = video_width; + vs->height = video_height; + vs->first_line = 0; + vs->captions = 0; + vs->style = 0; + vs->curbuffer = 0; + vs->top_of_screen = 0; + vs->indent = 0; + memset (vs->buffers, 0, 2 * COLS * ROWS); + memset (vs->hiddenbuf, 0, COLS); + memset (vs->paintbuf, 0, ROWS * COLS); + vs->scroll = 0; + + vs->user_data = user_data; + + vs->line[0] = osd_string_new (vs->fontfile, fontsize, video_width, + video_height, video_aspect, user_data); + + if (!vs->line[0]) { + vs->fontfile = "./FreeMonoBold.ttf"; + + vs->line[0] = osd_string_new (vs->fontfile, fontsize, + video_width, video_height, video_aspect, user_data); + } - if( !vs->line[0] ) { - fprintf( stderr, "vbiscreen: Could not find my font (%s)!\n", - vs->fontfile ); - vbiscreen_delete( vs ); - return NULL; - } + if (!vs->line[0]) { + fprintf (stderr, "vbiscreen: Could not find my font (%s)!\n", vs->fontfile); + vbiscreen_delete (vs); + return NULL; + } - osd_string_show_text( vs->line[ 0 ], "W", 0 ); - vs->rowheight = osd_string_get_height( vs->line[ 0 ] ); - vs->charwidth = osd_string_get_width( vs->line[ 0 ] ); - osd_string_delete( vs->line[ 0 ] ); - - for( i = 0; i < ROWS; i++ ) { - vs->line[ i ] = osd_string_new( vs->fontfile, fontsize, - video_width, video_height, - video_aspect, - user_data); - if( !vs->line[ i ] ) { - fprintf( stderr, "vbiscreen: Could not allocate a line.\n" ); - vbiscreen_delete( vs ); - return NULL; - } - osd_string_set_colour_rgb( vs->line[ i ], - (vs->fgcolour & 0xff0000) >> 16, - (vs->fgcolour & 0xff00) >> 8, - (vs->fgcolour & 0xff) ); - osd_string_show_text( vs->line[ i ], " ", 0 ); + osd_string_show_text (vs->line[0], "W", 0); + vs->rowheight = osd_string_get_height (vs->line[0]); + vs->charwidth = osd_string_get_width (vs->line[0]); + osd_string_delete (vs->line[0]); + + for (i = 0; i < ROWS; i++) { + vs->line[i] = osd_string_new (vs->fontfile, fontsize, + video_width, video_height, video_aspect, user_data); + if (!vs->line[i]) { + fprintf (stderr, "vbiscreen: Could not allocate a line.\n"); + vbiscreen_delete (vs); + return NULL; } - memset( vs->text, 0, 2 * ROWS * COLS ); - return vs; + osd_string_set_colour_rgb (vs->line[i], + (vs->fgcolour & 0xff0000) >> 16, + (vs->fgcolour & 0xff00) >> 8, (vs->fgcolour & 0xff)); + osd_string_show_text (vs->line[i], " ", 0); + } + memset (vs->text, 0, 2 * ROWS * COLS); + return vs; } -void blank_screen( vbiscreen_t *vs ) +void +blank_screen (vbiscreen_t * vs) { - int i; + int i; - if( vs->verbose ) fprintf( stderr, "in blank\n"); - for( i = 0; i < ROWS; i++ ) { - osd_string_show_text( vs->line[ i ], " ", 0 ); - } + if (vs->verbose) + fprintf (stderr, "in blank\n"); + for (i = 0; i < ROWS; i++) { + osd_string_show_text (vs->line[i], " ", 0); + } } -void clear_screen( vbiscreen_t *vs ) +void +clear_screen (vbiscreen_t * vs) { - int base, i; - if( !vs ) return; + int base, i; - base = vs->top_of_screen * COLS; - for( i = 0; i < ROWS * COLS; i++ ) { - vs->text[ base ] = 0; - base++; - base %= 2 * ROWS * COLS; - } - blank_screen( vs ); + if (!vs) + return; + + base = vs->top_of_screen * COLS; + for (i = 0; i < ROWS * COLS; i++) { + vs->text[base] = 0; + base++; + base %= 2 * ROWS * COLS; + } + blank_screen (vs); } -void clear_hidden_roll( vbiscreen_t *vs ) +void +clear_hidden_roll (vbiscreen_t * vs) { - if( !vs ) return; - memset( vs->hiddenbuf, 0, COLS ); + if (!vs) + return; + memset (vs->hiddenbuf, 0, COLS); } -void clear_hidden_pop( vbiscreen_t *vs ) +void +clear_hidden_pop (vbiscreen_t * vs) { - if( !vs ) return; - memset( vs->buffers + vs->curbuffer * COLS * ROWS , 0, COLS * ROWS ); + if (!vs) + return; + memset (vs->buffers + vs->curbuffer * COLS * ROWS, 0, COLS * ROWS); } -void clear_hidden_paint( vbiscreen_t *vs ) +void +clear_hidden_paint (vbiscreen_t * vs) { - if( !vs ) return; - memset( vs->paintbuf , 0, COLS * ROWS ); + if (!vs) + return; + memset (vs->paintbuf, 0, COLS * ROWS); } -void clear_displayed_pop( vbiscreen_t *vs ) +void +clear_displayed_pop (vbiscreen_t * vs) { - if( !vs ) return; - memset( vs->buffers + ( vs->curbuffer ^ 1 ) * COLS * ROWS , 0, COLS * ROWS ); + if (!vs) + return; + memset (vs->buffers + (vs->curbuffer ^ 1) * COLS * ROWS, 0, COLS * ROWS); } -void vbiscreen_dump_screen_text( vbiscreen_t *vs ) +void +vbiscreen_dump_screen_text (vbiscreen_t * vs) { - int i, offset; - - if( !vs ) return; - offset = vs->top_of_screen * COLS; - - fprintf( stderr, "\n 0123456789abcdefghij012345678901" ); - for( i = 0; i < ROWS * COLS; i++ ) { - if( !(i % COLS) ) - fprintf( stderr, "\n%.2d ", i / COLS ); - fprintf( stderr, "%c", vs->text[ offset ] ? vs->text[ offset ] : ' ' ); - offset++; - offset %= 2 * ROWS * COLS; - } - fprintf( stderr, "\n 0123456789abcdefghij012345678901\n " ); - for( i = 0; i < COLS; i++ ) { - fprintf( stderr, "%c", vs->text[ offset ] ? vs->text[ offset ] : ' ' ); - offset++; - offset %= 2 * ROWS * COLS; - } - fprintf( stderr, "\n 0123456789abcdefghij012345678901\n" ); + int i, offset; + + if (!vs) + return; + offset = vs->top_of_screen * COLS; + + fprintf (stderr, "\n 0123456789abcdefghij012345678901"); + for (i = 0; i < ROWS * COLS; i++) { + if (!(i % COLS)) + fprintf (stderr, "\n%.2d ", i / COLS); + fprintf (stderr, "%c", vs->text[offset] ? vs->text[offset] : ' '); + offset++; + offset %= 2 * ROWS * COLS; + } + fprintf (stderr, "\n 0123456789abcdefghij012345678901\n "); + for (i = 0; i < COLS; i++) { + fprintf (stderr, "%c", vs->text[offset] ? vs->text[offset] : ' '); + offset++; + offset %= 2 * ROWS * COLS; + } + fprintf (stderr, "\n 0123456789abcdefghij012345678901\n"); } -int update_row_x( vbiscreen_t *vs, int row ) +int +update_row_x (vbiscreen_t * vs, int row) { - char text[ COLS + 1 ]; - int i, j, haschars = 0, base; - - if( !vs ) return 0; - - text[ COLS ] = 0; - base = ( ( vs->top_of_screen + row ) % ( 2 * ROWS ) ) * COLS; - for( j = 0, i = base; i < base + COLS; i++, j++ ) { - if( vs->text[ i ] ) { - text[ j ] = vs->text[ i ]; - haschars = 1; - } else { - text[ j ] = ' '; - } + char text[COLS + 1]; + int i, j, haschars = 0, base; + + if (!vs) + return 0; + + text[COLS] = 0; + base = ((vs->top_of_screen + row) % (2 * ROWS)) * COLS; + for (j = 0, i = base; i < base + COLS; i++, j++) { + if (vs->text[i]) { + text[j] = vs->text[i]; + haschars = 1; + } else { + text[j] = ' '; } + } - osd_string_set_colour_rgb( vs->line[ row ], - ( vs->fgcolour & 0xff0000 ) >> 16, - ( vs->fgcolour & 0xff00 ) >> 8, - ( vs->fgcolour & 0xff ) ); - if( !haschars ) - osd_string_show_text( vs->line[ row ], " ", 0 ); - else - osd_string_show_text( vs->line[ row ], text, 51 ); + osd_string_set_colour_rgb (vs->line[row], + (vs->fgcolour & 0xff0000) >> 16, + (vs->fgcolour & 0xff00) >> 8, (vs->fgcolour & 0xff)); + if (!haschars) + osd_string_show_text (vs->line[row], " ", 0); + else + osd_string_show_text (vs->line[row], text, 51); - return haschars; + return haschars; } -void update_row( vbiscreen_t *vs ) +void +update_row (vbiscreen_t * vs) { - if( !vs ) return; + if (!vs) + return; - update_row_x( vs, vs->cury ); - //vbiscreen_dump_screen_text( vs ); + update_row_x (vs, vs->cury); + //vbiscreen_dump_screen_text( vs ); } -void update_all_rows( vbiscreen_t *vs ) +void +update_all_rows (vbiscreen_t * vs) { - int row = 0; + int row = 0; - if( !vs ) return; + if (!vs) + return; - for( row = 0; row < ROWS; row++ ) { - update_row_x( vs, row ); - } - //vbiscreen_dump_screen_text( vs ); + for (row = 0; row < ROWS; row++) { + update_row_x (vs, row); + } + //vbiscreen_dump_screen_text( vs ); } -void vbiscreen_delete( vbiscreen_t *vs ) +void +vbiscreen_delete (vbiscreen_t * vs) { - free( vs ); + free (vs); } -void copy_row_to_screen( vbiscreen_t *vs, char *row ) +void +copy_row_to_screen (vbiscreen_t * vs, char *row) { - int base, i, j; + int base, i, j; - base = ( ( vs->top_of_screen + vs->cury ) % ( 2 * ROWS ) ) * COLS; - for( j = 0, i = base; - i < base + COLS; - j++, i++ ) { - vs->text[ i ] = row[ j ]; - } - update_row( vs ); + base = ((vs->top_of_screen + vs->cury) % (2 * ROWS)) * COLS; + for (j = 0, i = base; i < base + COLS; j++, i++) { + vs->text[i] = row[j]; + } + update_row (vs); } -void scroll_screen( vbiscreen_t *vs ) +void +scroll_screen (vbiscreen_t * vs) { - int start_row; + int start_row; - if( !vs || !vs->captions || !vs->style || vs->style > ROLL_4 ) - return; - - start_row = ( vs->first_line + vs->top_of_screen ) % ( 2 * ROWS ); - if( vs->verbose ) - fprintf ( stderr, "start row : %d first line %d\n ", start_row, - vs->first_line ); + if (!vs || !vs->captions || !vs->style || vs->style > ROLL_4) + return; - /* zero out top row */ - memset( (char *)( vs->text + start_row * COLS ), 0, COLS ); - vs->top_of_screen = ( vs->top_of_screen + 1 ) % ( 2 * ROWS ); - vs->curx = vs->indent; - update_all_rows( vs ); - copy_row_to_screen( vs, vs->hiddenbuf ); - clear_hidden_roll( vs ); - vs->scroll = 26; + start_row = (vs->first_line + vs->top_of_screen) % (2 * ROWS); + if (vs->verbose) + fprintf (stderr, "start row : %d first line %d\n ", start_row, + vs->first_line); + + /* zero out top row */ + memset ((char *) (vs->text + start_row * COLS), 0, COLS); + vs->top_of_screen = (vs->top_of_screen + 1) % (2 * ROWS); + vs->curx = vs->indent; + update_all_rows (vs); + copy_row_to_screen (vs, vs->hiddenbuf); + clear_hidden_roll (vs); + vs->scroll = 26; } -void vbiscreen_set_verbose( vbiscreen_t *vs, int verbose ) +void +vbiscreen_set_verbose (vbiscreen_t * vs, int verbose) { - vs->verbose = verbose; + vs->verbose = verbose; } -void vbiscreen_new_caption( vbiscreen_t *vs, int indent, int ital, - unsigned int colour, int row ) +void +vbiscreen_new_caption (vbiscreen_t * vs, int indent, int ital, + unsigned int colour, int row) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "indent: %d, ital: %d, colour: 0x%x, row: %d\n", indent, ital, colour, row ); - - if( 0 && vs->captions && vs->style <= ROLL_4 && vs->style ) { - if( row != vs->cury+1 ) { - vs->cury = row - 1; - clear_hidden_roll( vs ); - } else { + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "indent: %d, ital: %d, colour: 0x%x, row: %d\n", indent, + ital, colour, row); + + if (0 && vs->captions && vs->style <= ROLL_4 && vs->style) { + if (row != vs->cury + 1) { + vs->cury = row - 1; + clear_hidden_roll (vs); + } else { // scroll_screen( vs ); - } } + } - if( vs->style > ROLL_4 ) { - vs->cury = ( ( row > 0 ) ? row - 1 : 0 ); - } + if (vs->style > ROLL_4) { + vs->cury = ((row > 0) ? row - 1 : 0); + } - vs->fgcolour = colour; - vs->indent = indent; - vs->curx = indent; -} - -void vbiscreen_set_mode( vbiscreen_t *vs, int caption, int style ) -{ - if( !vs ) return; - if( vs->verbose ) - fprintf( stderr, "in set mode\n"); - - if( vs->verbose ) { - fprintf( stderr, "Caption: %d ", caption ); - switch( style ) { - case ROLL_2: - fprintf( stderr, "ROLL 2\n"); - break; - case ROLL_3: - fprintf( stderr, "ROLL 3\n" ); - break; - case ROLL_4: - fprintf( stderr, "ROLL 4\n" ); - break; - case POP_UP: - fprintf( stderr, "POP UP\n" ); - break; - case PAINT_ON: - fprintf( stderr, "PAINT ON\n" ); - break; - default: - break; - } + vs->fgcolour = colour; + vs->indent = indent; + vs->curx = indent; +} + +void +vbiscreen_set_mode (vbiscreen_t * vs, int caption, int style) +{ + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in set mode\n"); + + if (vs->verbose) { + fprintf (stderr, "Caption: %d ", caption); + switch (style) { + case ROLL_2: + fprintf (stderr, "ROLL 2\n"); + break; + case ROLL_3: + fprintf (stderr, "ROLL 3\n"); + break; + case ROLL_4: + fprintf (stderr, "ROLL 4\n"); + break; + case POP_UP: + fprintf (stderr, "POP UP\n"); + break; + case PAINT_ON: + fprintf (stderr, "PAINT ON\n"); + break; + default: + break; } - if( !caption ) { - /* text mode */ - vs->cury = 0; - } else { - /* captioning mode */ - /* styles: ru2 ru3 ru4 pop paint - */ - if( style != POP_UP && vs->style == POP_UP && !vs->got_eoc ) { - /* stupid that sometimes they dont send a EOC */ - vbiscreen_end_of_caption( vs ); - } - - switch( style ) { - case ROLL_2: - case ROLL_3: - case ROLL_4: - if( vs->style == style ) { - return; - } - vs->first_line = ROWS - (style - 4); - - if( vs->verbose ) - fprintf( stderr, "first_line %d\n", vs->first_line ); - - vs->cury = ROWS - 1; - break; - case POP_UP: - vs->got_eoc = 0; - break; - case PAINT_ON: - break; - } + } + if (!caption) { + /* text mode */ + vs->cury = 0; + } else { + /* captioning mode */ + /* styles: ru2 ru3 ru4 pop paint + */ + if (style != POP_UP && vs->style == POP_UP && !vs->got_eoc) { + /* stupid that sometimes they dont send a EOC */ + vbiscreen_end_of_caption (vs); } - vs->captions = caption; - vs->style = style; -} + switch (style) { + case ROLL_2: + case ROLL_3: + case ROLL_4: + if (vs->style == style) { + return; + } + vs->first_line = ROWS - (style - 4); + + if (vs->verbose) + fprintf (stderr, "first_line %d\n", vs->first_line); + + vs->cury = ROWS - 1; + break; + case POP_UP: + vs->got_eoc = 0; + break; + case PAINT_ON: + break; + } + } -void vbiscreen_tab( vbiscreen_t *vs, int cols ) -{ - if( !vs ) return; - if( cols < 0 || cols > 3 ) return; - vs->curx += cols; - if( vs->curx > 31 ) vs->curx = 31; + vs->captions = caption; + vs->style = style; } -void vbiscreen_set_colour( vbiscreen_t *vs, unsigned int col ) +void +vbiscreen_tab (vbiscreen_t * vs, int cols) { - if( !vs ) return; - vs->fgcolour = col; + if (!vs) + return; + if (cols < 0 || cols > 3) + return; + vs->curx += cols; + if (vs->curx > 31) + vs->curx = 31; } -void vbiscreen_clear_current_cell( vbiscreen_t *vs ) +void +vbiscreen_set_colour (vbiscreen_t * vs, unsigned int col) { - vs->text[ ( ( vs->top_of_screen + vs->cury ) % ( 2 * ROWS ) ) * COLS - + vs->curx + vs->indent ] = 0; + if (!vs) + return; + vs->fgcolour = col; } -void vbiscreen_set_current_cell( vbiscreen_t *vs, char text ) +void +vbiscreen_clear_current_cell (vbiscreen_t * vs) { - int base; - if( !vs ) return; - base = ( ( vs->top_of_screen + vs->cury ) % ( 2 * ROWS ) ) * COLS; - if( g_ascii_isprint( text ) ) - vs->text[ base + vs->curx + vs->indent ] = text; - else - vs->text[ base + vs->curx + vs->indent ] = ' '; + vs->text[((vs->top_of_screen + vs->cury) % (2 * ROWS)) * COLS + + vs->curx + vs->indent] = 0; } -void vbiscreen_delete_to_end( vbiscreen_t *vs ) +void +vbiscreen_set_current_cell (vbiscreen_t * vs, char text) { - int i; - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in del to end\n"); - for( i = vs->curx; i < COLS; i++ ) { - vbiscreen_clear_current_cell( vs ); - vs->curx++; - } - vs->curx = COLS-1; /* is this right ? */ - if( vs->captions && vs->style && vs->style != POP_UP ) - update_row( vs ); + int base; + + if (!vs) + return; + base = ((vs->top_of_screen + vs->cury) % (2 * ROWS)) * COLS; + if (g_ascii_isprint (text)) + vs->text[base + vs->curx + vs->indent] = text; + else + vs->text[base + vs->curx + vs->indent] = ' '; } -void vbiscreen_backspace( vbiscreen_t *vs ) +void +vbiscreen_delete_to_end (vbiscreen_t * vs) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in backspace\n"); - if( !vs->curx ) return; - vs->curx--; - vbiscreen_clear_current_cell( vs ); - update_row( vs ); + int i; + + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in del to end\n"); + for (i = vs->curx; i < COLS; i++) { + vbiscreen_clear_current_cell (vs); + vs->curx++; + } + vs->curx = COLS - 1; /* is this right ? */ + if (vs->captions && vs->style && vs->style != POP_UP) + update_row (vs); } -void vbiscreen_erase_displayed( vbiscreen_t *vs ) +void +vbiscreen_backspace (vbiscreen_t * vs) +{ + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in backspace\n"); + if (!vs->curx) + return; + vs->curx--; + vbiscreen_clear_current_cell (vs); + update_row (vs); +} + +void +vbiscreen_erase_displayed (vbiscreen_t * vs) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in erase disp\n"); + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in erase disp\n"); - if( vs->captions && vs->style && vs->style <= ROLL_4 ) { - clear_hidden_roll( vs ); - } + if (vs->captions && vs->style && vs->style <= ROLL_4) { + clear_hidden_roll (vs); + } - clear_displayed_pop( vs ); - clear_screen( vs ); + clear_displayed_pop (vs); + clear_screen (vs); } -void vbiscreen_erase_non_displayed( vbiscreen_t *vs ) +void +vbiscreen_erase_non_displayed (vbiscreen_t * vs) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in erase non disp\n"); - - if( vs->captions && vs->style == POP_UP ) { - memset( vs->buffers + vs->curbuffer * COLS * ROWS + vs->cury * COLS, 0, COLS ); + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in erase non disp\n"); + + if (vs->captions && vs->style == POP_UP) { + memset (vs->buffers + vs->curbuffer * COLS * ROWS + vs->cury * COLS, 0, + COLS); // clear_hidden_pop( vs ); - } else if( vs->captions && vs->style && vs->style <= ROLL_4 ) { - clear_hidden_roll( vs ); - } + } else if (vs->captions && vs->style && vs->style <= ROLL_4) { + clear_hidden_roll (vs); + } } -void vbiscreen_carriage_return( vbiscreen_t *vs ) +void +vbiscreen_carriage_return (vbiscreen_t * vs) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in CR\n"); - if( vs->style != POP_UP) { - /* not sure if this is right for text mode */ - /* in text mode, perhaps a CR on last row clears screen and goes - * to (0,0) */ - scroll_screen( vs ); - } + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in CR\n"); + if (vs->style != POP_UP) { + /* not sure if this is right for text mode */ + /* in text mode, perhaps a CR on last row clears screen and goes + * to (0,0) */ + scroll_screen (vs); + } - /* keep cursor on bottom for rollup */ - if( vs->captions && vs->style && vs->style <= ROLL_4 ) - vs->cury--; + /* keep cursor on bottom for rollup */ + if (vs->captions && vs->style && vs->style <= ROLL_4) + vs->cury--; - vs->cury++; - vs->curx = 0; + vs->cury++; + vs->curx = 0; } -void copy_buf_to_screen( vbiscreen_t *vs, char *buf ) +void +copy_buf_to_screen (vbiscreen_t * vs, char *buf) { - int base, i, j; - if( !vs ) return; + int base, i, j; - base = vs->top_of_screen * COLS; - for( j = 0, i = 0; i < ROWS * COLS; i++, j++ ) { - vs->text[ base ] = buf[ j ]; - base++; - base %= 2 * ROWS * COLS; - } - update_all_rows( vs ); + if (!vs) + return; + + base = vs->top_of_screen * COLS; + for (j = 0, i = 0; i < ROWS * COLS; i++, j++) { + vs->text[base] = buf[j]; + base++; + base %= 2 * ROWS * COLS; + } + update_all_rows (vs); } -void vbiscreen_end_of_caption( vbiscreen_t *vs ) +void +vbiscreen_end_of_caption (vbiscreen_t * vs) { - /*int i;*/ - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in end of caption\n"); + /*int i; */ + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in end of caption\n"); + + if (vs->style == PAINT_ON) { + copy_buf_to_screen (vs, vs->paintbuf); + clear_hidden_paint (vs); + } else if (vs->style == POP_UP) { + copy_buf_to_screen (vs, vs->buffers + vs->curbuffer * COLS * ROWS); + vs->curbuffer ^= 1; + } + + /* to be safe? */ + vs->curx = 0; + vs->cury = ROWS - 1; + vs->got_eoc = 1; +} - if( vs->style == PAINT_ON ) { - copy_buf_to_screen( vs, vs->paintbuf ); - clear_hidden_paint( vs ); - } else if( vs->style == POP_UP ) { - copy_buf_to_screen( vs, vs->buffers + vs->curbuffer * COLS * ROWS ); - vs->curbuffer ^= 1; +void +vbiscreen_print (vbiscreen_t * vs, char c1, char c2) +{ + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in print (%d, %d)[%c %c]\n", vs->curx, vs->cury, c1, c2); + if (vs->captions && vs->style == POP_UP) { + /* this all gets displayed at another time */ + if (vs->curx != COLS - 1) { + *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + + vs->cury * COLS) = c1; + vs->curx++; } - /* to be safe? */ - vs->curx = 0; - vs->cury = ROWS - 1; - vs->got_eoc = 1; -} - -void vbiscreen_print( vbiscreen_t *vs, char c1, char c2 ) -{ - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in print (%d, %d)[%c %c]\n", vs->curx, vs->cury, c1, c2); - if( vs->captions && vs->style == POP_UP ) { - /* this all gets displayed at another time */ - if( vs->curx != COLS-1 ) { - *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + vs->cury * COLS ) = c1; - vs->curx++; - } - - if( vs->curx != COLS-1 && c2 ) { - *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + vs->cury * COLS ) = c2; - vs->curx++; - } else if( c2 ) { - *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + vs->cury * COLS ) = c2; - } + if (vs->curx != COLS - 1 && c2) { + *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + + vs->cury * COLS) = c2; + vs->curx++; + } else if (c2) { + *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + + vs->cury * COLS) = c2; } + } - if( vs->captions && vs->style == PAINT_ON ) { - if( vs->curx != COLS-1 ) { - vs->paintbuf[ vs->curx + vs->cury * COLS ] = c1; - vs->curx++; - } - - if( vs->curx != COLS-1 && c2 ) { - vs->paintbuf[ vs->curx + vs->cury * COLS ] = c2; - vs->curx++; - } else if( c2 ) { - vs->paintbuf[ vs->curx + vs->cury * COLS ] = c2; - } + if (vs->captions && vs->style == PAINT_ON) { + if (vs->curx != COLS - 1) { + vs->paintbuf[vs->curx + vs->cury * COLS] = c1; + vs->curx++; } - if( vs->captions && vs->style && vs->style <= ROLL_4 ) { - if( vs->curx != COLS-1 ) { - vs->hiddenbuf[ vs->curx ] = c1; - vs->curx++; - } else { - vs->hiddenbuf[ vs->curx ] = c1; - } - - if( vs->curx != COLS-1 && c2 ) { - vs->hiddenbuf[ vs->curx ] = c2; - vs->curx++; - } else if( c2 ) { - vs->hiddenbuf[ vs->curx ] = c2; - } + if (vs->curx != COLS - 1 && c2) { + vs->paintbuf[vs->curx + vs->cury * COLS] = c2; + vs->curx++; + } else if (c2) { + vs->paintbuf[vs->curx + vs->cury * COLS] = c2; + } + } + + if (vs->captions && vs->style && vs->style <= ROLL_4) { + if (vs->curx != COLS - 1) { + vs->hiddenbuf[vs->curx] = c1; + vs->curx++; + } else { + vs->hiddenbuf[vs->curx] = c1; } -} -void vbiscreen_reset( vbiscreen_t *vs ) -{ - if( !vs ) return; - clear_screen( vs ); - clear_hidden_pop( vs ); - clear_displayed_pop( vs ); - clear_hidden_roll( vs ); - vs->captions = 0; - vs->style = 0; -} - -void vbiscreen_composite_packed422_scanline( vbiscreen_t *vs, - unsigned char *output, - int width, int xpos, - int scanline ) -{ - int x=0, y=0, row=0, index=0; - - if( !vs ) return; - if( !output ) return; - if( scanline >= vs->y && scanline < vs->y + vs->height ) { - - if( 0 && !vs->captions ) - blit_colour_packed422_scanline( output + (vs->x*2), vs->width, - vs->bg_luma, vs->bg_cb, - vs->bg_cr ); - - index = vs->top_of_screen * COLS; - x = ( vs->x + vs->charwidth) & ~1; - for( row = 0; row < ROWS; row++ ) { - y = vs->y + row * vs->rowheight + vs->rowheight; - if( osd_string_visible( vs->line[ row ] ) ) { - if( scanline >= y && - scanline < y + vs->rowheight ) { - - int startx; - int strx; - - startx = x - xpos; - strx = 0; - - if( startx < 0 ) { - strx = -startx; - startx = 0; - } - - - if( startx < width ) { - - if( vs->captions ) - blit_colour_packed422_scanline( - output + (startx*2), - osd_string_get_width( vs->line[ row ] ), - vs->bg_luma, - vs->bg_cb, - vs->bg_cr ); - - osd_string_composite_packed422_scanline( - vs->line[ row ], - output + (startx*2), - output + (startx*2), - width - startx, - strx, - scanline - y ); - } - } - index++; - } - } + if (vs->curx != COLS - 1 && c2) { + vs->hiddenbuf[vs->curx] = c2; + vs->curx++; + } else if (c2) { + vs->hiddenbuf[vs->curx] = c2; } + } } +void +vbiscreen_reset (vbiscreen_t * vs) +{ + if (!vs) + return; + clear_screen (vs); + clear_hidden_pop (vs); + clear_displayed_pop (vs); + clear_hidden_roll (vs); + vs->captions = 0; + vs->style = 0; +} + +void +vbiscreen_composite_packed422_scanline (vbiscreen_t * vs, + unsigned char *output, int width, int xpos, int scanline) +{ + int x = 0, y = 0, row = 0, index = 0; + + if (!vs) + return; + if (!output) + return; + if (scanline >= vs->y && scanline < vs->y + vs->height) { + + if (0 && !vs->captions) + blit_colour_packed422_scanline (output + (vs->x * 2), vs->width, + vs->bg_luma, vs->bg_cb, vs->bg_cr); + + index = vs->top_of_screen * COLS; + x = (vs->x + vs->charwidth) & ~1; + for (row = 0; row < ROWS; row++) { + y = vs->y + row * vs->rowheight + vs->rowheight; + if (osd_string_visible (vs->line[row])) { + if (scanline >= y && scanline < y + vs->rowheight) { + + int startx; + int strx; + + startx = x - xpos; + strx = 0; + + if (startx < 0) { + strx = -startx; + startx = 0; + } + + + if (startx < width) { + + if (vs->captions) + blit_colour_packed422_scanline (output + (startx * 2), + osd_string_get_width (vs->line[row]), + vs->bg_luma, vs->bg_cb, vs->bg_cr); + + osd_string_composite_packed422_scanline (vs->line[row], + output + (startx * 2), + output + (startx * 2), width - startx, strx, scanline - y); + } + } + index++; + } + } + } +} diff --git a/gst/vbidec/vbiscreen.h b/gst/vbidec/vbiscreen.h index 9afe2843..f3c81fbf 100644 --- a/gst/vbidec/vbiscreen.h +++ b/gst/vbidec/vbiscreen.h @@ -25,26 +25,24 @@ typedef struct vbiscreen_s vbiscreen_t; -vbiscreen_t *vbiscreen_new( int video_width, int video_height, - double video_aspect, int verbose, void *user_data ); -void vbiscreen_delete( vbiscreen_t *vs ); -void vbiscreen_set_verbose( vbiscreen_t *vs, int verbose ); -void vbiscreen_set_mode( vbiscreen_t *vs, int caption, int style); -void vbiscreen_new_caption( vbiscreen_t *vs, int indent, int ital, - unsigned int colour, int row ); -void vbiscreen_tab( vbiscreen_t *vs, int cols ); -void vbiscreen_delete_to_end( vbiscreen_t *vs ); -void vbiscreen_backspace( vbiscreen_t *vs ); -void vbiscreen_erase_displayed( vbiscreen_t *vs ); -void vbiscreen_erase_non_displayed( vbiscreen_t *vs ); -void vbiscreen_carriage_return( vbiscreen_t *vs ); -void vbiscreen_end_of_caption( vbiscreen_t *vs ); -void vbiscreen_print( vbiscreen_t *vs, char c1, char c2 ); -void vbiscreen_composite_packed422_scanline( vbiscreen_t *vs, - unsigned char *output, - int width, int xpos, - int scanline ); -void vbiscreen_dump_screen_text( vbiscreen_t *vs ); -void vbiscreen_reset( vbiscreen_t *vs ); +vbiscreen_t *vbiscreen_new (int video_width, int video_height, + double video_aspect, int verbose, void *user_data); +void vbiscreen_delete (vbiscreen_t * vs); +void vbiscreen_set_verbose (vbiscreen_t * vs, int verbose); +void vbiscreen_set_mode (vbiscreen_t * vs, int caption, int style); +void vbiscreen_new_caption (vbiscreen_t * vs, int indent, int ital, + unsigned int colour, int row); +void vbiscreen_tab (vbiscreen_t * vs, int cols); +void vbiscreen_delete_to_end (vbiscreen_t * vs); +void vbiscreen_backspace (vbiscreen_t * vs); +void vbiscreen_erase_displayed (vbiscreen_t * vs); +void vbiscreen_erase_non_displayed (vbiscreen_t * vs); +void vbiscreen_carriage_return (vbiscreen_t * vs); +void vbiscreen_end_of_caption (vbiscreen_t * vs); +void vbiscreen_print (vbiscreen_t * vs, char c1, char c2); +void vbiscreen_composite_packed422_scanline (vbiscreen_t * vs, + unsigned char *output, int width, int xpos, int scanline); +void vbiscreen_dump_screen_text (vbiscreen_t * vs); +void vbiscreen_reset (vbiscreen_t * vs); #endif |