summaryrefslogtreecommitdiffstats
path: root/gst/vbidec/vbiscreen.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/vbidec/vbiscreen.c')
-rw-r--r--gst/vbidec/vbiscreen.c1138
1 files changed, 610 insertions, 528 deletions
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++;
+ }
+ }
+ }
+}