static void
gst_chart_init (GstChart * chart)
{
  /* create the sink and src pads */
  chart->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
  chart->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
  gst_element_add_pad (GST_ELEMENT (chart), chart->sinkpad);
  gst_element_add_pad (GST_ELEMENT (chart), chart->srcpad);

  gst_pad_set_chain_function (chart->sinkpad, gst_chart_chain);
  gst_pad_set_link_function (chart->sinkpad, gst_chart_sinkconnect);
  gst_pad_set_link_function (chart->srcpad, gst_chart_srcconnect);

  chart->next_time = 0;

  /* reset the initial video state */
  chart->bpp = 16;
  chart->depth = 16;
  chart->width = 256;
  chart->height = 128;

  chart->samplerate = -1;
  chart->framerate = 25;        /* desired frame rate */
  chart->samples_between_frames = 0;    /* number of samples between start of successive frames */
  chart->samples_since_last_frame = 0;
}
Пример #2
0
static void
gst_mikmod_init (GstMikMod * filter)
{
  filter->sinkpad =
      gst_pad_new_from_static_template (&mikmod_sink_factory, "sink");
  filter->srcpad =
      gst_pad_new_from_static_template (&mikmod_src_factory, "src");

  gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
  gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
  gst_pad_set_link_function (filter->srcpad, gst_mikmod_srclink);
  gst_pad_set_fixate_function (filter->srcpad, gst_mikmod_srcfixate);

  gst_element_set_loop_function (GST_ELEMENT (filter), gst_mikmod_loop);

  filter->Buffer = NULL;

  filter->stereo = TRUE;
  filter->surround = TRUE;
  filter->_16bit = TRUE;
  filter->soft_music = TRUE;
  filter->soft_sndfx = TRUE;
  filter->mixfreq = 44100;
  filter->reverb = 0;
  filter->pansep = 128;
  filter->musicvolume = 128;
  filter->volume = 96;
  filter->sndfxvolume = 128;
  filter->songname = NULL;
  filter->modtype = NULL;

  filter->initialized = FALSE;
}
Пример #3
0
static void
gst_v4lmjpegsink_init (GstV4lMjpegSink * v4lmjpegsink)
{
  GstElementClass *klass = GST_ELEMENT_GET_CLASS (v4lmjpegsink);

  v4lmjpegsink->sinkpad =
      gst_pad_new_from_template (gst_element_class_get_pad_template (klass,
          "sink"), "sink");
  gst_element_add_pad (GST_ELEMENT (v4lmjpegsink), v4lmjpegsink->sinkpad);

  gst_pad_set_chain_function (v4lmjpegsink->sinkpad, gst_v4lmjpegsink_chain);
  gst_pad_set_link_function (v4lmjpegsink->sinkpad,
      gst_v4lmjpegsink_sinkconnect);

  v4lmjpegsink->clock = NULL;

  v4lmjpegsink->width = -1;
  v4lmjpegsink->height = -1;

  v4lmjpegsink->x_offset = -1;
  v4lmjpegsink->y_offset = -1;

  v4lmjpegsink->numbufs = 64;
  v4lmjpegsink->bufsize = 256;

  GST_OBJECT_FLAG_SET (v4lmjpegsink, GST_ELEMENT_THREAD_SUGGESTED);
}
Пример #4
0
static void
gst_frame_store_init (GstFrameStore * filter, GstFrameStoreClass * klass)
{
  gst_element_create_all_pads (GST_ELEMENT(filter));

  filter->srcpad = gst_element_get_pad (GST_ELEMENT(filter), "src");

  gst_pad_set_link_function (filter->srcpad, gst_frame_store_link_src);
  gst_pad_set_getcaps_function (filter->srcpad, gst_frame_store_getcaps);

  filter->sinkpad = gst_element_get_pad (GST_ELEMENT(filter), "sink");

  gst_pad_set_chain_function (filter->sinkpad, gst_frame_store_chain);
  gst_pad_set_event_function (filter->sinkpad, gst_frame_store_sink_event);
  gst_pad_set_getcaps_function (filter->sinkpad, gst_frame_store_getcaps);

  gst_frame_store_reset (filter);

  filter->range_offset = 0;
  filter->range_size = 10;
  filter->frames = g_malloc0(sizeof(GstBuffer*)*filter->range_size);
  filter->frame_number = 0;
  filter->pushed_frame_number = -1;
  filter->need_newsegment = TRUE;

  filter->cond = g_cond_new ();
  filter->lock = g_mutex_new ();
  filter->srcresult = GST_FLOW_WRONG_STATE;
}
Пример #5
0
static void
gst_negotiation_init (GstNegotiation * filter)
{
  filter->sinkpad =
      gst_pad_new_from_static_template (&gst_negotiation_sink_factory, "sink");
  gst_pad_set_getcaps_function (filter->sinkpad, gst_negotiation_getcaps);
  gst_pad_set_link_function (filter->sinkpad, gst_negotiation_pad_link);
  filter->srcpad =
      gst_pad_new_from_static_template (&gst_negotiation_src_factory, "src");
  gst_pad_set_getcaps_function (filter->srcpad, gst_negotiation_getcaps);
  gst_pad_set_link_function (filter->srcpad, gst_negotiation_pad_link);

  gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
  gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
  gst_pad_set_chain_function (filter->sinkpad, gst_negotiation_chain);
}
Пример #6
0
void
gst_median_init (GstMedian * median)
{
  median->sinkpad =
      gst_pad_new_from_static_template (&media_sink_factory, "sink");
  gst_pad_set_getcaps_function (median->sinkpad, gst_pad_proxy_getcaps);
  gst_pad_set_link_function (median->sinkpad, gst_median_link);
  gst_pad_set_chain_function (median->sinkpad, gst_median_chain);
  gst_element_add_pad (GST_ELEMENT (median), median->sinkpad);

  median->srcpad = gst_pad_new_from_static_template (&media_src_factory, "src");
  gst_pad_set_getcaps_function (median->srcpad, gst_pad_proxy_getcaps);
  gst_pad_set_link_function (median->sinkpad, gst_median_link);
  gst_element_add_pad (GST_ELEMENT (median), median->srcpad);

  median->filtersize = 5;
  median->lum_only = TRUE;
  median->active = TRUE;
}
static void
gst_hermes_colorspace_init (GstHermesColorspace * space)
{
  space->sinkpad =
      gst_pad_new_from_static_template
      (&gst_hermes_colorspace_sink_pad_template, "sink");
  gst_pad_set_link_function (space->sinkpad, gst_hermes_colorspace_link);
  gst_pad_set_getcaps_function (space->sinkpad, gst_hermes_colorspace_getcaps);
  gst_pad_set_chain_function (space->sinkpad, gst_hermes_colorspace_chain);
  gst_element_add_pad (GST_ELEMENT (space), space->sinkpad);

  space->srcpad =
      gst_pad_new_from_static_template (&gst_hermes_colorspace_src_pad_template,
      "src");
  gst_element_add_pad (GST_ELEMENT (space), space->srcpad);
  gst_pad_set_link_function (space->srcpad, gst_hermes_colorspace_link);

  space->h_handle = Hermes_ConverterInstance (0);
  space->passthru = FALSE;
}
Пример #8
0
static void
gst_artsdsink_init (GstArtsdsink * artsdsink)
{
  artsdsink->sinkpad =
      gst_pad_new_from_template (gst_element_get_pad_template (GST_ELEMENT
          (artsdsink), "sink"), "sink");
  gst_element_add_pad (GST_ELEMENT (artsdsink), artsdsink->sinkpad);
  gst_pad_set_chain_function (artsdsink->sinkpad, gst_artsdsink_chain);
  gst_pad_set_link_function (artsdsink->sinkpad, gst_artsdsink_link);

  artsdsink->connected = FALSE;
  artsdsink->mute = FALSE;
  artsdsink->connect_name = NULL;
}
Пример #9
0
static void
gst_xine_audio_sink_sub_init (GTypeInstance * instance, gpointer g_class)
{
  GstElementClass *klass = GST_ELEMENT_GET_CLASS (instance);
  GstXineAudioSink *xine = GST_XINE_AUDIO_SINK (instance);

  xine->sinkpad =
      gst_pad_new_from_template (gst_element_class_get_pad_template (klass,
          "sink"), "sink");
  gst_pad_set_chain_function (xine->sinkpad, gst_xine_audio_sink_chain);
  gst_pad_set_getcaps_function (xine->sinkpad, _xine_audio_sink_get_caps);
  gst_pad_set_link_function (xine->sinkpad, _xine_audio_sink_link);
  gst_element_add_pad (GST_ELEMENT (xine), xine->sinkpad);
}
Пример #10
0
static void
gst_overlay_init (GstOverlay * overlay)
{
  overlay->sinkpad1 =
      gst_pad_new_from_static_template (&overlay_sink1_factory, "sink1");
  gst_pad_set_link_function (overlay->sinkpad1, gst_overlay_sinkconnect);
  gst_element_add_pad (GST_ELEMENT (overlay), overlay->sinkpad1);

  overlay->sinkpad2 =
      gst_pad_new_from_static_template (&overlay_sink2_factory, "sink2");
  gst_pad_set_link_function (overlay->sinkpad2, gst_overlay_sinkconnect);
  gst_element_add_pad (GST_ELEMENT (overlay), overlay->sinkpad2);

  overlay->sinkpad3 =
      gst_pad_new_from_static_template (&overlay_sink3_factory, "sink3");
  gst_pad_set_link_function (overlay->sinkpad3, gst_overlay_sinkconnect);
  gst_element_add_pad (GST_ELEMENT (overlay), overlay->sinkpad3);

  overlay->srcpad =
      gst_pad_new_from_static_template (&overlay_src_factory, "src");
  gst_element_add_pad (GST_ELEMENT (overlay), overlay->srcpad);

  gst_element_set_loop_function (GST_ELEMENT (overlay), gst_overlay_loop);
}
static void
gst_videodrop_init (GstVideodrop * videodrop)
{
  GST_OBJECT_FLAG_SET (videodrop, GST_ELEMENT_EVENT_AWARE);

  GST_DEBUG ("gst_videodrop_init");
  videodrop->sinkpad =
      gst_pad_new_from_static_template (&gst_videodrop_sink_template, "sink");
  gst_element_add_pad (GST_ELEMENT (videodrop), videodrop->sinkpad);
  gst_pad_set_chain_function (videodrop->sinkpad, gst_videodrop_chain);
  gst_pad_set_getcaps_function (videodrop->sinkpad, gst_videodrop_getcaps);
  gst_pad_set_link_function (videodrop->sinkpad, gst_videodrop_link);

  videodrop->srcpad =
      gst_pad_new_from_static_template (&gst_videodrop_src_template, "src");
  gst_element_add_pad (GST_ELEMENT (videodrop), videodrop->srcpad);
  gst_pad_set_getcaps_function (videodrop->srcpad, gst_videodrop_getcaps);
  gst_pad_set_link_function (videodrop->srcpad, gst_videodrop_link);

  videodrop->inited = FALSE;
  videodrop->total = videodrop->pass = 0;
  videodrop->speed = 1.;
  videodrop->time_adjust = 0;
}
Пример #12
0
static void
gst_v4ljpegsrc_init (GstV4lJpegSrc * v4ljpegsrc)
{
  GstV4lSrc *v4lsrc = GST_V4LSRC (v4ljpegsrc);
  GstPad *pad = v4lsrc->srcpad;

  /*
   * Stash away and then replace the getcaps and get functions on the src pad
   */
  v4ljpegsrc->getfn = GST_RPAD_GETFUNC (pad);
  v4ljpegsrc->getcapsfn = GST_RPAD_GETCAPSFUNC (pad);

  gst_pad_set_get_function (v4lsrc->srcpad, gst_v4ljpegsrc_get);
  gst_pad_set_getcaps_function (v4lsrc->srcpad, gst_v4ljpegsrc_getcaps);
  gst_pad_set_link_function (v4lsrc->srcpad, gst_v4ljpegsrc_src_link);
}
Пример #13
0
static void
gst_tarkinenc_init (TarkinEnc * tarkinenc)
{
  tarkinenc->sinkpad = gst_pad_new_from_template (enc_sink_template, "sink");
  gst_element_add_pad (GST_ELEMENT (tarkinenc), tarkinenc->sinkpad);
  gst_pad_set_chain_function (tarkinenc->sinkpad, gst_tarkinenc_chain);
  gst_pad_set_link_function (tarkinenc->sinkpad, gst_tarkinenc_sinkconnect);

  tarkinenc->srcpad = gst_pad_new_from_template (enc_src_template, "src");
  gst_element_add_pad (GST_ELEMENT (tarkinenc), tarkinenc->srcpad);

  tarkinenc->bitrate = 3000;
  tarkinenc->s_moments = 2;
  tarkinenc->a_moments = 2;
  tarkinenc->setup = FALSE;
}
Пример #14
0
static void
gst_snapshot_init (GstSnapshot * snapshot)
{
  snapshot->sinkpad =
      gst_pad_new_from_static_template (&snapshot_sink_factory, "sink");
  gst_pad_set_link_function (snapshot->sinkpad, gst_snapshot_sinkconnect);
  gst_pad_set_chain_function (snapshot->sinkpad, gst_snapshot_chain);
  gst_element_add_pad (GST_ELEMENT (snapshot), snapshot->sinkpad);

  snapshot->srcpad =
      gst_pad_new_from_static_template (&snapshot_src_factory, "src");
  gst_element_add_pad (GST_ELEMENT (snapshot), snapshot->srcpad);

  snapshot->cur_frame = 0;
  snapshot->frame = -1;
  snapshot->snapshot_asked = FALSE;
}
Пример #15
0
static void
gst_fameenc_init (GstFameEnc * fameenc)
{
  g_assert (fameenc != NULL);
  g_assert (GST_IS_FAMEENC (fameenc));

  /* open fameenc */
  fameenc->fc = fame_open ();
  g_assert (fameenc->fc != NULL);

  /* create the sink and src pads */
  fameenc->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink");
  gst_element_add_pad (GST_ELEMENT (fameenc), fameenc->sinkpad);
  gst_pad_set_chain_function (fameenc->sinkpad, gst_fameenc_chain);
  gst_pad_set_link_function (fameenc->sinkpad, gst_fameenc_sink_link);

  fameenc->srcpad = gst_pad_new_from_static_template (&src_template, "src");
  gst_element_add_pad (GST_ELEMENT (fameenc), fameenc->srcpad);
  /* FIXME: set some more handler functions here */

  fameenc->verbose = FALSE;

  /* reset the initial video state */
  fameenc->fp.width = -1;
  fameenc->fp.height = -1;
  fameenc->initialized = FALSE;

  /* defaults */
  fameenc->fp.bitrate = 0;
  fameenc->fp.quality = 75;
  fameenc->fp.frame_rate_num = 25;
  fameenc->fp.frame_rate_den = 1;       /* avoid floating point exceptions */
  fameenc->fp.frames_per_sequence = 12;

  fameenc->pattern = g_strdup ("IPPPPPPPPPP");

  /* allocate space for the buffer */
  fameenc->buffer_size = FAMEENC_BUFFER_SIZE;   /* FIXME */
  fameenc->buffer = (unsigned char *) g_malloc (fameenc->buffer_size);

  fameenc->next_time = 0;
  fameenc->time_interval = 0;
}
static void
type_instance_init (GTypeInstance * instance, gpointer g_class)
{
  GstOmxBaseSink *self;

  self = GST_OMX_BASE_SINK (instance);

  GST_LOG_OBJECT (self, "begin");

  self->gomx = gstomx_core_new (self, G_TYPE_FROM_CLASS (g_class));
  self->in_port = g_omx_core_new_port (self->gomx, 0);

  {
    GstPad *sinkpad;
    self->sinkpad = sinkpad = GST_BASE_SINK_PAD (self);
    self->base_activatepush = GST_PAD_ACTIVATEPUSHFUNC (sinkpad);
    gst_pad_set_activatepush_function (sinkpad, activate_push);
    gst_pad_set_link_function (sinkpad, pad_sink_link);
  }

  GST_LOG_OBJECT (self, "end");
}
static void
dxr3audiosink_init (Dxr3AudioSink * sink)
{
  GstPadTemplate *temp;

  /* Create the PCM pad. */
  temp = gst_static_pad_template_get (&dxr3audiosink_pcm_sink_factory);
  sink->pcm_sinkpad = gst_pad_new_from_template (temp, "pcm_sink");
  gst_pad_set_chain_function (sink->pcm_sinkpad, dxr3audiosink_chain_pcm);
  gst_pad_set_link_function (sink->pcm_sinkpad, dxr3audiosink_pcm_sinklink);
  gst_element_add_pad (GST_ELEMENT (sink), sink->pcm_sinkpad);

  /* Create the AC3 pad. */
  temp = gst_static_pad_template_get (&dxr3audiosink_ac3_sink_factory);
  sink->ac3_sinkpad = gst_pad_new_from_template (temp, "ac3_sink");
  gst_pad_set_chain_function (sink->ac3_sinkpad, dxr3audiosink_chain_ac3);
  gst_element_add_pad (GST_ELEMENT (sink), sink->ac3_sinkpad);

  GST_OBJECT_FLAG_SET (GST_ELEMENT (sink), GST_ELEMENT_EVENT_AWARE);

  sink->card_number = 0;

  sink->audio_filename = NULL;
  sink->audio_fd = -1;

  sink->control_filename = NULL;
  sink->control_fd = -1;

  /* Since we don't know any better, we set the initial scr to 0. */
  sink->scr = 0;

  /* Initially don't use digital output. */
  sink->digital_pcm = FALSE;

  /* Initially there's no padder. */
  sink->padder = NULL;

  sink->mode = DXR3AUDIOSINK_MODE_NONE;
}
Пример #18
0
static void
type_instance_init (GTypeInstance *instance,
                    gpointer g_class)
{
    GstOmxBaseSink *self;

    self = GST_OMX_BASE_SINK (instance);

    GST_LOG_OBJECT (self, "begin");

    /* GOmx */
    {
        GOmxCore *gomx;
        self->gomx = gomx = g_omx_core_new ();
        gomx->object = self;
    }

    {
        const char *tmp;
        tmp = g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class),
                                g_quark_from_static_string ("library-name"));
        self->omx_library = g_strdup (tmp);
        tmp = g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class),
                                g_quark_from_static_string ("component-name"));
        self->omx_component = g_strdup (tmp);
    }

    {
        GstPad *sinkpad;
        self->sinkpad = sinkpad = GST_BASE_SINK_PAD (self);
        self->base_activatepush = GST_PAD_ACTIVATEPUSHFUNC (sinkpad);
        gst_pad_set_activatepush_function (sinkpad, activate_push);
        gst_pad_set_link_function (sinkpad, pad_sink_link);
    }

    GST_LOG_OBJECT (self, "end");
}
Пример #19
0
static void
gst_decklink_sink_init (GstDecklinkSink * decklinksink,
    GstDecklinkSinkClass * decklinksink_class)
{

  decklinksink->videosinkpad =
      gst_pad_new_from_static_template (&gst_decklink_sink_videosink_template,
      "sink");
  gst_pad_set_getcaps_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_getcaps));
  gst_pad_set_setcaps_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_setcaps));
  gst_pad_set_acceptcaps_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_acceptcaps));
  gst_pad_set_activate_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_activate));
  gst_pad_set_activatepush_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_activatepush));
  gst_pad_set_activatepull_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_activatepull));
  gst_pad_set_link_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_link));
  gst_pad_set_chain_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_chain));
  gst_pad_set_chain_list_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_chainlist));
  gst_pad_set_event_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_event));
  gst_pad_set_query_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_query));
  gst_pad_set_bufferalloc_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_bufferalloc));
  gst_pad_set_iterate_internal_links_function (decklinksink->videosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_iterintlink));
  gst_element_add_pad (GST_ELEMENT (decklinksink), decklinksink->videosinkpad);



  decklinksink->audiosinkpad =
      gst_pad_new_from_static_template (&gst_decklink_sink_audiosink_template,
      "audiosink");
  gst_pad_set_getcaps_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_getcaps));
  gst_pad_set_setcaps_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_setcaps));
  gst_pad_set_acceptcaps_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_acceptcaps));
  gst_pad_set_activate_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_activate));
  gst_pad_set_activatepush_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_activatepush));
  gst_pad_set_activatepull_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_activatepull));
  gst_pad_set_link_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_link));
  gst_pad_set_chain_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_chain));
  gst_pad_set_chain_list_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_chainlist));
  gst_pad_set_event_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_event));
  gst_pad_set_query_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_query));
  gst_pad_set_bufferalloc_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_bufferalloc));
  gst_pad_set_iterate_internal_links_function (decklinksink->audiosinkpad,
      GST_DEBUG_FUNCPTR (gst_decklink_sink_audiosink_iterintlink));
  gst_element_add_pad (GST_ELEMENT (decklinksink), decklinksink->audiosinkpad);


  decklinksink->cond = g_cond_new ();
  decklinksink->mutex = g_mutex_new ();
  decklinksink->audio_mutex = g_mutex_new ();

  decklinksink->mode = GST_DECKLINK_MODE_NTSC;

  decklinksink->callback = new Output;
  decklinksink->callback->decklinksink = decklinksink;

