teletextdec: add a new method to convert a page in a list of strings

https://bugzilla.gnome.org/show_bug.cgi?id=619739
This commit is contained in:
Andoni Morales Alastruey 2010-06-10 12:44:27 +02:00 committed by Sebastian Dröge
parent fb98c55f67
commit f4e4fc44f7
2 changed files with 75 additions and 29 deletions

View file

@ -110,7 +110,8 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC, GST_PAD_SRC,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA "; text/plain ; text/html") GST_STATIC_CAPS
(GST_VIDEO_CAPS_RGBA "; text/plain ; text/html ; text/x-pango-markup")
); );
/* debug category for filtering log messages */ /* debug category for filtering log messages */
@ -146,6 +147,9 @@ static GstFlowReturn gst_teletextdec_export_html_page (GstTeletextDec *
teletext, vbi_page * page, GstBuffer ** buf); teletext, vbi_page * page, GstBuffer ** buf);
static GstFlowReturn gst_teletextdec_export_rgba_page (GstTeletextDec * static GstFlowReturn gst_teletextdec_export_rgba_page (GstTeletextDec *
teletext, vbi_page * page, GstBuffer ** buf); teletext, vbi_page * page, GstBuffer ** buf);
static GstFlowReturn gst_teletextdec_export_pango_page (GstTeletextDec *
teletext, vbi_page * page, GstBuffer ** buf);
static gboolean gst_teletextdec_push_preroll_buffer (GstTeletextDec * teletext); static gboolean gst_teletextdec_push_preroll_buffer (GstTeletextDec * teletext);
static void gst_teletextdec_process_telx_buffer (GstTeletextDec * teletext, static void gst_teletextdec_process_telx_buffer (GstTeletextDec * teletext,
@ -520,6 +524,9 @@ gst_teletextdec_src_set_caps (GstPad * pad, GstCaps * caps)
} else if (g_strcmp0 (mimetype, "text/plain") == 0) { } else if (g_strcmp0 (mimetype, "text/plain") == 0) {
teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT; teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT;
GST_DEBUG_OBJECT (teletext, "Selected text output format"); GST_DEBUG_OBJECT (teletext, "Selected text output format");
} else if (g_strcmp0 (mimetype, "text/x-pango-markup") == 0) {
teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_PANGO;
GST_DEBUG_OBJECT (teletext, "Selected pango markup output format");
} else } else
goto refuse_caps; goto refuse_caps;
@ -732,6 +739,9 @@ gst_teletextdec_push_page (GstTeletextDec * teletext)
case GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA: case GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA:
ret = gst_teletextdec_export_rgba_page (teletext, &page, &buf); ret = gst_teletextdec_export_rgba_page (teletext, &page, &buf);
break; break;
case GST_TELETEXTDEC_OUTPUT_FORMAT_PANGO:
ret = gst_teletextdec_export_pango_page (teletext, &page, &buf);
break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
@ -775,37 +785,29 @@ push_failed:
} }
} }
static gint static gchar **
gst_teletextdec_parse_subtitles_page (GstTeletextDec * teletext, gst_teletextdec_vbi_page_to_text_lines (GstTeletextDec * teletext,
vbi_page * page, gchar ** text) guint start, guint stop, vbi_page * page)
{ {
const gint line_length = page->columns; const guint lines_count = stop - start + 1;
gchar *line; const guint line_length = page->columns;
GString *subs; gchar **lines;
gint length, i; gint i;
subs = g_string_new (""); /* allocate a new NULL-terminated array of strings */
line = g_malloc (line_length + 1); lines = (gchar **) g_malloc (sizeof (gchar *) * (lines_count + 1));
/* Print lines 2 to 23 */ lines[lines_count] = g_strdup ('\0');
for (i = 1; i < 23; i++) {
vbi_print_page_region (page, line, line_length + 1, "UTF-8", TRUE, 0, /* export each line in the range of the teletext page in text format */
0, i, page->columns, 1); for (i = start; i <= stop; i++) {
lines[i - start] = (gchar *) g_malloc (sizeof (gchar) * (line_length + 1));
vbi_print_page_region (page, lines[i - start], line_length + 1, "UTF-8",
TRUE, 0, 0, i, line_length, 1);
/* Add the null character */ /* Add the null character */
line[line_length] = '\0'; lines[i - start][line_length] = '\0';
/* Strip blank lines */
g_strstrip (line);
if (g_strcmp0 (line, "")) {
g_string_append_printf (subs, teletext->subtitles_template, line);
} }
}
if (!g_strcmp0 (subs->str, ""))
g_string_append (subs, "\n");
*text = subs->str; return lines;
length = subs->len + 1;
g_string_free (subs, FALSE);
g_free (line);
return length;
} }
static GstFlowReturn static GstFlowReturn
@ -818,7 +820,27 @@ gst_teletextdec_export_text_page (GstTeletextDec * teletext, vbi_page * page,
guint size; guint size;
if (teletext->subtitles_mode) { if (teletext->subtitles_mode) {
size = gst_teletextdec_parse_subtitles_page (teletext, page, &text); gchar **lines;
GString *subs;
guint i;
lines = gst_teletextdec_vbi_page_to_text_lines (teletext, 1, 23, page);
subs = g_string_new ("");
/* Strip white spaces and squash blank lines */
for (i = 0; i < 23; i++) {
g_strstrip (lines[i]);
if (g_strcmp0 (lines[i], ""))
g_string_append_printf (subs, teletext->subtitles_template, lines[i]);
}
/* if the page is blank and doesn't contain any line of text, just add a
* line break */
if (!g_strcmp0 (subs->str, ""))
g_string_append (subs, "\n");
text = subs->str;
size = subs->len + 1;
g_string_free (subs, FALSE);
g_strfreev (lines);
} else { } else {
size = page->columns * page->rows; size = page->columns * page->rows;
text = g_malloc (size); text = g_malloc (size);
@ -915,6 +937,30 @@ gst_teletextdec_export_rgba_page (GstTeletextDec * teletext, vbi_page * page,
return ret; return ret;
} }
static GstFlowReturn
gst_teletextdec_export_pango_page (GstTeletextDec * teletext, vbi_page * page,
GstBuffer ** buf)
{
vbi_char *acp;
gint colors[page->rows];
int i, j;
/* Parse all the lines and approximate it's foreground color from the first
* non null character */
for (acp = page->text, i = 0; i < page->rows; acp += page->columns, i++) {
for (j = 0; j < page->columns; j++) {
if (acp[j].unicode != 20) {
color[i] = acp[j].foreground;
continue;
}
}
}
*buf = gst_buffer_new ();
return GST_FLOW_OK;
}
static gboolean static gboolean
gst_teletextdec_push_preroll_buffer (GstTeletextDec * teletext) gst_teletextdec_push_preroll_buffer (GstTeletextDec * teletext)
{ {

View file

@ -46,7 +46,7 @@ enum _GstTeletextOutputFormat
GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA, GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA,
GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT, GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT,
GST_TELETEXTDEC_OUTPUT_FORMAT_HTML, GST_TELETEXTDEC_OUTPUT_FORMAT_HTML,
GST_TELETEXTDEC_OUTPUT_FORMAT_SUBTITLES GST_TELETEXTDEC_OUTPUT_FORMAT_PANGO
}; };
typedef void (*GstTeletextProcessBufferFunc) (GstTeletextDec * typedef void (*GstTeletextProcessBufferFunc) (GstTeletextDec *