gstreamer/gst/mpegtsdemux/tsdemux.h
Edward Hervey 14e6d2d427 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
2015-12-02 14:15:04 +01:00

101 lines
3 KiB
C

/*
* tsdemux - GStreamer MPEG transport stream demuxer
* Copyright (C) 2009 Zaheer Abbas Merali
* 2010 Edward Hervey
*
* Authors:
* Zaheer Abbas Merali <zaheerabbas at merali dot org>
* Edward Hervey <edward.hervey@collabora.co.uk>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef GST_TS_DEMUX_H
#define GST_TS_DEMUX_H
#include <gst/gst.h>
#include <gst/base/gstbytereader.h>
#include <gst/base/gstflowcombiner.h>
#include "mpegtsbase.h"
#include "mpegtspacketizer.h"
G_BEGIN_DECLS
#define GST_TYPE_TS_DEMUX \
(gst_ts_demux_get_type())
#define GST_TS_DEMUX(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TS_DEMUX,GstTSDemux))
#define GST_TS_DEMUX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TS_DEMUX,GstTSDemuxClass))
#define GST_IS_TS_DEMUX(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TS_DEMUX))
#define GST_IS_TS_DEMUX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TS_DEMUX))
#define GST_TS_DEMUX_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TS_DEMUX, GstTSDemuxClass))
#define GST_TS_DEMUX_CAST(obj) ((GstTSDemux*) obj)
typedef struct _GstTSDemux GstTSDemux;
typedef struct _GstTSDemuxClass GstTSDemuxClass;
struct _GstTSDemux
{
MpegTSBase parent;
gboolean have_group_id;
guint group_id;
/* the following vars must be protected with the OBJECT_LOCK as they can be
* accessed from the application thread and the streaming thread */
gint requested_program_number; /* Required program number (ignore:-1) */
guint program_number;
gboolean emit_statistics;
/*< private >*/
MpegTSBaseProgram *program; /* Current program */
MpegTSBaseProgram *previous_program; /* Previous program, to deactivate once
* the new program becomes active */
/* segments to be sent */
GstSegment segment;
GstEvent *segment_event;
gboolean reset_segment;
/* global taglist */
GstTagList *global_tags;
/* Full stream duration */
GstClockTime duration;
/* Pending seek rate (default 1.0) */
gdouble rate;
GstFlowCombiner *flowcombiner;
/* Used when seeking for a keyframe to go backward in the stream */
guint64 last_seek_offset;
};
struct _GstTSDemuxClass
{
MpegTSBaseClass parent_class;
};
G_GNUC_INTERNAL GType gst_ts_demux_get_type (void);
G_GNUC_INTERNAL gboolean gst_ts_demux_plugin_init (GstPlugin * plugin);
G_END_DECLS
#endif /* GST_TS_DEMUX_H */