mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
mpegtsmux: refactor init using _reset to cater for proper reuse
This commit is contained in:
parent
8cb22ffeaa
commit
ec109c390f
1 changed files with 49 additions and 27 deletions
|
@ -145,6 +145,7 @@ static void gst_mpegtsmux_set_property (GObject * object, guint prop_id,
|
||||||
static void gst_mpegtsmux_get_property (GObject * object, guint prop_id,
|
static void gst_mpegtsmux_get_property (GObject * object, guint prop_id,
|
||||||
GValue * value, GParamSpec * pspec);
|
GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
|
static void mpegtsmux_reset (MpegTsMux * mux, gboolean alloc);
|
||||||
static void mpegtsmux_dispose (GObject * object);
|
static void mpegtsmux_dispose (GObject * object);
|
||||||
static gboolean new_packet_cb (guint8 * data, guint len, void *user_data,
|
static gboolean new_packet_cb (guint8 * data, guint len, void *user_data,
|
||||||
gint64 new_pcr);
|
gint64 new_pcr);
|
||||||
|
@ -238,48 +239,37 @@ mpegtsmux_init (MpegTsMux * mux, MpegTsMuxClass * g_class)
|
||||||
(GstCollectPads2EventFunction) GST_DEBUG_FUNCPTR (mpegtsmux_sink_event),
|
(GstCollectPads2EventFunction) GST_DEBUG_FUNCPTR (mpegtsmux_sink_event),
|
||||||
mux);
|
mux);
|
||||||
|
|
||||||
mux->tsmux = tsmux_new ();
|
|
||||||
tsmux_set_write_func (mux->tsmux, new_packet_cb, mux);
|
|
||||||
|
|
||||||
mux->first = TRUE;
|
|
||||||
mux->last_flow_ret = GST_FLOW_OK;
|
|
||||||
mux->adapter = gst_adapter_new ();
|
mux->adapter = gst_adapter_new ();
|
||||||
|
|
||||||
|
/* properties */
|
||||||
mux->m2ts_mode = FALSE;
|
mux->m2ts_mode = FALSE;
|
||||||
mux->pat_interval = TSMUX_DEFAULT_PAT_INTERVAL;
|
mux->pat_interval = TSMUX_DEFAULT_PAT_INTERVAL;
|
||||||
mux->pmt_interval = TSMUX_DEFAULT_PMT_INTERVAL;
|
mux->pmt_interval = TSMUX_DEFAULT_PMT_INTERVAL;
|
||||||
|
mux->prog_map = NULL;
|
||||||
|
|
||||||
|
/* initial state */
|
||||||
|
mpegtsmux_reset (mux, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mpegtsmux_reset (MpegTsMux * mux, gboolean alloc)
|
||||||
|
{
|
||||||
|
mux->first = TRUE;
|
||||||
|
mux->last_flow_ret = GST_FLOW_OK;
|
||||||
mux->first_pcr = TRUE;
|
mux->first_pcr = TRUE;
|
||||||
mux->last_ts = 0;
|
mux->last_ts = 0;
|
||||||
mux->is_delta = TRUE;
|
mux->is_delta = TRUE;
|
||||||
|
|
||||||
mux->prog_map = NULL;
|
|
||||||
mux->streamheader = NULL;
|
mux->streamheader = NULL;
|
||||||
mux->streamheader_sent = FALSE;
|
mux->streamheader_sent = FALSE;
|
||||||
mux->force_key_unit_event = NULL;
|
mux->force_key_unit_event = NULL;
|
||||||
mux->pending_key_unit_ts = GST_CLOCK_TIME_NONE;
|
mux->pending_key_unit_ts = GST_CLOCK_TIME_NONE;
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
mpegtsmux_dispose (GObject * object)
|
|
||||||
{
|
|
||||||
MpegTsMux *mux = GST_MPEG_TSMUX (object);
|
|
||||||
|
|
||||||
if (mux->adapter) {
|
|
||||||
gst_adapter_clear (mux->adapter);
|
|
||||||
g_object_unref (mux->adapter);
|
|
||||||
mux->adapter = NULL;
|
|
||||||
}
|
|
||||||
if (mux->collect) {
|
|
||||||
gst_object_unref (mux->collect);
|
|
||||||
mux->collect = NULL;
|
|
||||||
}
|
|
||||||
if (mux->tsmux) {
|
if (mux->tsmux) {
|
||||||
tsmux_free (mux->tsmux);
|
tsmux_free (mux->tsmux);
|
||||||
mux->tsmux = NULL;
|
mux->tsmux = NULL;
|
||||||
}
|
}
|
||||||
if (mux->prog_map) {
|
|
||||||
gst_structure_free (mux->prog_map);
|
|
||||||
mux->prog_map = NULL;
|
|
||||||
}
|
|
||||||
if (mux->streamheader) {
|
if (mux->streamheader) {
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
GList *sh;
|
GList *sh;
|
||||||
|
@ -295,6 +285,33 @@ mpegtsmux_dispose (GObject * object)
|
||||||
}
|
}
|
||||||
gst_event_replace (&mux->force_key_unit_event, NULL);
|
gst_event_replace (&mux->force_key_unit_event, NULL);
|
||||||
gst_buffer_replace (&mux->out_buffer, NULL);
|
gst_buffer_replace (&mux->out_buffer, NULL);
|
||||||
|
|
||||||
|
if (alloc) {
|
||||||
|
mux->tsmux = tsmux_new ();
|
||||||
|
tsmux_set_write_func (mux->tsmux, new_packet_cb, mux);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mpegtsmux_dispose (GObject * object)
|
||||||
|
{
|
||||||
|
MpegTsMux *mux = GST_MPEG_TSMUX (object);
|
||||||
|
|
||||||
|
mpegtsmux_reset (mux, FALSE);
|
||||||
|
|
||||||
|
if (mux->adapter) {
|
||||||
|
gst_adapter_clear (mux->adapter);
|
||||||
|
g_object_unref (mux->adapter);
|
||||||
|
mux->adapter = NULL;
|
||||||
|
}
|
||||||
|
if (mux->collect) {
|
||||||
|
gst_object_unref (mux->collect);
|
||||||
|
mux->collect = NULL;
|
||||||
|
}
|
||||||
|
if (mux->prog_map) {
|
||||||
|
gst_structure_free (mux->prog_map);
|
||||||
|
mux->prog_map = NULL;
|
||||||
|
}
|
||||||
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
|
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1353,8 +1370,6 @@ mpegtsmux_change_state (GstElement * element, GstStateChange transition)
|
||||||
gst_collect_pads2_stop (mux->collect);
|
gst_collect_pads2_stop (mux->collect);
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
if (mux->adapter)
|
|
||||||
gst_adapter_clear (mux->adapter);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1363,6 +1378,13 @@ mpegtsmux_change_state (GstElement * element, GstStateChange transition)
|
||||||
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
|
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||||
|
break;
|
||||||
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
|
mpegtsmux_reset (mux, TRUE);
|
||||||
|
break;
|
||||||
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue