<commit_before>/* GStreamer Editing Services
 * Copyright (C) 2010 <NAME> <<EMAIL>>
 *               2010 Nokia Corporation
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/** 
 * SECTION:ges-track-transition
 * @short_description: Concrete, track-level implemenation of audio and video
 * transitinos.
 */

#include "ges-internal.h"
#include "ges-track-object.h"
#include "ges-track-transition.h"
#include "ges-timeline-transition.h"

G_DEFINE_TYPE (GESTrackTransition, ges_track_transition, GES_TYPE_TRACK_OBJECT);

static void
ges_track_transition_update_vcontroller (GESTrackTransition * self,
    GstElement * gnlobj)
{
  GST_LOG ("updating controller");

  if (!gnlobj)
    return;

  if (!(self->vcontroller))
    return;

  GST_LOG ("getting properties");
  guint64 duration;
  g_object_get (G_OBJECT (gnlobj), "duration", (guint64 *) & duration, NULL);

  GST_INFO ("duration: %d\n", duration);

  GValue start_value = { 0, };
  GValue end_value = { 0, };
  g_value_init (&start_value, G_TYPE_DOUBLE);
  g_value_init (&end_value, G_TYPE_DOUBLE);
  g_value_set_double (&start_value, self->vstart_value);
  g_value_set_double (&end_value, self->vend_value);

  GST_LOG ("setting values on controller");

  g_assert (GST_IS_CONTROLLER (self->vcontroller));
  g_assert (GST_IS_CONTROL_SOURCE (self->vcontrol_source));

  gst_interpolation_control_source_unset_all (self->vcontrol_source);
  gst_interpolation_control_source_set (self->vcontrol_source, 0, &start_value);
  gst_interpolation_control_source_set (self->vcontrol_source,
      duration, &end_value);

  GST_LOG ("done updating controller");
}

static void
ges_track_transition_update_acontroller (GESTrackTransition * self,
    GstElement * gnlobj)
{
  GST_LOG ("updating controller: gnlobj (%p) acontroller(%p) bcontroller(%p)",
      self->a_acontroller, self->a_bcontroller);

  if (!gnlobj)
    return;

  if (!(self->a_acontroller) || !(self->a_bcontroller))
    return;

  GST_LOG ("getting properties");
  guint64 duration;
  g_object_get (G_OBJECT (gnlobj), "duration", (guint64 *) & duration, NULL);

  GST_INFO ("duration: %lud\n", duration);

  GValue zero = { 0, };
  GValue one = { 0, };
  g_value_init (&zero, G_TYPE_DOUBLE);
  g_value_init (&one, G_TYPE_DOUBLE);
  g_value_set_double (&zero, 0.0);
  g_value_set_double (&one, 1.0);

  GST_LOG ("setting values on controller");

  g_assert (GST_IS_CONTROLLER (self->a_acontroller));
  g_assert (GST_IS_CONTROL_SOURCE (self->a_acontrol_source));

  g_assert (GST_IS_CONTROLLER (self->a_bcontroller));
  g_assert (GST_IS_CONTROL_SOURCE (self->a_bcontrol_source));

  gst_interpolation_control_source_unset_all (self->a_acontrol_source);
  gst_interpolation_control_source_set (self->a_acontrol_source, 0, &one);
  gst_interpolation_control_source_set (self->a_acontrol_source,
      duration, &zero);

  gst_interpolation_control_source_unset_all (self->a_bcontrol_source);
  gst_interpolation_control_source_set (self->a_bcontrol_source, 0, &zero);
  gst_interpolation_control_source_set (self->a_bcontrol_source,
      duration, &one);

  GST_LOG ("done updating controller");
}

static void
gnlobject_duration_cb (GstElement * gnlobject, GParamSpec * arg
    G_GNUC_UNUSED, GESTrackTransition * self)
{
  GESTrackType type = ((GESTrackObject *) self)->track->type;
  GST_LOG ("got duration changed signal");

  if (type == GES_TRACK_TYPE_VIDEO)
    ges_track_transition_update_vcontroller (self, gnlobject);
  else if (type == GES_TRACK_TYPE_AUDIO) {
    GST_LOG ("transition is an audio transition");
    ges_track_transition_update_acontroller (self, gnlobject);
  }
}

static void
ges_track_transition_get_property (GObject * object, guint property_id,
    GValue * value, GParamSpec * pspec)
{
  switch (property_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  }
}

