summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--gst/mpegtsparse/Makefile.am19
-rw-r--r--gst/mpegtsparse/mpegtspacketizer.c2
-rw-r--r--gst/mpegtsparse/mpegtsparse.c58
-rw-r--r--sys/dvb/dvbbasebin.c64
5 files changed, 85 insertions, 70 deletions
diff --git a/ChangeLog b/ChangeLog
index bc67e8a7..39f98e69 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-12-03 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+
+ * gst/mpegtsparse/Makefile.am:
+ * gst/mpegtsparse/mpegtspacketizer.c:
+ * gst/mpegtsparse/mpegtsparse.c:
+ Remove signals for pat, pmt, nit, eit, sdt. Replace with bus
+ messages.
+ * sys/dvb/dvbbasebin.c:
+ Instead of attaching to signals, use the bus messages.
+ Also fix up so the dvbsrc starts only outputting the info tables
+ like PAT, CAT, NIT, SDT, EIT instead of the whole ts.
+
2007-12-03 Edgard Lima <edgard.lima@indt.org.br>
* ext/metadata/gstmetadatamux.c:
diff --git a/gst/mpegtsparse/Makefile.am b/gst/mpegtsparse/Makefile.am
index 3324a32b..8da696e3 100644
--- a/gst/mpegtsparse/Makefile.am
+++ b/gst/mpegtsparse/Makefile.am
@@ -3,35 +3,16 @@ plugin_LTLIBRARIES = libgstmpegtsparse.la
libgstmpegtsparse_la_SOURCES = \
mpegtsparse.c \
mpegtspacketizer.c\
- mpegtsparsemarshal.c \
flutspatinfo.c \
flutspmtinfo.c \
flutspmtstreaminfo.c
-BUILT_SOURCES = \
- mpegtsparsemarshal.h \
- mpegtsparsemarshal.c
-CLEANFILES = $(BUILT_SOURCES)
-
-EXTRA_libgstmpegtsparse_la_SOURCES = \
- mpegtsparsemarshal.list
-
-mpegtsparsemarshal.h: mpegtsparsemarshal.list
- glib-genmarshal --header --prefix=mpegts_parse_marshal $(srcdir)/mpegtsparsemarshal.list > mpegtsparsemarshal.h.tmp
- mv mpegtsparsemarshal.h.tmp mpegtsparsemarshal.h
-
-mpegtsparsemarshal.c: mpegtsparsemarshal.list mpegtsparsemarshal.h
- echo "#include \"mpegtsparsemarshal.h\"" >> mpegtsparsemarshal.c.tmp
- glib-genmarshal --body --prefix=mpegts_parse_marshal $(srcdir)/mpegtsparsemarshal.list >> mpegtsparsemarshal.c.tmp
- mv mpegtsparsemarshal.c.tmp mpegtsparsemarshal.c
-
libgstmpegtsparse_la_CFLAGS = $(GST_CFLAGS)
libgstmpegtsparse_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS)
libgstmpegtsparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
noinst_HEADERS = \
mpegtsparse.h \
- mpegtsparsemarshal.h \
mpegtspacketizer.h \
flutspatinfo.h \
flutspmtinfo.h \
diff --git a/gst/mpegtsparse/mpegtspacketizer.c b/gst/mpegtsparse/mpegtspacketizer.c
index af759eeb..f3994e87 100644
--- a/gst/mpegtsparse/mpegtspacketizer.c
+++ b/gst/mpegtsparse/mpegtspacketizer.c
@@ -398,7 +398,7 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer * packetizer,
program_info_length = GST_READ_UINT16_BE (data) & 0x0FFF;
data += 2;
- struct_name = g_strdup_printf ("program-%d", program_number);
+ struct_name = g_strdup ("pmt");
pmt = gst_structure_new (struct_name,
"program-number", G_TYPE_UINT, program_number,
"pcr-pid", G_TYPE_UINT, pcr_pid,
diff --git a/gst/mpegtsparse/mpegtsparse.c b/gst/mpegtsparse/mpegtsparse.c
index 0cfeaa17..f0f5a7e2 100644
--- a/gst/mpegtsparse/mpegtsparse.c
+++ b/gst/mpegtsparse/mpegtsparse.c
@@ -28,7 +28,6 @@
#include <stdlib.h>
#include "mpegtsparse.h"
-#include "mpegtsparsemarshal.h"
GST_DEBUG_CATEGORY_STATIC (mpegts_parse_debug);
#define GST_CAT_DEFAULT mpegts_parse_debug
@@ -95,17 +94,6 @@ GST_STATIC_PAD_TEMPLATE ("program_%d", GST_PAD_SRC,
enum
{
- SIGNAL_PAT,
- SIGNAL_PMT,
- SIGNAL_NIT,
- SIGNAL_SDT,
- SIGNAL_EIT,
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum
-{
ARG_0,
PROP_PROGRAM_NUMBERS,
/* FILL ME */
@@ -138,8 +126,6 @@ static gboolean mpegts_parse_sink_event (GstPad * pad, GstEvent * event);
static GstStateChangeReturn mpegts_parse_change_state (GstElement * element,
GstStateChange transition);
-static guint signals[LAST_SIGNAL] = { 0 };
-
GST_BOILERPLATE (MpegTSParse, mpegts_parse, GstElement, GST_TYPE_ELEMENT);
static guint32 crc_tab[256] = {
@@ -238,27 +224,6 @@ mpegts_parse_class_init (MpegTSParseClass * klass)
g_param_spec_string ("program-numbers",
"Program Numbers",
"Colon separated list of programs", "", G_PARAM_READWRITE));
-
- signals[SIGNAL_PAT] =
- g_signal_new ("pat-info", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (MpegTSParseClass, pat_info), NULL, NULL,
- g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_STRUCTURE);
- signals[SIGNAL_PMT] =
- g_signal_new ("pmt-info", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (MpegTSParseClass, pmt_info), NULL, NULL,
- g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_STRUCTURE);
- signals[SIGNAL_NIT] =
- g_signal_new ("nit-info", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (MpegTSParseClass, nit_info), NULL, NULL,
- g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_STRUCTURE);
- signals[SIGNAL_SDT] =
- g_signal_new ("sdt-info", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (MpegTSParseClass, sdt_info), NULL, NULL,
- g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_STRUCTURE);
- signals[SIGNAL_EIT] =
- g_signal_new ("eit-info", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (MpegTSParseClass, eit_info), NULL, NULL,
- g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_STRUCTURE);
}
static gboolean
@@ -808,7 +773,9 @@ mpegts_parse_apply_pat (MpegTSParse * parse, GstStructure * pat_info)
GST_INFO_OBJECT (parse, "PAT %s", dbg);
g_free (dbg);
- g_signal_emit (parse, signals[SIGNAL_PAT], 0, pat_info);
+ gst_element_post_message (GST_ELEMENT_CAST (parse),
+ gst_message_new_element (GST_OBJECT (parse),
+ gst_structure_copy (pat_info)));
GST_OBJECT_LOCK (parse);
programs = gst_structure_get_value (pat_info, "programs");
@@ -964,28 +931,39 @@ mpegts_parse_apply_pmt (MpegTSParse * parse,
g_free (dbg);
}
- g_signal_emit (parse, signals[SIGNAL_PMT], 0, pmt_info);
+ gst_element_post_message (GST_ELEMENT_CAST (parse),
+ gst_message_new_element (GST_OBJECT (parse),
+ gst_structure_copy (pmt_info)));
}
static void
mpegts_parse_apply_nit (MpegTSParse * parse,
guint16 pmt_pid, GstStructure * nit_info)
{
- g_signal_emit (parse, signals[SIGNAL_NIT], 0, nit_info);
+ /*gst_element_post_message(GST_ELEMENT_CAST(parse),
+ * gst_message_new_element (GST_OBJECT(parse),
+ * gst_structure_copy(nit_info)));
+ */
}
static void
mpegts_parse_apply_sdt (MpegTSParse * parse,
guint16 pmt_pid, GstStructure * sdt_info)
{
- g_signal_emit (parse, signals[SIGNAL_SDT], 0, sdt_info);
+ /*gst_element_post_message(GST_ELEMENT_CAST(parse),
+ * gst_message_new_element (GST_OBJECT(parse),
+ * gst_structure_copy(sdt_info)));
+ */
}
static void
mpegts_parse_apply_eit (MpegTSParse * parse,
guint16 pmt_pid, GstStructure * eit_info)
{
- g_signal_emit (parse, signals[SIGNAL_EIT], 0, eit_info);
+ /*gst_element_post_message(GST_ELEMENT_CAST(parse),
+ * gst_message_new_element (GST_OBJECT(parse),
+ * gst_structure_copy(eit_info)));
+ */
}
static gboolean
diff --git a/sys/dvb/dvbbasebin.c b/sys/dvb/dvbbasebin.c
index 7851e49e..5457ce4e 100644
--- a/sys/dvb/dvbbasebin.c
+++ b/sys/dvb/dvbbasebin.c
@@ -107,10 +107,11 @@ static gboolean dvb_base_bin_ts_pad_probe_cb (GstPad * pad,
GstBuffer * buf, gpointer user_data);
static GstStateChangeReturn dvb_base_bin_change_state (GstElement * element,
GstStateChange transition);
-static void dvb_base_bin_pat_info_cb (GstElement * mpegtsparse,
- GstStructure * pat, DvbBaseBin * dvbbasebin);
-static void dvb_base_bin_pmt_info_cb (GstElement * mpegtsparse,
- GstStructure * pmt, DvbBaseBin * dvbbasebin);
+static void dvb_base_bin_handle_message (GstBin * bin, GstMessage * message);
+static void dvb_base_bin_pat_info_cb (DvbBaseBin * dvbbasebin,
+ GstStructure * pat);
+static void dvb_base_bin_pmt_info_cb (DvbBaseBin * dvbbasebin,
+ GstStructure * pmt);
static void dvb_base_bin_pad_added_cb (GstElement * mpegtsparse,
GstPad * pad, DvbBaseBin * dvbbasebin);
static void dvb_base_bin_pad_removed_cb (GstElement * mpegtsparse,
@@ -118,6 +119,7 @@ static void dvb_base_bin_pad_removed_cb (GstElement * mpegtsparse,
static GstPad *dvb_base_bin_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * name);
static void dvb_base_bin_release_pad (GstElement * element, GstPad * pad);
+static void dvb_base_bin_rebuild_filter (DvbBaseBin * dvbbasebin);
static DvbBaseBinStream *
dvb_base_bin_add_stream (DvbBaseBin * dvbbasebin, guint16 pid)
@@ -195,6 +197,7 @@ dvb_base_bin_class_init (DvbBaseBinClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *element_class;
+ GstBinClass *bin_class;
GstElementFactory *dvbsrc_factory;
GObjectClass *dvbsrc_class;
typedef struct
@@ -222,6 +225,9 @@ dvb_base_bin_class_init (DvbBaseBinClass * klass)
{0, NULL}
};
+ bin_class = GST_BIN_CLASS (klass);
+ bin_class->handle_message = dvb_base_bin_handle_message;
+
element_class = GST_ELEMENT_CLASS (klass);
element_class->change_state = dvb_base_bin_change_state;
@@ -309,9 +315,8 @@ dvb_base_bin_init (DvbBaseBin * dvbbasebin, DvbBaseBinClass * klass)
dvbbasebin->dvbsrc = gst_element_factory_make ("dvbsrc", NULL);
dvbbasebin->buffer_queue = gst_element_factory_make ("queue", NULL);
dvbbasebin->mpegtsparse = gst_element_factory_make ("mpegtsparse", NULL);
+
g_object_connect (dvbbasebin->mpegtsparse,
- "signal::pat-info", dvb_base_bin_pat_info_cb, dvbbasebin,
- "signal::pmt-info", dvb_base_bin_pmt_info_cb, dvbbasebin,
"signal::pad-added", dvb_base_bin_pad_added_cb, dvbbasebin,
"signal::pad-removed", dvb_base_bin_pad_removed_cb, dvbbasebin, NULL);
@@ -331,6 +336,14 @@ dvb_base_bin_init (DvbBaseBin * dvbbasebin, DvbBaseBinClass * klass)
dvbbasebin->disposed = FALSE;
dvb_base_bin_reset (dvbbasebin);
+
+ /* add PAT, CAT, NIT, SDT, EIT to pids filter for dvbsrc */
+ dvb_base_bin_add_stream (dvbbasebin, 0);
+ dvb_base_bin_add_stream (dvbbasebin, 1);
+ dvb_base_bin_add_stream (dvbbasebin, 10);
+ dvb_base_bin_add_stream (dvbbasebin, 11);
+ dvb_base_bin_add_stream (dvbbasebin, 12);
+ dvb_base_bin_rebuild_filter (dvbbasebin);
}
static void
@@ -749,8 +762,40 @@ dvb_base_bin_deactivate_program (DvbBaseBin * dvbbasebin,
}
static void
-dvb_base_bin_pat_info_cb (GstElement * mpegtsparse,
- GstStructure * pat_info, DvbBaseBin * dvbbasebin)
+dvb_base_bin_handle_message (GstBin * bin, GstMessage * message)
+{
+ DvbBaseBin *dvbbasebin;
+
+ dvbbasebin = GST_DVB_BASE_BIN (bin);
+
+ if (message->type == GST_MESSAGE_ELEMENT &&
+ GST_ELEMENT (message->src) == GST_ELEMENT (dvbbasebin->mpegtsparse)) {
+ const gchar *structure_name = gst_structure_get_name (message->structure);
+
+ if (strcmp (structure_name, "pat") == 0)
+ dvb_base_bin_pat_info_cb (dvbbasebin, message->structure);
+ else if (strcmp (structure_name, "pmt") == 0)
+ dvb_base_bin_pmt_info_cb (dvbbasebin, message->structure);
+
+ /*else if (strcmp (structure_name, "nit") == 0)
+ dvb_base_bin_nit_info_cb (dvbbasebin, message->structure);
+ else if (strcmp (structure_name, "sdt") == 0)
+ dvb_base_bin_sdt_info_cb (dvbbasebin, message->structure);
+ else if (strcmp (structure_name, "eit") == 0)
+ dvb_base_bin_eit_info_cb (dvbbasebin, message->structure); */
+ /* forward the message on */
+ gst_element_post_message (GST_ELEMENT_CAST (bin), message);
+ } else {
+ /* chain up */
+ GST_BIN_CLASS (parent_class)->handle_message (bin, message);
+ }
+
+}
+
+
+
+static void
+dvb_base_bin_pat_info_cb (DvbBaseBin * dvbbasebin, GstStructure * pat_info)
{
DvbBaseBinProgram *program;
DvbBaseBinStream *stream;
@@ -798,8 +843,7 @@ dvb_base_bin_pat_info_cb (GstElement * mpegtsparse,
}
static void
-dvb_base_bin_pmt_info_cb (GstElement * mpegtsparse,
- GstStructure * pmt, DvbBaseBin * dvbbasebin)
+dvb_base_bin_pmt_info_cb (DvbBaseBin * dvbbasebin, GstStructure * pmt)
{
DvbBaseBinProgram *program;
guint program_number;