summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward@collabora.com>2013-06-14 08:35:08 +0200
committerEdward Hervey <bilboed@bilboed.com>2015-09-10 15:26:55 +0200
commit5c6bf2521f8f205a474436410bcbf64ebdf57654 (patch)
treef34fdceb4dcaaf9365ede3c8b20f36059ad4d5b6
parent779ad060a4e7cd33782571485e4990a1efc3524b (diff)
!!teletextdec: Pending port to 1.0teletext
* Only support teletext (and remove bizarre PES/mpeg-ts support) * Remove html support * Doesn't use allocation queries yet (to get buffer pool if using video output) * Doesn't negotiate yet (to know what formats downstream can support, and doesn't push out the correct caps)
-rw-r--r--configure.ac2
-rw-r--r--ext/teletextdec/gstteletextdec.c358
-rw-r--r--ext/teletextdec/gstteletextdec.h8
3 files changed, 92 insertions, 276 deletions
diff --git a/configure.ac b/configure.ac
index caaf3ec25..ce406551f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -425,7 +425,7 @@ GST_PLUGINS_NONPORTED=" cdxaparse \
gsettings \
musepack nas sdl timidity \
acm wininet \
- xvid lv2 teletextdec sndio libvisual"
+ xvid lv2 sndio libvisual"
AC_SUBST(GST_PLUGINS_NONPORTED)
dnl these are all the gst plug-ins, compilable without additional libs
diff --git a/ext/teletextdec/gstteletextdec.c b/ext/teletextdec/gstteletextdec.c
index 622b972d8..328955d43 100644
--- a/ext/teletextdec/gstteletextdec.c
+++ b/ext/teletextdec/gstteletextdec.c
@@ -22,12 +22,12 @@
/**
* SECTION:element-teletextdec
*
- * Decode PES stream containing teletext information to RGBA stream
+ * Decode teletext information to RGBA or text stream
*
* <refsect2>
* <title>Example launch line</title>
* |[
- * gst-launch -v -m filesrc location=recording.mpeg ! mpegtsdemux ! private/teletext ! teletextdec ! videoconvert ! ximagesink
+ * gst-launch -v -m filesrc location=recording.mpeg ! tsdemux ! teletextdec ! videoconvert ! xvimagesink
* ]|
* </refsect2>
*/
@@ -123,23 +123,18 @@ static const gchar *default_color_map[40] = {
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS
- ("video/mpeg,mpegversion=2,systemstream=TRUE ; private/teletext")
+ GST_STATIC_CAPS ("application/x-teletext")
);
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS
- (GST_VIDEO_CAPS_RGBA "; text/plain ; text/html ; text/x-pango-markup")
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGBA")
+ "; text/plain ; text/x-pango-markup")
);
-/* debug category for filtering log messages */
-#define DEBUG_INIT(bla) \
- GST_DEBUG_CATEGORY_INIT (gst_teletextdec_debug, "teletext", 0, "Teletext decoder");
-
-GST_BOILERPLATE_FULL (GstTeletextDec, gst_teletextdec, GstElement,
- GST_TYPE_ELEMENT, DEBUG_INIT);
+#define gst_teletextdec_parent_class parent_class
+G_DEFINE_TYPE (GstTeletextDec, gst_teletextdec, GST_TYPE_ELEMENT);
static void gst_teletextdec_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
@@ -150,32 +145,29 @@ static void gst_teletextdec_finalize (GObject * object);
static GstStateChangeReturn gst_teletextdec_change_state (GstElement * element,
GstStateChange transition);
-static GstFlowReturn gst_teletextdec_chain (GstPad * pad, GstBuffer * buf);
-static gboolean gst_teletextdec_sink_setcaps (GstPad * pad, GstCaps * caps);
-static gboolean gst_teletextdec_sink_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_teletextdec_chain (GstPad * pad, GstObject * parent,
+ GstBuffer * buf);
+static gboolean gst_teletextdec_sink_event (GstPad * pad, GstObject * parent,
+ GstEvent * event);
+#if 0
static GstPadLinkReturn gst_teletextdec_src_set_caps (GstPad * pad,
GstCaps * caps);
+#endif
-static vbi_bool gst_teletextdec_convert (vbi_dvb_demux * dx, gpointer user_data,
- const vbi_sliced * sliced, guint n_lines, gint64 pts);
+/* static vbi_bool gst_teletextdec_convert (vbi_dvb_demux * dx, gpointer user_data, */
+/* const vbi_sliced * sliced, guint n_lines, gint64 pts); */
static void gst_teletextdec_event_handler (vbi_event * ev, void *user_data);
static GstFlowReturn gst_teletextdec_push_page (GstTeletextDec * teletext);
static GstFlowReturn gst_teletextdec_export_text_page (GstTeletextDec *
teletext, vbi_page * page, GstBuffer ** buf);
-static GstFlowReturn gst_teletextdec_export_html_page (GstTeletextDec *
- teletext, vbi_page * page, GstBuffer ** buf);
static GstFlowReturn gst_teletextdec_export_rgba_page (GstTeletextDec *
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 void gst_teletextdec_process_telx_buffer (GstTeletextDec * teletext,
GstBuffer * buf);
-static void gst_teletextdec_process_pes_buffer (GstTeletextDec * teletext,
- GstBuffer * buf);
static gboolean gst_teletextdec_extract_data_units (GstTeletextDec * teletext,
GstTeletextFrame * f, guint8 * packet, guint * offset, gint size);
@@ -184,24 +176,6 @@ static void gst_teletextdec_zvbi_clear (GstTeletextDec * teletext);
/* GObject vmethod implementations */
-static void
-gst_teletextdec_base_init (gpointer klass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
- gst_element_class_set_static_metadata (element_class,
- "Teletext decoder",
- "Decoder",
- "Decode PES or raw VBI stream containing teletext information to RGBA, HTML and text",
- "Sebastian Pölsterl <sebp@k-d-w.org>, "
- "Andoni Morales Alastruey <ylatuya@gmail.com>");
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
-}
-
/* initialize the gstteletext's class */
static void
gst_teletextdec_class_init (GstTeletextDecClass * klass)
@@ -209,12 +183,28 @@ gst_teletextdec_class_init (GstTeletextDecClass * klass)
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
+ GST_DEBUG_CATEGORY_INIT (gst_teletextdec_debug, "teletext", 0,
+ "Teletext decoder");
+
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->set_property = gst_teletextdec_set_property;
gobject_class->get_property = gst_teletextdec_get_property;
gobject_class->finalize = gst_teletextdec_finalize;
gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_set_static_metadata (gstelement_class,
+ "Teletext decoder",
+ "Decoder",
+ "Decode teletext stream to RGBA and text",
+ "Sebastian Pölsterl <sebp@k-d-w.org>, "
+ "Andoni Morales Alastruey <ylatuya@gmail.com>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&src_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sink_template));
+
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_teletextdec_change_state);
@@ -251,12 +241,10 @@ gst_teletextdec_class_init (GstTeletextDecClass * klass)
* initialize instance structure
*/
static void
-gst_teletextdec_init (GstTeletextDec * teletext, GstTeletextDecClass * klass)
+gst_teletextdec_init (GstTeletextDec * teletext)
{
/* Create sink pad */
teletext->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink");
- gst_pad_set_setcaps_function (teletext->sinkpad,
- GST_DEBUG_FUNCPTR (gst_teletextdec_sink_setcaps));
gst_pad_set_chain_function (teletext->sinkpad,
GST_DEBUG_FUNCPTR (gst_teletextdec_chain));
gst_pad_set_event_function (teletext->sinkpad,
@@ -265,8 +253,10 @@ gst_teletextdec_init (GstTeletextDec * teletext, GstTeletextDecClass * klass)
/* Create src pad */
teletext->srcpad = gst_pad_new_from_static_template (&src_template, "src");
+#if 0
gst_pad_set_setcaps_function (teletext->srcpad,
GST_DEBUG_FUNCPTR (gst_teletextdec_src_set_caps));
+#endif
gst_element_add_pad (GST_ELEMENT (teletext), teletext->srcpad);
teletext->demux = NULL;
@@ -284,7 +274,7 @@ gst_teletextdec_init (GstTeletextDec * teletext, GstTeletextDecClass * klass)
teletext->rate_denominator = 1;
teletext->queue = NULL;
- teletext->queue_lock = g_mutex_new ();
+ g_mutex_init (&teletext->queue_lock);
teletext->frame = g_new0 (GstTeletextFrame, 1);
teletext->frame->sliced_begin = g_new (vbi_sliced, MAX_SLICES);
@@ -292,8 +282,6 @@ gst_teletextdec_init (GstTeletextDec * teletext, GstTeletextDecClass * klass)
teletext->frame->sliced_end = teletext->frame->sliced_begin + MAX_SLICES;
teletext->last_ts = 0;
-
- teletext->process_buf_func = NULL;
}
static void
@@ -301,7 +289,7 @@ gst_teletextdec_finalize (GObject * object)
{
GstTeletextDec *teletext = GST_TELETEXTDEC (object);
- g_mutex_free (teletext->queue_lock);
+ g_mutex_clear (&teletext->queue_lock);
g_free (teletext->frame);
@@ -321,9 +309,9 @@ gst_teletextdec_zvbi_init (GstTeletextDec * teletext)
VBI_EVENT_TTX_PAGE | VBI_EVENT_CAPTION,
gst_teletextdec_event_handler, teletext);
- g_mutex_lock (teletext->queue_lock);
+ g_mutex_lock (&teletext->queue_lock);
teletext->queue = g_queue_new ();
- g_mutex_unlock (teletext->queue_lock);
+ g_mutex_unlock (&teletext->queue_lock);
}
static void
@@ -346,12 +334,12 @@ gst_teletextdec_zvbi_clear (GstTeletextDec * teletext)
teletext->frame = NULL;
}
- g_mutex_lock (teletext->queue_lock);
+ g_mutex_lock (&teletext->queue_lock);
if (teletext->queue != NULL) {
g_queue_free (teletext->queue);
teletext->queue = NULL;
}
- g_mutex_unlock (teletext->queue_lock);
+ g_mutex_unlock (&teletext->queue_lock);
teletext->in_timestamp = GST_CLOCK_TIME_NONE;
teletext->in_duration = GST_CLOCK_TIME_NONE;
@@ -417,22 +405,28 @@ gst_teletextdec_get_property (GObject * object, guint prop_id,
}
static gboolean
-gst_teletextdec_sink_event (GstPad * pad, GstEvent * event)
+gst_teletextdec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
gboolean ret;
- GstTeletextDec *teletext = GST_TELETEXTDEC (gst_pad_get_parent (pad));
+ GstTeletextDec *teletext = GST_TELETEXTDEC (parent);
GST_DEBUG_OBJECT (teletext, "got event %s",
gst_event_type_get_name (GST_EVENT_TYPE (event)));
switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_NEWSEGMENT:
+ case GST_EVENT_SEGMENT:
/* maybe save and/or update the current segment (e.g. for output
* clipping) or convert the event into one in a different format
* (e.g. BYTES to TIME) or drop it and set a flag to send a newsegment
* event in a different format later */
- ret = gst_pad_push_event (teletext->srcpad, event);
+ ret = gst_pad_event_default (pad, parent, event);
+ break;
+ case GST_EVENT_CAPS:
+ {
+ gst_event_unref (event);
+ ret = TRUE;
break;
+ }
case GST_EVENT_EOS:
/* end-of-stream, we should close down all stream leftovers here */
gst_teletextdec_zvbi_clear (teletext);
@@ -444,12 +438,10 @@ gst_teletextdec_sink_event (GstPad * pad, GstEvent * event)
ret = gst_pad_push_event (teletext->srcpad, event);
break;
default:
- ret = gst_pad_event_default (pad, event);
+ ret = gst_pad_event_default (pad, parent, event);
break;
}
- gst_object_unref (teletext);
-
return ret;
}
@@ -484,53 +476,8 @@ gst_teletextdec_change_state (GstElement * element, GstStateChange transition)
return ret;
}
-static gboolean
-gst_teletextdec_sink_setcaps (GstPad * pad, GstCaps * caps)
-{
- GstTeletextDec *teletext = GST_TELETEXTDEC (gst_pad_get_parent (pad));
- GstStructure *structure = gst_caps_get_structure (caps, 0);
- const gchar *mimetype = gst_structure_get_name (structure);
-
- GST_DEBUG_OBJECT (teletext, "%s:%s, caps=%" GST_PTR_FORMAT,
- GST_DEBUG_PAD_NAME (pad), caps);
-
- if (g_strcmp0 (mimetype, "private/teletext") == 0) {
- teletext->process_buf_func = gst_teletextdec_process_telx_buffer;
- goto accept_caps;
- } else if (g_strcmp0 (mimetype, "video/mpeg") == 0) {
- gint version;
- gboolean is_systemstream;
-
- if (!gst_structure_get_int (structure, "mpegversion", &version) ||
- !gst_structure_get_boolean (structure, "systemstream",
- &is_systemstream))
- goto refuse_caps;
-
- if (version != 2 || !is_systemstream)
- goto refuse_caps;
-
- teletext->process_buf_func = gst_teletextdec_process_pes_buffer;
- teletext->demux = vbi_dvb_pes_demux_new (gst_teletextdec_convert, teletext);
- goto accept_caps;
- } else
- goto refuse_caps;
-
-accept_caps:
- {
- gst_object_unref (teletext);
- return gst_teletextdec_push_preroll_buffer (teletext);
- }
-
-refuse_caps:
- {
- GST_ERROR_OBJECT (teletext,
- "pad %s refused renegotiation to %" GST_PTR_FORMAT,
- GST_PAD_NAME (pad), caps);
- gst_object_unref (teletext);
- return FALSE;
- }
-}
+#if 0
static gboolean
gst_teletextdec_src_set_caps (GstPad * pad, GstCaps * caps)
{
@@ -561,9 +508,6 @@ gst_teletextdec_src_set_caps (GstPad * pad, GstCaps * caps)
if (g_strcmp0 (mimetype, "video/x-raw-rgb") == 0) {
teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA;
GST_DEBUG_OBJECT (teletext, "Selected RGBA output format");
- } else if (g_strcmp0 (mimetype, "text/html") == 0) {
- teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_HTML;
- GST_DEBUG_OBJECT (teletext, "Selected HTML output format");
} else if (g_strcmp0 (mimetype, "text/plain") == 0) {
teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT;
GST_DEBUG_OBJECT (teletext, "Selected text output format");
@@ -583,6 +527,7 @@ refuse_caps:
return FALSE;
}
}
+#endif
static void
gst_teletextdec_reset_frame (GstTeletextDec * teletext)
@@ -595,21 +540,16 @@ gst_teletextdec_reset_frame (GstTeletextDec * teletext)
}
static void
-gst_teletextdec_process_pes_buffer (GstTeletextDec * teletext, GstBuffer * buf)
-{
- vbi_dvb_demux_feed (teletext->demux, GST_BUFFER_DATA (buf),
- GST_BUFFER_SIZE (buf));
- return;
-}
-
-static void
gst_teletextdec_process_telx_buffer (GstTeletextDec * teletext, GstBuffer * buf)
{
- guint8 *data = GST_BUFFER_DATA (buf);
- const gint size = GST_BUFFER_SIZE (buf);
+ GstMapInfo info;
guint offset = 0;
gint res;
+ if (!gst_buffer_map (buf, &info, GST_MAP_READ))
+ /* FIXME : Propagate error handling */
+ return;
+
teletext->in_timestamp = GST_BUFFER_TIMESTAMP (buf);
teletext->in_duration = GST_BUFFER_DURATION (buf);
@@ -617,10 +557,10 @@ gst_teletextdec_process_telx_buffer (GstTeletextDec * teletext, GstBuffer * buf)
gst_teletextdec_reset_frame (teletext);
}
- while (offset < size) {
+ while (offset < info.size) {
res =
- gst_teletextdec_extract_data_units (teletext, teletext->frame, data,
- &offset, size);
+ gst_teletextdec_extract_data_units (teletext, teletext->frame,
+ info.data, &offset, info.size);
if (res == VBI_NEW_FRAME) {
/* We have a new frame, it's time to feed the decoder */
@@ -646,32 +586,15 @@ gst_teletextdec_process_telx_buffer (GstTeletextDec * teletext, GstBuffer * buf)
gst_teletextdec_reset_frame (teletext);
} else if (res == VBI_ERROR) {
gst_teletextdec_reset_frame (teletext);
- return;
+ goto beach;
}
}
- return;
-}
-
-static vbi_bool
-gst_teletextdec_convert (vbi_dvb_demux * dx,
- gpointer user_data, const vbi_sliced * sliced, guint n_lines, gint64 pts)
-{
- gdouble sample_time;
- vbi_sliced *s;
- GstTeletextDec *teletext = GST_TELETEXTDEC (user_data);
-
- GST_DEBUG_OBJECT (teletext, "Converting %u lines to decode", n_lines);
-
- sample_time = pts * (1 / 90000.0);
-
- s = g_memdup (sliced, n_lines * sizeof (vbi_sliced));
- vbi_decode (teletext->decoder, s, n_lines, sample_time);
- g_free (s);
-
- return GST_FLOW_OK;
+beach:
+ gst_buffer_unmap (buf, &info);
}
+
static void
gst_teletextdec_event_handler (vbi_event * ev, void *user_data)
{
@@ -697,9 +620,9 @@ gst_teletextdec_event_handler (vbi_event * ev, void *user_data)
pi->pgno = pgno;
pi->subno = subno;
- g_mutex_lock (teletext->queue_lock);
+ g_mutex_lock (&teletext->queue_lock);
g_queue_push_tail (teletext->queue, pi);
- g_mutex_unlock (teletext->queue_lock);
+ g_mutex_unlock (&teletext->queue_lock);
break;
case VBI_EVENT_CAPTION:
/* TODO: Handle subtitles in caption teletext pages */
@@ -714,26 +637,26 @@ gst_teletextdec_event_handler (vbi_event * ev, void *user_data)
/* this function does the actual processing
*/
static GstFlowReturn
-gst_teletextdec_chain (GstPad * pad, GstBuffer * buf)
+gst_teletextdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
{
- GstTeletextDec *teletext = GST_TELETEXTDEC (GST_PAD_PARENT (pad));
+ GstTeletextDec *teletext = GST_TELETEXTDEC (parent);
GstFlowReturn ret = GST_FLOW_OK;
teletext->in_timestamp = GST_BUFFER_TIMESTAMP (buf);
teletext->in_duration = GST_BUFFER_DURATION (buf);
- teletext->process_buf_func (teletext, buf);
+ gst_teletextdec_process_telx_buffer (teletext, buf);
gst_buffer_unref (buf);
- g_mutex_lock (teletext->queue_lock);
+ g_mutex_lock (&teletext->queue_lock);
if (!g_queue_is_empty (teletext->queue)) {
ret = gst_teletextdec_push_page (teletext);
if (ret != GST_FLOW_OK) {
- g_mutex_unlock (teletext->queue_lock);
+ g_mutex_unlock (&teletext->queue_lock);
goto error;
}
}
- g_mutex_unlock (teletext->queue_lock);
+ g_mutex_unlock (&teletext->queue_lock);
return ret;
@@ -777,9 +700,6 @@ gst_teletextdec_push_page (GstTeletextDec * teletext)
case GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT:
ret = gst_teletextdec_export_text_page (teletext, &page, &buf);
break;
- case GST_TELETEXTDEC_OUTPUT_FORMAT_HTML:
- ret = gst_teletextdec_export_html_page (teletext, &page, &buf);
- break;
case GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA:
ret = gst_teletextdec_export_rgba_page (teletext, &page, &buf);
break;
@@ -799,8 +719,8 @@ gst_teletextdec_push_page (GstTeletextDec * teletext)
GST_BUFFER_TIMESTAMP (buf) = teletext->in_timestamp;
GST_BUFFER_DURATION (buf) = teletext->in_duration;
- GST_INFO_OBJECT (teletext, "Pushing buffer of size %d",
- GST_BUFFER_SIZE (buf));
+ GST_INFO_OBJECT (teletext, "Pushing buffer of size %" G_GSIZE_FORMAT,
+ gst_buffer_get_size (buf));
ret = gst_pad_push (teletext->srcpad, buf);
if (ret != GST_FLOW_OK)
@@ -858,8 +778,6 @@ static GstFlowReturn
gst_teletextdec_export_text_page (GstTeletextDec * teletext, vbi_page * page,
GstBuffer ** buf)
{
- GstCaps *caps;
- GstFlowReturn ret;
gchar *text;
guint size;
@@ -892,53 +810,11 @@ gst_teletextdec_export_text_page (GstTeletextDec * teletext, vbi_page * page,
}
/* Allocate new buffer */
- caps = gst_caps_new_simple ("text/plain", NULL);
- ret = gst_pad_alloc_buffer (teletext->srcpad, GST_BUFFER_OFFSET_NONE,
- size, caps, &(*buf));
- if (G_LIKELY (ret == GST_FLOW_OK))
- GST_BUFFER_DATA (*buf) = GST_BUFFER_MALLOCDATA (*buf) = (guint8 *) text;
- else
- gst_buffer_unref (*buf);
+ *buf = gst_buffer_new_wrapped (text, size);
- gst_caps_unref (caps);
- return ret;
+ return GST_FLOW_OK;
}
-static GstFlowReturn
-gst_teletextdec_export_html_page (GstTeletextDec * teletext, vbi_page * page,
- GstBuffer ** buf)
-{
- GstCaps *caps;
- GstFlowReturn ret;
- gchar *html;
- gssize size;
- vbi_export *ex;
- gchar *err;
-
- if (!(ex = vbi_export_new ("html", &err))) {
- GST_ELEMENT_ERROR (teletext, LIBRARY, SETTINGS,
- ("Can't open the HTML export module: %s", err), (NULL));
- g_free (err);
- return GST_FLOW_ERROR;
- }
-
- /* export to NULL to get size of the memory needed to allocate the page */
- size = vbi_export_mem (ex, NULL, 0, page);
- if (size < 0)
- return GST_FLOW_ERROR;
- html = g_malloc (size);
- vbi_export_mem (ex, html, size, page);
-
- /* Allocate new buffer */
- caps = gst_caps_new_simple ("text/html", NULL);
- ret = gst_pad_alloc_buffer (teletext->srcpad, GST_BUFFER_OFFSET_NONE,
- size, caps, &(*buf));
- if (G_LIKELY (ret == GST_FLOW_OK))
- GST_BUFFER_DATA (*buf) = GST_BUFFER_MALLOCDATA (*buf) = (guint8 *) html;
-
- gst_caps_unref (caps);
- return ret;
-}
static GstFlowReturn
gst_teletextdec_export_rgba_page (GstTeletextDec * teletext, vbi_page * page,
@@ -946,15 +822,16 @@ gst_teletextdec_export_rgba_page (GstTeletextDec * teletext, vbi_page * page,
{
guint size;
GstCaps *caps, *out_caps;
- GstFlowReturn ret;
gint width, height;
GstPadTemplate *templ;
+ GstMapInfo info;
/* one character occupies 12 x 10 pixels */
width = page->columns * 12;
height = page->rows * 10;
- caps = gst_caps_new_simple ("video/x-raw-rgb",
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "RGBA",
"width", G_TYPE_INT, width,
"height", G_TYPE_INT, height,
"framerate", GST_TYPE_FRACTION, teletext->rate_numerator,
@@ -967,18 +844,17 @@ gst_teletextdec_export_rgba_page (GstTeletextDec * teletext, vbi_page * page,
size = (guint) width *(guint) height *sizeof (vbi_rgba);
- ret = gst_pad_alloc_buffer_and_set_caps (teletext->srcpad,
- GST_BUFFER_OFFSET_NONE, size, out_caps, &(*buf));
+ *buf = gst_buffer_new_allocate (NULL, size, NULL);
+ gst_buffer_map (*buf, &info, GST_MAP_WRITE);
- if (ret == GST_FLOW_OK) {
- GST_DEBUG_OBJECT (teletext, "Creating image with %d rows and %d cols",
- page->rows, page->columns);
- vbi_draw_vt_page (page, VBI_PIXFMT_RGBA32_LE,
- (vbi_rgba *) GST_BUFFER_DATA (*buf), FALSE, TRUE);
- }
+ GST_DEBUG_OBJECT (teletext, "Creating image with %d rows and %d cols",
+ page->rows, page->columns);
+ vbi_draw_vt_page (page, VBI_PIXFMT_RGBA32_LE,
+ (vbi_rgba *) info.data, FALSE, TRUE);
+ gst_buffer_unmap (*buf, &info);
gst_caps_unref (out_caps);
- return ret;
+ return GST_FLOW_OK;
}
static GstFlowReturn
@@ -990,8 +866,6 @@ gst_teletextdec_export_pango_page (GstTeletextDec * teletext, vbi_page * page,
gchar **colors;
gchar **lines;
GString *subs;
- GstCaps *caps;
- GstFlowReturn ret;
guint start, stop;
guint i, j;
@@ -1023,64 +897,12 @@ gst_teletextdec_export_pango_page (GstTeletextDec * teletext, vbi_page * page,
}
/* Allocate new buffer */
- caps = gst_caps_new_simple ("text/x-pango-markup", NULL);
- ret = gst_pad_alloc_buffer (teletext->srcpad, GST_BUFFER_OFFSET_NONE,
- subs->len + 1, caps, &(*buf));
- if (G_LIKELY (ret == GST_FLOW_OK))
- GST_BUFFER_DATA (*buf) = GST_BUFFER_MALLOCDATA (*buf) =
- (guint8 *) subs->str;
- else
- gst_buffer_unref (*buf);
+ *buf = gst_buffer_new_wrapped (subs->str, subs->len + 1);
g_strfreev (lines);
g_strfreev (colors);
g_string_free (subs, FALSE);
- gst_caps_unref (caps);
- return ret;
-}
-
-static gboolean
-gst_teletextdec_push_preroll_buffer (GstTeletextDec * teletext)
-{
- GstFlowReturn ret;
- GstBuffer *buf;
- gboolean res = TRUE;
- GstStructure *structure;
- const gchar *mimetype;
- GstCaps *out_caps, *peer_caps, *pad_caps;
-
- /* the stream is sparse, we send a dummy buffer for preroll */
- peer_caps = gst_pad_peer_get_caps (teletext->srcpad);
- pad_caps = gst_pad_get_caps (teletext->srcpad);
- out_caps = gst_caps_intersect (pad_caps, peer_caps);
-
- if (gst_caps_is_empty (out_caps)) {
- res = FALSE;
- goto beach;
- }
-
- gst_caps_truncate (out_caps);
- structure = gst_caps_get_structure (out_caps, 0);
- mimetype = gst_structure_get_name (structure);
- if (g_strcmp0 (mimetype, "video/x-raw-rgb") == 0) {
- /* omit preroll buffer for this format */
- goto beach;
- }
-
- buf = gst_buffer_new_and_alloc (1);
- GST_BUFFER_DATA (buf)[0] = 0;
- gst_buffer_set_caps (buf, out_caps);
- ret = gst_pad_push (teletext->srcpad, buf);
- if (ret != GST_FLOW_OK)
- res = FALSE;
-
-beach:
- {
- gst_caps_unref (out_caps);
- gst_caps_unref (pad_caps);
- gst_caps_unref (peer_caps);
- return res;
- }
+ return GST_FLOW_OK;
}
diff --git a/ext/teletextdec/gstteletextdec.h b/ext/teletextdec/gstteletextdec.h
index 460793d35..08448f7bf 100644
--- a/ext/teletextdec/gstteletextdec.h
+++ b/ext/teletextdec/gstteletextdec.h
@@ -45,13 +45,9 @@ enum _GstTeletextOutputFormat
{
GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA,
GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT,
- GST_TELETEXTDEC_OUTPUT_FORMAT_HTML,
GST_TELETEXTDEC_OUTPUT_FORMAT_PANGO
};
-typedef void (*GstTeletextProcessBufferFunc) (GstTeletextDec *
- teletext, GstBuffer * buf);
-
struct _GstTeletextDec
{
GstElement element;
@@ -75,13 +71,11 @@ struct _GstTeletextDec
vbi_decoder *decoder;
vbi_export *exporter;
GQueue *queue;
- GMutex *queue_lock;
+ GMutex queue_lock;
GstTeletextFrame *frame;
float last_ts;
GstTeletextOutputFormat output_format;
-
- GstTeletextProcessBufferFunc process_buf_func;
};
struct _GstTeletextFrame