static void
ges_track_transition_set_property (GObject * object, guint property_id,
    const GValue * value, GParamSpec * pspec)
{
  switch (property_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  }
}

static void
ges_track_transition_dispose (GObject * object)
{
  GESTrackTransition *self = GES_TRACK_TRANSITION (object);
  if (self->vcontroller) {
    g_object_unref (self->vcontroller);
    self->vcontroller = NULL;
    if (self->vcontrol_source)
      gst_object_unref (self->vcontrol_source);
    self->vcontrol_source = NULL;
  }

  if (self->a_acontroller) {
    g_object_unref (self->a_acontroller);
    self->a_acontroller = NULL;
    if (self->a_acontrol_source)
      gst_object_unref (self->a_acontrol_source);
    self->a_acontrol_source = NULL;
  }

  if (self->a_bcontroller) {
    g_object_unref (self->a_bcontroller);
    self->a_bcontroller = NULL;
    if (self->a_bcontrol_source)
      gst_object_unref (self->a_bcontrol_source);
    self->a_bcontrol_source = NULL;
  }

  if (self->vsmpte) {
    g_object_unref (self->vsmpte);
  }

  G_OBJECT_CLASS (ges_track_transition_parent_class)->dispose (object);
}

static void
ges_track_transition_finalize (GObject * object)
{
  G_OBJECT_CLASS (ges_track_transition_parent_class)->finalize (object);
}

static GObject *
link_element_to_mixer (GstElement * element, GstElement * mixer)
{
  GstPad *sinkpad = gst_element_get_request_pad (mixer, "sink_%d");
  GstPad *srcpad = gst_element_get_static_pad (element, "src");

  g_assert (sinkpad);
  g_assert (srcpad);

  gst_pad_link (srcpad, sinkpad);

  return G_OBJECT (sinkpad);
}