#ifdef _MSC_VER
  decklinksink->com_init_lock = g_mutex_new();
  decklinksink->com_deinit_lock = g_mutex_new();
  decklinksink->com_initialized = g_cond_new();
  decklinksink->com_uninitialize = g_cond_new();
  decklinksink->com_uninitialized = g_cond_new();

  g_mutex_lock (decklinksink->com_init_lock);

  /* create the COM initialization thread */
  g_thread_create ((GThreadFunc)gst_decklink_sink_com_thread,
    decklinksink, FALSE, NULL);

  /* wait until the COM thread signals that COM has been initialized */
  g_cond_wait (decklinksink->com_initialized, decklinksink->com_init_lock);
  g_mutex_unlock (decklinksink->com_init_lock);
#endif /* _MSC_VER */
}
static void
gst_decklink_src_init (GstDecklinkSrc * decklinksrc,
                       GstDecklinkSrcClass * decklinksrc_class)
{
    g_static_rec_mutex_init (&decklinksrc->task_mutex);
    decklinksrc->task = gst_task_create (gst_decklink_src_task, decklinksrc);
    gst_task_set_lock (decklinksrc->task, &decklinksrc->task_mutex);

    decklinksrc->audiosrcpad =
        gst_pad_new_from_static_template (&gst_decklink_src_audio_src_template,
                                          "audiosrc");
    gst_pad_set_getcaps_function (decklinksrc->audiosrcpad,
                                  GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_getcaps));
    gst_pad_set_setcaps_function (decklinksrc->audiosrcpad,
                                  GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_setcaps));
    gst_pad_set_acceptcaps_function (decklinksrc->audiosrcpad,
                                     GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_acceptcaps));
    gst_pad_set_fixatecaps_function (decklinksrc->audiosrcpad,
                                     GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_fixatecaps));
    gst_pad_set_activate_function (decklinksrc->audiosrcpad,
                                   GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_activate));
    gst_pad_set_activatepush_function (decklinksrc->audiosrcpad,
                                       GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_activatepush));
    gst_pad_set_activatepull_function (decklinksrc->audiosrcpad,
                                       GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_activatepull));
    gst_pad_set_link_function (decklinksrc->audiosrcpad,
                               GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_link));
    gst_pad_set_getrange_function (decklinksrc->audiosrcpad,
                                   GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_getrange));
    gst_pad_set_event_function (decklinksrc->audiosrcpad,
                                GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_event));
    gst_pad_set_query_function (decklinksrc->audiosrcpad,
                                GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_query));
    gst_pad_set_iterate_internal_links_function (decklinksrc->audiosrcpad,
            GST_DEBUG_FUNCPTR (gst_decklink_src_audio_src_iterintlink));
    gst_element_add_pad (GST_ELEMENT (decklinksrc), decklinksrc->audiosrcpad);



    decklinksrc->videosrcpad =
        gst_pad_new_from_template (gst_element_class_get_pad_template
                                   (GST_ELEMENT_CLASS (decklinksrc_class), "videosrc"), "videosrc");
    gst_pad_set_getcaps_function (decklinksrc->videosrcpad,
                                  GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_getcaps));
    gst_pad_set_setcaps_function (decklinksrc->videosrcpad,
                                  GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_setcaps));
    gst_pad_set_acceptcaps_function (decklinksrc->videosrcpad,
                                     GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_acceptcaps));
    gst_pad_set_fixatecaps_function (decklinksrc->videosrcpad,
                                     GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_fixatecaps));
    gst_pad_set_activate_function (decklinksrc->videosrcpad,
                                   GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_activate));
    gst_pad_set_activatepush_function (decklinksrc->videosrcpad,
                                       GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_activatepush));
    gst_pad_set_activatepull_function (decklinksrc->videosrcpad,
                                       GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_activatepull));
    gst_pad_set_link_function (decklinksrc->videosrcpad,
                               GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_link));
    gst_pad_set_getrange_function (decklinksrc->videosrcpad,
                                   GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_getrange));
    gst_pad_set_event_function (decklinksrc->videosrcpad,
                                GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_event));
    gst_pad_set_query_function (decklinksrc->videosrcpad,
                                GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_query));
    gst_pad_set_iterate_internal_links_function (decklinksrc->videosrcpad,
            GST_DEBUG_FUNCPTR (gst_decklink_src_video_src_iterintlink));
    gst_element_add_pad (GST_ELEMENT (decklinksrc), decklinksrc->videosrcpad);


    decklinksrc->cond = g_cond_new ();
    decklinksrc->mutex = g_mutex_new ();

    decklinksrc->copy_data = TRUE;
    decklinksrc->mode = GST_DECKLINK_MODE_NTSC;
    decklinksrc->connection = GST_DECKLINK_CONNECTION_SDI;
    decklinksrc->audio_connection = GST_DECKLINK_AUDIO_CONNECTION_AUTO;
    decklinksrc->subdevice = 0;

    decklinksrc->stop = FALSE;
    decklinksrc->dropped_frames = 0;
    decklinksrc->dropped_frames_old = 0;
    decklinksrc->frame_num = -1; /* -1 so will be 0 after incrementing */

