mpegtsmux: refactor init using _reset to cater for proper reuse

This commit is contained in:
Mark Nauwelaerts 2012-06-05 11:52:14 +02:00 committed by Sebastian Dröge
parent 8cb22ffeaa
commit ec109c390f

View file

@ -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;
} }