static void gst_ss_demux_stream_init (GstSSDemux *demux, GstSSDemuxStream *stream, SS_STREAM_TYPE stream_type) { stream->cond = g_cond_new (); stream->lock = g_mutex_new (); stream->queue = g_queue_new (); stream->parent = demux; stream->pipe = NULL; stream->urisrc = NULL; stream->parser = NULL; stream->sink = NULL; stream->frag_cnt = 0; stream->type = stream_type ; stream->uri = NULL; stream->start_ts = -1; stream->sent_ns = FALSE; stream->switch_ts = GST_CLOCK_TIME_NONE; stream->avg_dur = GST_CLOCK_TIME_NONE; if (stream->type == SS_STREAM_VIDEO) { stream->pad = gst_pad_new_from_static_template (&ssdemux_videosrc_template, "video"); stream->name = g_strdup("video"); } else if (stream->type == SS_STREAM_AUDIO) { stream->pad = gst_pad_new_from_static_template (&ssdemux_audiosrc_template, "audio"); stream->name = g_strdup("audio"); } else if (stream->type == SS_STREAM_TEXT) { stream->pad = gst_pad_new_from_static_template (&ssdemux_subsrc_template, "subtitle"); stream->name = g_strdup("text"); } GST_PAD_ELEMENT_PRIVATE (stream->pad) = stream; gst_pad_use_fixed_caps (stream->pad); gst_pad_set_event_function (stream->pad, gst_ss_demux_handle_src_event); gst_pad_set_query_function (stream->pad, gst_ss_demux_handle_src_query); stream->caps = ssm_parse_get_stream_caps (demux->parser, stream->type); g_print ("prepare video caps = %s", gst_caps_to_string(stream->caps)); GST_DEBUG_OBJECT (demux, "setting caps %" GST_PTR_FORMAT, stream->caps); gst_pad_set_caps (stream->pad, stream->caps); GST_DEBUG_OBJECT (demux, "adding pad %s %p to demux %p", GST_OBJECT_NAME (stream->pad), stream->pad, demux); gst_pad_set_active (stream->pad, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (demux), stream->pad); }
static gboolean sink_event_func (GstPad * pad, GstObject * parent, GstEvent * event) { GList **expected = GST_PAD_ELEMENT_PRIVATE (pad), *l; GstEvent *exp; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS:{ GstCaps *recvcaps, *expectcaps; l = g_list_first (*expected); exp = GST_EVENT (l->data); gst_event_parse_caps (event, &recvcaps); gst_event_parse_caps (exp, &expectcaps); fail_unless (gst_caps_is_equal (recvcaps, expectcaps)); break; } case GST_EVENT_SEGMENT:{ const GstSegment *recvseg, *expectseg; l = g_list_last (*expected); exp = GST_EVENT (l->data); gst_event_parse_segment (event, &recvseg); gst_event_parse_segment (exp, &expectseg); fail_unless_equals_uint64 (recvseg->position, expectseg->position); break; } default: break; } return gst_pad_event_default (pad, parent, event); }