mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
push struct fields down to VideoTransition
This commit is contained in:
parent
fa98f4cc09
commit
e4c7d0bbcd
5 changed files with 103 additions and 95 deletions
|
@ -61,7 +61,8 @@ ges_timeline_transition_update_vtype_internal (GESTimelineObject * self,
|
|||
to = (GESTrackObject *) tr;
|
||||
|
||||
if ((to->track) && (to->track->type == GES_TRACK_TYPE_VIDEO)) {
|
||||
ges_track_transition_set_vtype (tr, value);
|
||||
ges_track_video_transition_set_type ((GESTrackVideoTransition *) tr,
|
||||
value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -153,7 +154,7 @@ ges_tl_transition_create_track_object (GESTimelineObject * obj,
|
|||
|
||||
if (track->type == GES_TRACK_TYPE_VIDEO) {
|
||||
res = GES_TRACK_OBJECT (ges_track_video_transition_new ());
|
||||
ges_track_transition_set_vtype (GES_TRACK_TRANSITION (res),
|
||||
ges_track_video_transition_set_type ((GESTrackVideoTransition *) res,
|
||||
transition->vtype);
|
||||
}
|
||||
|
||||
|
@ -162,7 +163,7 @@ ges_tl_transition_create_track_object (GESTimelineObject * obj,
|
|||
}
|
||||
|
||||
else {
|
||||
res = GES_TRACK_OBJECT (ges_track_transition_new (transition->vtype));
|
||||
res = GES_TRACK_OBJECT (ges_track_transition_new ());
|
||||
}
|
||||
|
||||
return res;
|
||||
|
|
|
@ -80,32 +80,6 @@ ges_track_transition_set_property (GObject * object, guint property_id,
|
|||
static void
|
||||
ges_track_transition_dispose (GObject * object)
|
||||
{
|
||||
GESTrackTransition *self = GES_TRACK_TRANSITION (object);
|
||||
|
||||
GST_DEBUG ("disposing");
|
||||
GST_LOG ("mixer: %p smpte: %p sinka: %p sinkb: %p",
|
||||
self->vmixer, self->vsmpte, self->sinka, self->sinkb);
|
||||
|
||||
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->vmixer && self->sinka && self->sinkb) {
|
||||
GST_DEBUG ("releasing request pads for vmixer");
|
||||
gst_element_release_request_pad (self->vmixer, self->sinka);
|
||||
gst_element_release_request_pad (self->vmixer, self->sinkb);
|
||||
gst_object_unref (self->vmixer);
|
||||
gst_object_unref (self->sinka);
|
||||
gst_object_unref (self->sinkb);
|
||||
self->vmixer = NULL;
|
||||
self->sinka = NULL;
|
||||
self->sinkb = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (ges_track_transition_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
|
@ -173,36 +147,12 @@ ges_track_transition_class_init (GESTrackTransitionClass * klass)
|
|||
static void
|
||||
ges_track_transition_init (GESTrackTransition * self)
|
||||
{
|
||||
self->vcontroller = NULL;
|
||||
self->vcontrol_source = NULL;
|
||||
self->vsmpte = NULL;
|
||||
self->vmixer = NULL;
|
||||
self->sinka = NULL;
|
||||
self->sinkb = NULL;
|
||||
self->vtype = 0;
|
||||
self->vstart_value = 0.0;
|
||||
self->vend_value = 0.0;
|
||||
}
|
||||
|
||||
void
|
||||
ges_track_transition_set_vtype (GESTrackTransition * self, gint vtype)
|
||||
{
|
||||
if (((vtype == VTYPE_CROSSFADE) && (self->vtype != VTYPE_CROSSFADE)) ||
|
||||
((vtype != VTYPE_CROSSFADE) && (self->vtype = VTYPE_CROSSFADE))) {
|
||||
GST_WARNING
|
||||
("Changing between 'crossfade' and other types is not supported\n");
|
||||
}
|
||||
|
||||
self->vtype = vtype;
|
||||
if (self->vsmpte && (vtype != VTYPE_CROSSFADE))
|
||||
g_object_set (self->vsmpte, "type", (gint) vtype, NULL);
|
||||
}
|
||||
|
||||
GESTrackTransition *
|
||||
ges_track_transition_new (gint value)
|
||||
ges_track_transition_new (void)
|
||||
{
|
||||
GESTrackTransition *ret = g_object_new (GES_TYPE_TRACK_TRANSITION, NULL);
|
||||
ret->vtype = value;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -65,25 +65,6 @@ struct _GESTrackTransition
|
|||
GESTrackObject parent;
|
||||
|
||||
/*< public >*/
|
||||
/* given to to smpte alpha element */
|
||||
gint vtype;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* these enable video interpolation */
|
||||
GstController *vcontroller;
|
||||
GstInterpolationControlSource *vcontrol_source;
|
||||
|
||||
/* so we can support changing between wipes */
|
||||
GstElement *vsmpte;
|
||||
GstElement *vmixer;
|
||||
GstPad *sinka;
|
||||
GstPad *sinkb;
|
||||
|
||||
/* these will be different depending on whether smptealpha or alpha element
|
||||
* is used */
|
||||
gdouble vstart_value;
|
||||
gdouble vend_value;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -102,8 +83,7 @@ struct _GESTrackTransitionClass {
|
|||
|
||||
GType ges_track_transition_get_type (void);
|
||||
|
||||
GESTrackTransition *ges_track_transition_new (gint value);
|
||||
void ges_track_transition_set_vtype(GESTrackTransition *tr, gint vtype);
|
||||
GESTrackTransition *ges_track_transition_new (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -81,11 +81,46 @@ ges_track_video_transition_class_init (GESTrackVideoTransitionClass * klass)
|
|||
static void
|
||||
ges_track_video_transition_init (GESTrackVideoTransition * self)
|
||||
{
|
||||
self->controller = NULL;
|
||||
self->control_source = NULL;
|
||||
self->smpte = NULL;
|
||||
self->mixer = NULL;
|
||||
self->sinka = NULL;
|
||||
self->sinkb = NULL;
|
||||
self->type = 0;
|
||||
self->start_value = 0.0;
|
||||
self->end_value = 0.0;
|
||||
}
|
||||
|
||||
static void
|
||||
ges_track_video_transition_dispose (GObject * object)
|
||||
{
|
||||
GESTrackVideoTransition *self = GES_TRACK_VIDEO_TRANSITION (object);
|
||||
|
||||
GST_DEBUG ("disposing");
|
||||
GST_LOG ("mixer: %p smpte: %p sinka: %p sinkb: %p",
|
||||
self->mixer, self->smpte, self->sinka, self->sinkb);
|
||||
|
||||
if (self->controller) {
|
||||
g_object_unref (self->controller);
|
||||
self->controller = NULL;
|
||||
if (self->control_source)
|
||||
gst_object_unref (self->control_source);
|
||||
self->control_source = NULL;
|
||||
}
|
||||
|
||||
if (self->mixer && self->sinka && self->sinkb) {
|
||||
GST_DEBUG ("releasing request pads for mixer");
|
||||
gst_element_release_request_pad (self->mixer, self->sinka);
|
||||
gst_element_release_request_pad (self->mixer, self->sinkb);
|
||||
gst_object_unref (self->mixer);
|
||||
gst_object_unref (self->sinka);
|
||||
gst_object_unref (self->sinkb);
|
||||
self->mixer = NULL;
|
||||
self->sinka = NULL;
|
||||
self->sinkb = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (ges_track_video_transition_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
|
@ -116,7 +151,7 @@ ges_track_video_transition_set_property (GObject * object,
|
|||
}
|
||||
|
||||
static GstElement *
|
||||
ges_track_video_transition_create_element (GESTrackTransition * self,
|
||||
ges_track_video_transition_create_element (GESTrackTransition * object,
|
||||
GESTrack * unused)
|
||||
{
|
||||
GstElement *topbin, *iconva, *iconvb, *oconv;
|
||||
|
@ -126,6 +161,9 @@ ges_track_video_transition_create_element (GESTrackTransition * self,
|
|||
GstPad *sinka_target, *sinkb_target, *src_target, *sinka, *sinkb, *src;
|
||||
GstController *controller;
|
||||
GstInterpolationControlSource *control_source;
|
||||
GESTrackVideoTransition *self;
|
||||
|
||||
self = GES_TRACK_VIDEO_TRANSITION (object);
|
||||
|
||||
GST_LOG ("creating a video bin");
|
||||
|
||||
|
@ -139,22 +177,22 @@ ges_track_video_transition_create_element (GESTrackTransition * self,
|
|||
g_object_set (G_OBJECT (mixer), "background", 1, NULL);
|
||||
gst_bin_add (GST_BIN (topbin), mixer);
|
||||
|
||||
if (self->vtype != VTYPE_CROSSFADE) {
|
||||
if (self->type != VTYPE_CROSSFADE) {
|
||||
link_element_to_mixer_with_smpte (GST_BIN (topbin), iconva, mixer,
|
||||
self->vtype, NULL);
|
||||
self->type, NULL);
|
||||
target = link_element_to_mixer_with_smpte (GST_BIN (topbin), iconvb,
|
||||
mixer, self->vtype, &self->vsmpte);
|
||||
mixer, self->type, &self->smpte);
|
||||
propname = "position";
|
||||
self->vstart_value = 1.0;
|
||||
self->vend_value = 0.0;
|
||||
self->start_value = 1.0;
|
||||
self->end_value = 0.0;
|
||||
} else {
|
||||
self->sinka = (GstPad *) link_element_to_mixer (iconva, mixer);
|
||||
self->sinkb = (GstPad *) link_element_to_mixer (iconvb, mixer);
|
||||
target = (GObject *) self->sinkb;
|
||||
self->vmixer = gst_object_ref (mixer);
|
||||
self->mixer = gst_object_ref (mixer);
|
||||
propname = "alpha";
|
||||
self->vstart_value = 0.0;
|
||||
self->vend_value = 1.0;
|
||||
self->start_value = 0.0;
|
||||
self->end_value = 1.0;
|
||||
}
|
||||
|
||||
gst_element_link (mixer, oconv);
|
||||
|
@ -187,8 +225,8 @@ ges_track_video_transition_create_element (GESTrackTransition * self,
|
|||
gst_interpolation_control_source_set_interpolation_mode (control_source,
|
||||
GST_INTERPOLATE_LINEAR);
|
||||
|
||||
self->vcontroller = controller;
|
||||
self->vcontrol_source = control_source;
|
||||
self->controller = controller;
|
||||
self->control_source = control_source;
|
||||
|
||||
return topbin;
|
||||
}
|
||||
|
@ -228,19 +266,20 @@ link_element_to_mixer_with_smpte (GstBin * bin, GstElement * element,
|
|||
}
|
||||
|
||||
static void
|
||||
ges_track_video_transition_duration_changed (GESTrackTransition * self,
|
||||
ges_track_video_transition_duration_changed (GESTrackTransition * object,
|
||||
GstElement * gnlobj)
|
||||
{
|
||||
GValue start_value = { 0, };
|
||||
GValue end_value = { 0, };
|
||||
guint64 duration;
|
||||
GESTrackVideoTransition *self = GES_TRACK_VIDEO_TRANSITION (object);
|
||||
|
||||
GST_LOG ("updating controller");
|
||||
|
||||
if (!gnlobj)
|
||||
return;
|
||||
|
||||
if (!(self->vcontroller))
|
||||
if (!(self->controller))
|
||||
return;
|
||||
|
||||
GST_LOG ("getting properties");
|
||||
|
@ -249,22 +288,36 @@ ges_track_video_transition_duration_changed (GESTrackTransition * self,
|
|||
GST_INFO ("duration: %d\n", duration);
|
||||
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);
|
||||
g_value_set_double (&start_value, self->start_value);
|
||||
g_value_set_double (&end_value, self->end_value);
|
||||
|
||||
GST_LOG ("setting values on controller");
|
||||
|
||||
g_assert (GST_IS_CONTROLLER (self->vcontroller));
|
||||
g_assert (GST_IS_CONTROL_SOURCE (self->vcontrol_source));
|
||||
g_assert (GST_IS_CONTROLLER (self->controller));
|
||||
g_assert (GST_IS_CONTROL_SOURCE (self->control_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,
|
||||
gst_interpolation_control_source_unset_all (self->control_source);
|
||||
gst_interpolation_control_source_set (self->control_source, 0, &start_value);
|
||||
gst_interpolation_control_source_set (self->control_source,
|
||||
duration, &end_value);
|
||||
|
||||
GST_LOG ("done updating controller");
|
||||
}
|
||||
|
||||
void
|
||||
ges_track_video_transition_set_type (GESTrackVideoTransition * self, gint type)
|
||||
{
|
||||
if (((type == VTYPE_CROSSFADE) && (self->type != VTYPE_CROSSFADE)) ||
|
||||
((type != VTYPE_CROSSFADE) && (self->type = VTYPE_CROSSFADE))) {
|
||||
GST_WARNING
|
||||
("Changing between 'crossfade' and other types is not supported\n");
|
||||
}
|
||||
|
||||
self->type = type;
|
||||
if (self->smpte && (type != VTYPE_CROSSFADE))
|
||||
g_object_set (self->smpte, "type", (gint) type, NULL);
|
||||
}
|
||||
|
||||
GESTrackVideoTransition *
|
||||
ges_track_video_transition_new (void)
|
||||
{
|
||||
|
|
|
@ -52,6 +52,27 @@ G_BEGIN_DECLS
|
|||
|
||||
struct _GESTrackVideoTransition {
|
||||
GESTrackTransition parent;
|
||||
|
||||
/*< public >*/
|
||||
/* given to to smpte alpha element */
|
||||
gint type;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* these enable video interpolation */
|
||||
GstController *controller;
|
||||
GstInterpolationControlSource *control_source;
|
||||
|
||||
/* so we can support changing between wipes */
|
||||
GstElement *smpte;
|
||||
GstElement *mixer;
|
||||
GstPad *sinka;
|
||||
GstPad *sinkb;
|
||||
|
||||
/* these will be different depending on whether smptealpha or alpha element
|
||||
* is used */
|
||||
gdouble start_value;
|
||||
gdouble end_value;
|
||||
|
||||
/*< public >*/
|
||||
};
|
||||
|
@ -70,6 +91,9 @@ struct _GESTrackVideoTransitionClass {
|
|||
|
||||
GType ges_track_video_transition_get_type (void);
|
||||
|
||||
void
|
||||
ges_track_video_transition_set_type (GESTrackVideoTransition * self, gint type);
|
||||
|
||||
GESTrackVideoTransition* ges_track_video_transition_new (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
|
Loading…
Reference in a new issue