summaryrefslogtreecommitdiff
path: root/gst/vbidec/vbiscreen.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/vbidec/vbiscreen.c')
-rw-r--r--gst/vbidec/vbiscreen.c825
1 files changed, 0 insertions, 825 deletions
diff --git a/gst/vbidec/vbiscreen.c b/gst/vbidec/vbiscreen.c
deleted file mode 100644
index 52e91e0d9..000000000
--- a/gst/vbidec/vbiscreen.c
+++ /dev/null
@@ -1,825 +0,0 @@
-/*
- * Copyright (c) 2002 Billy Biggs <vektor@dumbterm.net>.
- * Copyright (c) 2002 Doug Bell <drbell@users.sourceforge.net>.
- *
- * Modified and adapted to GStreamer by
- * David I. Lehn <dlehn@users.sourceforge.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
-/*#include "osdtools.h"*/
-/*#include "speedy.h"*/
-#include <glib.h>
-#include "vbiscreen.h"
-#include "gstvbidec.h"
-
-#define ROLL_2 6
-#define ROLL_3 7
-#define ROLL_4 8
-#define POP_UP 9
-#define PAINT_ON 10
-
-
-#define NUM_LINES 15
-#define ROWS 15
-#define COLS 32
-#define FONT_SIZE 20
-
-typedef struct osd_string_s osd_string_t;
-struct osd_string_s
-{
- int width;
- int height;
- int r, g, b;
- int visible;
- GstVBIDec *vbidec;
-};
-
-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));
- 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;
- return os;
-}
-
-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);
- }
-}
-
-int
-osd_string_get_height (osd_string_t * os)
-{
- return os->height;
-}
-
-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_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)
-{
-}
-
-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)
-{
-}
-
-struct vbiscreen_s
-{
-
- osd_string_t *line[ROWS];
-
- 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;
-
- 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 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;
-
- 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));
-
- 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);
- }
-
- 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);
- }
- memset (vs->text, 0, 2 * ROWS * COLS);
- return vs;
-}
-
-void
-blank_screen (vbiscreen_t * vs)
-{
- int i;
-
- 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)
-{
- int base, i;
-
- 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)
-{
- if (!vs)
- return;
- memset (vs->hiddenbuf, 0, COLS);
-}
-
-void
-clear_hidden_pop (vbiscreen_t * vs)
-{
- if (!vs)
- return;
- memset (vs->buffers + vs->curbuffer * COLS * ROWS, 0, COLS * ROWS);
-}
-
-void
-clear_hidden_paint (vbiscreen_t * vs)
-{
- if (!vs)
- return;
- memset (vs->paintbuf, 0, COLS * ROWS);
-}
-
-void
-clear_displayed_pop (vbiscreen_t * vs)
-{
- if (!vs)
- return;
- memset (vs->buffers + (vs->curbuffer ^ 1) * COLS * ROWS, 0, COLS * ROWS);
-}
-
-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
-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] = ' ';
- }
- }
-
- 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;
-}
-
-void
-update_row (vbiscreen_t * vs)
-{
- if (!vs)
- return;
-
- update_row_x (vs, vs->cury);
- //vbiscreen_dump_screen_text( vs );
-}
-
-void
-update_all_rows (vbiscreen_t * vs)
-{
- int row = 0;
-
- if (!vs)
- return;
-
- for (row = 0; row < ROWS; row++) {
- update_row_x (vs, row);
- }
- //vbiscreen_dump_screen_text( vs );
-}
-
-void
-vbiscreen_delete (vbiscreen_t * vs)
-{
- free (vs);
-}
-
-void
-copy_row_to_screen (vbiscreen_t * vs, char *row)
-{
- 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);
-}
-
-void
-scroll_screen (vbiscreen_t * vs)
-{
- 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);
-
- /* 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)
-{
- vs->verbose = verbose;
-}
-
-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 {
-// scroll_screen( vs );
- }
- }
-
- 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;
- }
- }
- 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;
- }
- }
-
- vs->captions = caption;
- vs->style = style;
-}
-
-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;
-}
-
-void
-vbiscreen_set_colour (vbiscreen_t * vs, unsigned int col)
-{
- if (!vs)
- return;
- vs->fgcolour = col;
-}
-
-void
-vbiscreen_clear_current_cell (vbiscreen_t * vs)
-{
- vs->text[((vs->top_of_screen + vs->cury) % (2 * ROWS)) * COLS
- + vs->curx + vs->indent] = 0;
-}
-
-void
-vbiscreen_set_current_cell (vbiscreen_t * vs, char text)
-{
- 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_delete_to_end (vbiscreen_t * 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_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->captions && vs->style && vs->style <= ROLL_4) {
- clear_hidden_roll (vs);
- }
-
- clear_displayed_pop (vs);
- clear_screen (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);
-// clear_hidden_pop( vs );
- } else if (vs->captions && vs->style && vs->style <= ROLL_4) {
- clear_hidden_roll (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);
- }
-
- /* keep cursor on bottom for rollup */
- if (vs->captions && vs->style && vs->style <= ROLL_4)
- vs->cury--;
-
- vs->cury++;
- vs->curx = 0;
-}
-
-void
-copy_buf_to_screen (vbiscreen_t * vs, char *buf)
-{
- int base, i, j;
-
- 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)
-{
- /*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;
-}
-
-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->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 && 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;
- }
- }
-}
-
-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++;
- }
- }
- }
-}