diff options
author | Edward Hervey <edward@collabora.com> | 2013-06-14 08:35:08 +0200 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2015-09-10 15:26:55 +0200 |
commit | 5c6bf2521f8f205a474436410bcbf64ebdf57654 (patch) | |
tree | f34fdceb4dcaaf9365ede3c8b20f36059ad4d5b6 | |
parent | 779ad060a4e7cd33782571485e4990a1efc3524b (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.ac | 2 | ||||
-rw-r--r-- | ext/teletextdec/gstteletextdec.c | 358 | ||||
-rw-r--r-- | ext/teletextdec/gstteletextdec.h | 8 |
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 |