示例#1
0
static void
deep_check (GESTimelineElement * element, GstClockTime start,
    GstClockTime inpoint, GstClockTime duration)
{
  GList *track_elements, *tmp;
  GstClockTime rstart, rinpoint, rduration;

  rstart = ges_timeline_element_get_start (GES_TIMELINE_ELEMENT (element));
  rinpoint = ges_timeline_element_get_inpoint (GES_TIMELINE_ELEMENT (element));
  rduration =
      ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (element));

  assert_equals_uint64 (rstart, start);
  assert_equals_uint64 (rinpoint, inpoint);
  assert_equals_uint64 (rduration, duration);

  track_elements = GES_CONTAINER_CHILDREN (element);
  for (tmp = track_elements; tmp; tmp = tmp->next) {
    rstart = ges_timeline_element_get_start (GES_TIMELINE_ELEMENT (tmp->data));
    rinpoint =
        ges_timeline_element_get_inpoint (GES_TIMELINE_ELEMENT (tmp->data));
    rduration =
        ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (tmp->data));
    assert_equals_uint64 (rstart, start);
    assert_equals_uint64 (rinpoint, inpoint);
    assert_equals_uint64 (rduration, duration);
  }
}
示例#2
0
/****************************************************
 *              Our listening of children           *
 ****************************************************/
static void
_update_our_values (GESGroup * group)
{
  GList *tmp;
  GESContainer *container = GES_CONTAINER (group);
  guint32 min_layer_prio = G_MAXINT32, max_layer_prio = 0;

  for (tmp = GES_CONTAINER_CHILDREN (group); tmp; tmp = tmp->next) {
    GESContainer *child = tmp->data;

    if (GES_IS_CLIP (child)) {
      GESLayer *layer = ges_clip_get_layer (GES_CLIP (child));
      gint32 prio = ges_layer_get_priority (layer);

      min_layer_prio = MIN (prio, min_layer_prio);
      max_layer_prio = MAX (prio, max_layer_prio);
    } else if (GES_IS_GROUP (child)) {
      gint32 prio = _PRIORITY (child), height = GES_CONTAINER_HEIGHT (child);

      min_layer_prio = MIN (prio, min_layer_prio);
      max_layer_prio = MAX ((prio + height), max_layer_prio);
    }
  }

  if (min_layer_prio != _PRIORITY (group)) {
    group->priv->setting_value = TRUE;
    _set_priority0 (GES_TIMELINE_ELEMENT (group), min_layer_prio);
    group->priv->setting_value = FALSE;
    for (tmp = GES_CONTAINER_CHILDREN (group); tmp; tmp = tmp->next) {
      GESTimelineElement *child = tmp->data;
      guint32 child_prio = GES_IS_CLIP (child) ?
          ges_clip_get_layer_priority (GES_CLIP (child)) : _PRIORITY (child);

      _ges_container_set_priority_offset (container,
          child, min_layer_prio - child_prio);
    }
  }

  group->priv->max_layer_prio = max_layer_prio;
  _ges_container_set_height (GES_CONTAINER (group),
      max_layer_prio - min_layer_prio + 1);
}
void
ges_uri_clip_set_uri (GESUriClip * self, gchar * uri)
{
  if (GES_CONTAINER_CHILDREN (self)) {
    /* FIXME handle this case properly */
    GST_WARNING_OBJECT (self, "Can not change uri when already"
        "containing TrackElements");

    return;
  }

  self->priv->uri = uri;
}
static gboolean
_lookup_child (GESTimelineElement * self, const gchar * prop_name,
               GObject ** child, GParamSpec ** pspec)
{
    GList *tmp;

    for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next)
        _ges_container_add_child_properties (GES_CONTAINER (self), tmp->data);

    return
        GES_TIMELINE_ELEMENT_CLASS (ges_container_parent_class)->lookup_child
        (self, prop_name, child, pspec);
}
/**
 * ges_test_clip_set_volume:
 * @self: the #GESTestClip to set the volume on
 * @volume: the volume of the audio signal you want to use on @self
 *
 * Sets the volume of the test audio signal.
 *
 */
void
ges_test_clip_set_volume (GESTestClip * self, gdouble volume)
{
  GList *tmp;

  self->priv->volume = volume;

  for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
    GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
    if (GES_IS_AUDIO_TEST_SOURCE (trackelement))
      ges_audio_test_source_set_volume (
          (GESAudioTestSource *) trackelement, volume);
  }
}
/**
 * ges_test_clip_set_frequency:
 * @self: the #GESTestClip to set the frequency on
 * @freq: the frequency you want to use on @self
 *
 * Sets the frequency to generate. See audiotestsrc element.
 *
 */
void
ges_test_clip_set_frequency (GESTestClip * self, gdouble freq)
{
  GList *tmp;

  self->priv->freq = freq;

  for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
    GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
    if (GES_IS_AUDIO_TEST_SOURCE (trackelement))
      ges_audio_test_source_set_freq (
          (GESAudioTestSource *) trackelement, freq);
  }
}
/**
 * ges_test_clip_set_vpattern:
 * @self: the #GESTestClip to set the pattern on
 * @vpattern: the #GESVideoTestPattern to use on @self
 *
 * Sets which video pattern to display on @self.
 *
 */
void
ges_test_clip_set_vpattern (GESTestClip * self, GESVideoTestPattern vpattern)
{
  GList *tmp;

  self->priv->vpattern = vpattern;

  for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
    GESTrackElement *trackelement = (GESTrackElement *) tmp->data;
    if (GES_IS_VIDEO_TEST_SOURCE (trackelement))
      ges_video_test_source_set_pattern (
          (GESVideoTestSource *) trackelement, vpattern);
  }
}
/**
 * ges_test_clip_set_mute:
 * @self: the #GESTestClip on which to mute or unmute the audio track
 * @mute: %TRUE to mute the audio track, %FALSE to unmute it
 *
 * Sets whether the audio track of this clip is muted or not.
 *
 */
void
ges_test_clip_set_mute (GESTestClip * self, gboolean mute)
{
  GList *tmp;

  GST_DEBUG ("self:%p, mute:%d", self, mute);

  self->priv->mute = mute;

  /* Go over tracked objects, and update 'active' status on all audio objects */
  for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
    GESTrackElement *trackelement = (GESTrackElement *) tmp->data;

    if (ges_track_element_get_track (trackelement)->type ==
        GES_TRACK_TYPE_AUDIO)
      ges_track_element_set_active (trackelement, !mute);
  }
}
/**
 * ges_text_overlay_clip_set_ypos:
 * @self: the #GESTextOverlayClip* to set
 * @position: The vertical position @self is being set to
 *
 * Sets the vertical position of the text.
 */
void
ges_text_overlay_clip_set_ypos (GESTextOverlayClip * self, gdouble position)
{
  GList *tmp;

  GST_DEBUG ("self:%p, ypos:%f", self, position);

  self->priv->ypos = position;

  for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
    GESTrackElement *trackelement = (GESTrackElement *) tmp->data;

    if (ges_track_element_get_track (trackelement)->type ==
        GES_TRACK_TYPE_VIDEO)
      ges_text_overlay_set_ypos (GES_TEXT_OVERLAY (trackelement),
          self->priv->ypos);
  }
}
/**
 * ges_text_overlay_clip_set_color:
 * @self: the #GESTextOverlayClip* to set
 * @color: The color @self is being set to
 *
 * Sets the color of the text.
 */
void
ges_text_overlay_clip_set_color (GESTextOverlayClip * self, guint32 color)
{
  GList *tmp;

  GST_DEBUG ("self:%p, color:%d", self, color);

  self->priv->color = color;

  for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
    GESTrackElement *trackelement = (GESTrackElement *) tmp->data;

    if (ges_track_element_get_track (trackelement)->type ==
        GES_TRACK_TYPE_VIDEO)
      ges_text_overlay_set_color (GES_TEXT_OVERLAY (trackelement),
          self->priv->color);
  }
}
/**
 * ges_text_overlay_clip_set_valign:
 * @self: the #GESTextOverlayClip* to set vertical alignement of text on
 * @valign: #GESTextVAlign
 *
 * Sets the vertical aligment of the text.
 *
 */
void
ges_text_overlay_clip_set_valign (GESTextOverlayClip * self,
    GESTextVAlign valign)
{
  GList *tmp;

  GST_DEBUG ("self:%p, valign:%d", self, valign);

  self->priv->valign = valign;

  for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
    GESTrackElement *trackelement = (GESTrackElement *) tmp->data;

    if (ges_track_element_get_track (trackelement)->type ==
        GES_TRACK_TYPE_VIDEO)
      ges_text_overlay_set_valignment (GES_TEXT_OVERLAY
          (trackelement), self->priv->valign);
  }

}
/**
 * ges_text_overlay_clip_set_text:
 * @self: the #GESTextOverlayClip* to set text on
 * @text: the text to render. an internal copy of this text will be
 * made.
 *
 * Sets the text this clip will render.
 *
 */
