summaryrefslogtreecommitdiff
path: root/gst/mpegtsdemux/mpegtsbase.c
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2015-09-10 14:55:05 +0200
committerEdward Hervey <bilboed@bilboed.com>2015-12-02 14:15:04 +0100
commit14e6d2d42736a66cd83b08113f4a067943443b11 (patch)
tree63a8996be1eece0f8d91a453e95a8b2fb6833179 /gst/mpegtsdemux/mpegtsbase.c
parent905158a055d8020cf6be79a5a9fbfc6979e37639 (diff)
downloadgstreamer-plugins-bad-14e6d2d42736a66cd83b08113f4a067943443b11.tar.gz
mpegtsdemux: Allow deactivation of programs to be delayed
When changing programs, the order of events needs to be the following: * add pads from new program * send EOS on old pads * remove old pads * emit 'no-more-pads' Previously tsdemux was not doing that, and was first deactivating and removing old pads before adding new ones. We fix this by allowing subclasses of mpegtsbase to be able to handle themselves the deactivation of programs. In this case tsdemux will properly deactivate it once it has activated the new program. https://bugzilla.gnome.org/show_bug.cgi?id=750402
Diffstat (limited to 'gst/mpegtsdemux/mpegtsbase.c')
-rw-r--r--gst/mpegtsdemux/mpegtsbase.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index d46a47e94..3dcde601b 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -74,6 +74,8 @@ static void mpegts_base_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static void mpegts_base_free_program (MpegTSBaseProgram * program);
+static void mpegts_base_deactivate_program (MpegTSBase * base,
+ MpegTSBaseProgram * program);
static gboolean mpegts_base_sink_activate (GstPad * pad, GstObject * parent);
static gboolean mpegts_base_sink_activate_mode (GstPad * pad,
GstObject * parent, GstPadMode mode, gboolean active);
@@ -105,12 +107,21 @@ _extra_init (void)
G_DEFINE_TYPE_WITH_CODE (MpegTSBase, mpegts_base, GST_TYPE_ELEMENT,
_extra_init ());
+/* Default implementation is that mpegtsbase can remove any program */
+static gboolean
+mpegts_base_can_remove_program (MpegTSBase * base, MpegTSBaseProgram * program)
+{
+ return TRUE;
+}
+
static void
mpegts_base_class_init (MpegTSBaseClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *element_class;
+ klass->can_remove_program = mpegts_base_can_remove_program;
+
element_class = GST_ELEMENT_CLASS (klass);
element_class->change_state = mpegts_base_change_state;
@@ -411,6 +422,16 @@ mpegts_base_free_program (MpegTSBaseProgram * program)
}
void
+mpegts_base_deactivate_and_free_program (MpegTSBase * base,
+ MpegTSBaseProgram * program)
+{
+ GST_DEBUG_OBJECT (base, "program_number : %d", program->program_number);
+
+ mpegts_base_deactivate_program (base, program);
+ mpegts_base_free_program (program);
+}
+
+static void
mpegts_base_remove_program (MpegTSBase * base, gint program_number)
{
GST_DEBUG_OBJECT (base, "program_number : %d", program_number);
@@ -472,7 +493,7 @@ mpegts_base_program_add_stream (MpegTSBase * base,
return bstream;
}
-void
+static void
mpegts_base_program_remove_stream (MpegTSBase * base,
MpegTSBaseProgram * program, guint16 pid)
{
@@ -771,6 +792,7 @@ mpegts_base_apply_pat (MpegTSBase * base, GstMpegtsSection * section)
}
if (old_pat) {
+ MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base);
/* deactivate the old table */
GST_LOG ("Deactivating old Program Association Table");
@@ -791,8 +813,10 @@ mpegts_base_apply_pat (MpegTSBase * base, GstMpegtsSection * section)
GST_INFO_OBJECT (base, "PAT removing program 0x%04x 0x%04x",
patp->program_number, patp->network_or_program_map_PID);
- mpegts_base_deactivate_program (base, program);
- mpegts_base_remove_program (base, patp->program_number);
+ if (klass->can_remove_program (base, program)) {
+ mpegts_base_deactivate_program (base, program);
+ mpegts_base_remove_program (base, patp->program_number);
+ }
/* FIXME: when this happens it may still be pmt pid of another
* program, so setting to False may make it go through expensive
* path in is_psi unnecessarily */
@@ -854,6 +878,7 @@ mpegts_base_apply_pmt (MpegTSBase * base, GstMpegtsSection * section)
/* If the current program is active, this means we have a new program */
if (old_program->active) {
+ MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base);
old_program = mpegts_base_steal_program (base, program_number);
program = mpegts_base_new_program (base, program_number, section->pid);
program->patcount = old_program->patcount;
@@ -861,8 +886,12 @@ mpegts_base_apply_pmt (MpegTSBase * base, GstMpegtsSection * section)
GINT_TO_POINTER (program_number), program);
/* Desactivate the old program */
- mpegts_base_deactivate_program (base, old_program);
- mpegts_base_free_program (old_program);
+ /* FIXME : THIS IS BREAKING THE STREAM SWITCHING LOGIC !
+ * */
+ if (klass->can_remove_program (base, old_program)) {
+ mpegts_base_deactivate_program (base, old_program);
+ mpegts_base_free_program (old_program);
+ }
initial_program = FALSE;
} else
program = old_program;