static void mpegtsmux_init (MpegTsMux * mux, MpegTsMuxClass * g_class) { mux->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&mpegtsmux_src_factory), "src"); gst_pad_use_fixed_caps (mux->srcpad); gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad); mux->collect = gst_collect_pads_new (); gst_collect_pads_set_function (mux->collect, (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (mpegtsmux_collected), mux); mux->tsmux = tsmux_new (); tsmux_set_write_func (mux->tsmux, new_packet_cb, mux); mux->program = tsmux_program_new (mux->tsmux); mux->first = TRUE; mux->last_flow_ret = GST_FLOW_OK; mux->adapter = gst_adapter_new (); mux->m2ts_mode = FALSE; mux->first_pcr = TRUE; mux->last_ts = 0; }
static GstFlowReturn mpegtsmux_create_streams (MpegTsMux * mux) { GstFlowReturn ret = GST_FLOW_OK; GSList *walk = mux->collect->data; /* Create the streams */ while (walk) { GstCollectData *c_data = (GstCollectData *) walk->data; MpegTsPadData *ts_data = (MpegTsPadData *) walk->data; gchar *name = NULL; walk = g_slist_next (walk); if (ts_data->prog_id == -1) { name = GST_PAD_NAME (c_data->pad); if (mux->prog_map != NULL && gst_structure_has_field (mux->prog_map, name)) { gint idx; gboolean ret = gst_structure_get_int (mux->prog_map, name, &idx); if (!ret) { GST_ELEMENT_ERROR (mux, STREAM, MUX, ("Reading program map failed. Assuming default"), (NULL)); idx = DEFAULT_PROG_ID; } if (idx < 0 || idx >= MAX_PROG_NUMBER) { GST_DEBUG_OBJECT (mux, "Program number %d associate with pad %s out " "of range (max = %d); DEFAULT_PROGRAM = %d is used instead", idx, name, MAX_PROG_NUMBER, DEFAULT_PROG_ID); idx = DEFAULT_PROG_ID; } ts_data->prog_id = idx; } else { ts_data->prog_id = DEFAULT_PROG_ID; } } ts_data->prog = mux->programs[ts_data->prog_id]; if (ts_data->prog == NULL) { ts_data->prog = tsmux_program_new (mux->tsmux); if (ts_data->prog == NULL) goto no_program; tsmux_set_pmt_interval (ts_data->prog, mux->pmt_interval); mux->programs[ts_data->prog_id] = ts_data->prog; } if (ts_data->stream == NULL) { ret = mpegtsmux_create_stream (mux, ts_data, c_data->pad); if (ret != GST_FLOW_OK) goto no_stream; } } return GST_FLOW_OK; no_program: GST_ELEMENT_ERROR (mux, STREAM, MUX, ("Could not create new program"), (NULL)); return GST_FLOW_ERROR; no_stream: GST_ELEMENT_ERROR (mux, STREAM, MUX, ("Could not create handler for stream"), (NULL)); return ret; }