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);
}
Ejemplo n.º 2
0
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);
}