static GObject *
link_element_to_mixer_with_smpte (GstBin * bin, GstElement * element,<commit_msg>ges/ges-track-transition.c: set referece to vsmpte to NULL after freeing<commit_after>/* GStreamer Editing Services
 * Copyright (C) 2010 <NAME> <<EMAIL>>
 *               2010 Nokia Corporation
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/** 
 * SECTION:ges-track-transition
 * @short_description: Concrete, track-level implemenation of audio and video
 * transitinos.
 */

#include "ges-internal.h"
#include "ges-track-object.h"
#include "ges-track-transition.h"
#include "ges-timeline-transition.h"

G_DEFINE_TYPE (GESTrackTransition, ges_track_transition, GES_TYPE_TRACK_OBJECT);

static void
ges_track_transition_update_vcontroller (GESTrackTransition * self,
    GstElement * gnlobj)
{
  GST_LOG ("updating controller");

  if (!gnlobj)
    return;

  if (!(self->vcontroller))
    return;

  GST_LOG ("getting properties");
  guint64 duration;
  g_object_get (G_OBJECT (gnlobj), "duration", (guint64 *) & duration, NULL);

  GST_INFO ("duration: %d\n", duration);

  GValue start_value = { 0, };
  GValue end_value = { 0, };
  g_value_init (&start_value, G_TYPE_DOUBLE);
  g_value_init (&end_value, G_TYPE_DOUBLE);
  g_value_set_double (&start_value, self->vstart_value);
  g_value_set_double (&end_value, self->vend_value);

  GST_LOG ("setting values on controller");

  g_assert (GST_IS_CONTROLLER (self->vcontroller));
  g_assert (GST_IS_CONTROL_SOURCE (self->vcontrol_source));

  gst_interpolation_control_source_unset_all (self->vcontrol_source);
  gst_interpolation_control_source_set (self->vcontrol_source, 0, &start_value);
  gst_interpolation_control_source_set (self->vcontrol_source,
      duration, &end_value);

  GST_LOG ("done updating controller");
}

static void
ges_track_transition_update_acontroller (GESTrackTransition * self,
    GstElement * gnlobj)
{
  GST_LOG ("updating controller: gnlobj (%p) acontroller(%p) bcontroller(%p)",
      self->a_acontroller, self->a_bcontroller);

  if (!gnlobj)
    return;

  if (!(self->a_acontroller) || !(self->a_bcontroller))
    return;

  GST_LOG ("getting properties");
  guint64 duration;
  g_object_get (G_OBJECT (gnlobj), "duration", (guint64 *) & duration, NULL);

  GST_INFO ("duration: %lud\n", duration);

  GValue zero = { 0, };
  GValue one = { 0, };
  g_value_init (&zero, G_TYPE_DOUBLE);
  g_value_init (&one, G_TYPE_DOUBLE);
  g_value_set_double (&zero, 0.0);
  g_value_set_double (&one, 1.0);

  GST_LOG ("setting values on controller");

  g_assert (GST_IS_CONTROLLER (self->a_acontroller));
  g_assert (GST_IS_CONTROL_SOURCE (self->a_acontrol_source));

  g_assert (GST_IS_CONTROLLER (self->a_bcontroller));
  g_assert (GST_IS_CONTROL_SOURCE (self->a_bcontrol_source));

  gst_interpolation_control_source_unset_all (self->a_acontrol_source);
  gst_interpolation_control_source_set (self->a_acontrol_source, 0, &one);
  gst_interpolation_control_source_set (self->a_acontrol_source,
      duration, &zero);

  gst_interpolation_control_source_unset_all (self->a_bcontrol_source);
  gst_interpolation_control_source_set (self->a_bcontrol_source, 0, &zero);
  gst_interpolation_control_source_set (self->a_bcontrol_source,
      duration, &one);

  GST_LOG ("done updating controller");
}

static void
gnlobject_duration_cb (GstElement * gnlobject, GParamSpec * arg
    G_GNUC_UNUSED, GESTrackTransition * self)
{
  GESTrackType type = ((GESTrackObject *) self)->track->type;
  GST_LOG ("got duration changed signal");

  if (type == GES_TRACK_TYPE_VIDEO)
    ges_track_transition_update_vcontroller (self, gnlobject);
  else if (type == GES_TRACK_TYPE_AUDIO) {
    GST_LOG ("transition is an audio transition");
    ges_track_transition_update_acontroller (self, gnlobject);
  }
}

static void
ges_track_transition_get_property (GObject * object, guint property_id,
    GValue * value, GParamSpec * pspec)
{
  switch (property_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  }
}

static void
ges_track_transition_set_property (GObject * object, guint property_id,
    const GValue * value, GParamSpec * pspec)
{
  switch (property_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  }
}

static void
ges_track_transition_dispose (GObject * object)
{
  GESTrackTransition *self = GES_TRACK_TRANSITION (object);
  if (self->vcontroller) {
    g_object_unref (self->vcontroller);
    self->vcontroller = NULL;
    if (self->vcontrol_source)
      gst_object_unref (self->vcontrol_source);
    self->vcontrol_source = NULL;
  }

  if (self->a_acontroller) {
    g_object_unref (self->a_acontroller);
    self->a_acontroller = NULL;
    if (self->a_acontrol_source)
      gst_object_unref (self->a_acontrol_source);
    self->a_acontrol_source = NULL;
  }

  if (self->a_bcontroller) {
    g_object_unref (self->a_bcontroller);
    self->a_bcontroller = NULL;
    if (self->a_bcontrol_source)
      gst_object_unref (self->a_bcontrol_source);
    self->a_bcontrol_source = NULL;
  }

  if (self->vsmpte) {
    g_object_unref (self->vsmpte);
    self->vsmpte = NULL;
  }

  G_OBJECT_CLASS (ges_track_transition_parent_class)->dispose (object);
}

static void
ges_track_transition_finalize (GObject * object)
{
  G_OBJECT_CLASS (ges_track_transition_parent_class)->finalize (object);
}

static GObject *
link_element_to_mixer (GstElement * element, GstElement * mixer)
{
  GstPad *sinkpad = gst_element_get_request_pad (mixer, "sink_%d");
  GstPad *srcpad = gst_element_get_static_pad (element, "src");

  g_assert (sinkpad);
  g_assert (srcpad);

  gst_pad_link (srcpad, sinkpad);

  return G_OBJECT (sinkpad);
}

static GObject *
link_element_to_mixer_with_smpte (GstBin * bin, GstElement * element,
{'fraction_non_alphanumeric': 0.10722187104930468, 'fraction_numerical': 0.00663716814159292, 'mean_word_length': 4.939465039887377, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 102, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4708331', 'n_tokens_mistral': 4511, 'n_tokens_neox': 4386, 'n_words': 993}