void
ges_text_overlay_clip_set_text (GESTextOverlayClip * self, const gchar * text)
{
  GList *tmp;

  GST_DEBUG ("self:%p, text:%s", self, text);

  if (self->priv->text)
    g_free (self->priv->text);

  self->priv->text = g_strdup (text);

  for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
    GESTrackElement *trackelement = (GESTrackElement *) tmp->data;

    if (ges_track_element_get_track (trackelement)->type ==
        GES_TRACK_TYPE_VIDEO)
      ges_text_overlay_set_text (GES_TEXT_OVERLAY (trackelement),
          self->priv->text);
  }
}
static void
_deep_copy (GESTimelineElement * element, GESTimelineElement * copy)
{
    GList *tmp;
    GESContainer *self = GES_CONTAINER (element), *ccopy = GES_CONTAINER (copy);

    for (tmp = GES_CONTAINER_CHILDREN (element); tmp; tmp = tmp->next) {
        ChildMapping *map;

        map =
            g_slice_dup (ChildMapping, g_hash_table_lookup (self->priv->mappings,
                         tmp->data));
        map->child = ges_timeline_element_copy (tmp->data, TRUE);
        map->start_notifyid = 0;
        map->inpoint_notifyid = 0;
        map->duration_notifyid = 0;

        ccopy->priv->copied_children = g_list_prepend (ccopy->priv->copied_children,
                                       map);
    }
}
static gboolean
extractable_set_asset (GESExtractable * self, GESAsset * asset)
{
  gboolean res = TRUE;
  GESUriClip *uriclip = GES_URI_CLIP (self);
  GESUriClipAsset *uri_clip_asset;
  GESClip *clip = GES_CLIP (self);
  GESLayer *layer = ges_clip_get_layer (clip);
  GList *tmp;
  GESTimelineElement *audio_source = NULL, *video_source = NULL;

  g_return_val_if_fail (GES_IS_URI_CLIP_ASSET (asset), FALSE);

  uri_clip_asset = GES_URI_CLIP_ASSET (asset);
  if (GST_CLOCK_TIME_IS_VALID (GES_TIMELINE_ELEMENT_DURATION (clip)) == FALSE)
    _set_duration0 (GES_TIMELINE_ELEMENT (uriclip),
        ges_uri_clip_asset_get_duration (uri_clip_asset));

  ges_timeline_element_set_max_duration (GES_TIMELINE_ELEMENT (uriclip),
      ges_uri_clip_asset_get_duration (uri_clip_asset));
  ges_uri_clip_set_is_image (uriclip,
      ges_uri_clip_asset_is_image (uri_clip_asset));

  if (ges_clip_get_supported_formats (clip) == GES_TRACK_TYPE_UNKNOWN) {
    ges_clip_set_supported_formats (clip,
        ges_clip_asset_get_supported_formats (GES_CLIP_ASSET (uri_clip_asset)));
  }

  GES_TIMELINE_ELEMENT (uriclip)->asset = asset;

  if (layer) {
    GList *children = ges_container_get_children (GES_CONTAINER (self), TRUE);

    for (tmp = children; tmp; tmp = tmp->next) {
      if (GES_IS_SOURCE (tmp->data)) {
        GESTrack *track = ges_track_element_get_track (tmp->data);

        if (track->type == GES_TRACK_TYPE_AUDIO)
          audio_source = gst_object_ref (tmp->data);
        else if (track->type == GES_TRACK_TYPE_VIDEO)
          video_source = gst_object_ref (tmp->data);

        ges_track_remove_element (track, tmp->data);
        ges_container_remove (GES_CONTAINER (self), tmp->data);
      }
    }
    g_list_free_full (children, g_object_unref);

    gst_object_ref (clip);

    ges_layer_remove_clip (layer, clip);
    res = ges_layer_add_clip (layer, clip);

    for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) {
      if (GES_IS_SOURCE (tmp->data)) {
        GESTrack *track = ges_track_element_get_track (tmp->data);

        if (track->type == GES_TRACK_TYPE_AUDIO && audio_source)
          ges_track_element_copy_properties (audio_source, tmp->data);
        else if (track->type == GES_TRACK_TYPE_VIDEO && video_source)
          ges_track_element_copy_properties (video_source, tmp->data);
      }
    }

    g_clear_object (&audio_source);
    g_clear_object (&video_source);
    gst_object_unref (clip);
    gst_object_unref (layer);
  }

  if (res) {
    g_free (uriclip->priv->uri);
    uriclip->priv->uri = g_strdup (ges_asset_get_id (asset));
  }

  return res;
}