#ifdef _MSC_VER
    decklinksrc->com_init_lock = g_mutex_new();
    decklinksrc->com_deinit_lock = g_mutex_new();
    decklinksrc->com_initialized = g_cond_new();
    decklinksrc->com_uninitialize = g_cond_new();
    decklinksrc->com_uninitialized = g_cond_new();

    g_mutex_lock (decklinksrc->com_init_lock);

    /* create the COM initialization thread */
    g_thread_create ((GThreadFunc)gst_decklink_src_com_thread,
                     decklinksrc, FALSE, NULL);

    /* wait until the COM thread signals that COM has been initialized */
    g_cond_wait (decklinksrc->com_initialized, decklinksrc->com_init_lock);
    g_mutex_unlock (decklinksrc->com_init_lock);
#endif /* _MSC_VER */
}
Пример #21
0
static GstPad *
gst_ghost_pad_new_full (const gchar * name, GstPadDirection dir,
    GstPadTemplate * templ)
{
  GstPad *ret;
  GstPad *internal;
  GstPadDirection otherdir;

  g_return_val_if_fail (dir != GST_PAD_UNKNOWN, NULL);

  /* OBJECT CREATION */
  if (templ) {
    ret = g_object_new (GST_TYPE_GHOST_PAD, "name", name,
        "direction", dir, "template", templ, NULL);
  } else {
    ret = g_object_new (GST_TYPE_GHOST_PAD, "name", name,
        "direction", dir, NULL);
  }

  /* Set directional padfunctions for ghostpad */
  if (dir == GST_PAD_SINK) {
    gst_pad_set_bufferalloc_function (ret,
        GST_DEBUG_FUNCPTR (gst_proxy_pad_do_bufferalloc));
    gst_pad_set_chain_function (ret,
        GST_DEBUG_FUNCPTR (gst_proxy_pad_do_chain));
  } else {
    gst_pad_set_getrange_function (ret,
        GST_DEBUG_FUNCPTR (gst_proxy_pad_do_getrange));
    gst_pad_set_checkgetrange_function (ret,
        GST_DEBUG_FUNCPTR (gst_proxy_pad_do_checkgetrange));
  }

  /* link/unlink functions */
  gst_pad_set_link_function (ret, GST_DEBUG_FUNCPTR (gst_ghost_pad_do_link));
  gst_pad_set_unlink_function (ret,
      GST_DEBUG_FUNCPTR (gst_ghost_pad_do_unlink));


  /* INTERNAL PAD, it always exists and is child of the ghostpad */
  otherdir = (dir == GST_PAD_SRC) ? GST_PAD_SINK : GST_PAD_SRC;
  if (templ) {
    internal =
        g_object_new (GST_TYPE_PROXY_PAD, "name", NULL,
        "direction", otherdir, "template", templ, NULL);
  } else {
    internal =
        g_object_new (GST_TYPE_PROXY_PAD, "name", NULL,
        "direction", otherdir, NULL);
  }
  GST_PAD_UNSET_FLUSHING (internal);

  /* Set directional padfunctions for internal pad */
  if (dir == GST_PAD_SRC) {
    gst_pad_set_bufferalloc_function (internal,
        GST_DEBUG_FUNCPTR (gst_proxy_pad_do_bufferalloc));
    gst_pad_set_chain_function (internal,
        GST_DEBUG_FUNCPTR (gst_proxy_pad_do_chain));
  } else {
    gst_pad_set_getrange_function (internal,
        GST_DEBUG_FUNCPTR (gst_proxy_pad_do_getrange));
    gst_pad_set_checkgetrange_function (internal,
        GST_DEBUG_FUNCPTR (gst_proxy_pad_do_checkgetrange));
  }

  GST_PROXY_LOCK (ret);

  /* now make the ghostpad a parent of the internal pad */
  if (!gst_object_set_parent (GST_OBJECT_CAST (internal),
          GST_OBJECT_CAST (ret)))
    goto parent_failed;

  /* The ghostpad is the parent of the internal pad and is the only object that
   * can have a refcount on the internal pad.
   * At this point, the GstGhostPad has a refcount of 1, and the internal pad has
   * a refcount of 1.
   * When the refcount of the GstGhostPad drops to 0, the ghostpad will dispose
   * it's refcount on the internal pad in the dispose method by un-parenting it.
   * This is why we don't take extra refcounts in the assignments below
   */
  GST_PROXY_PAD_INTERNAL (ret) = internal;
  GST_PROXY_PAD_INTERNAL (internal) = ret;

  /* could be more general here, iterating over all writable properties...
   * taking the short road for now tho */
  GST_GHOST_PAD_CAST (ret)->notify_id =
      g_signal_connect (internal, "notify::caps", G_CALLBACK (on_int_notify),
      ret);

  /* call function to init values of the pad caps */
  on_int_notify (internal, NULL, GST_GHOST_PAD_CAST (ret));

  /* special activation functions for the internal pad */
  gst_pad_set_activatepull_function (internal,
      GST_DEBUG_FUNCPTR (gst_ghost_pad_internal_do_activate_pull));
  gst_pad_set_activatepush_function (internal,
      GST_DEBUG_FUNCPTR (gst_ghost_pad_internal_do_activate_push));

  GST_PROXY_UNLOCK (ret);

  return ret;

  /* ERRORS */
parent_failed:
  {
    GST_WARNING_OBJECT (ret, "Could not set internal pad %s:%s",
        GST_DEBUG_PAD_NAME (internal));
    g_critical ("Could not set internal pad %s:%s",
        GST_DEBUG_PAD_NAME (internal));
    GST_PROXY_UNLOCK (ret);
    gst_object_unref (ret);
    gst_object_unref (internal);
    return NULL;
  }
}