video-source: Add a videorate in video-source.

And control it in framepositionner.

Conflicts:
	ges/ges-video-source.c
This commit is contained in:
Simon Corsin 2013-09-05 01:03:51 +02:00 committed by MathieuDuponchelle
parent 974a8dd4ae
commit 3970e2fac7
3 changed files with 34 additions and 18 deletions

View file

@ -81,7 +81,7 @@ ges_video_source_create_element (GESTrackElement * trksrc)
GstElement *sub_element;
GESVideoSourceClass *source_class = GES_VIDEO_SOURCE_GET_CLASS (trksrc);
GESVideoSource *self;
GstElement *positionner, *videoscale, *capsfilter;
GstElement *positionner, *videoscale, *videorate, *capsfilter;
const gchar *props[] = { "alpha", "posx", "posy", "width", "height", NULL };
GESTimelineElement *parent;
@ -98,6 +98,7 @@ ges_video_source_create_element (GESTrackElement * trksrc)
videoscale =
gst_element_factory_make ("videoscale", "track-element-videoscale");
videorate = gst_element_factory_make ("videorate", "track-element-videorate");
capsfilter =
gst_element_factory_make ("capsfilter", "track-element-capsfilter");
@ -107,7 +108,7 @@ ges_video_source_create_element (GESTrackElement * trksrc)
ges_track_element_add_children_props (trksrc, positionner, NULL, NULL, props);
topbin =
ges_source_create_topbin ("videosrcbin", sub_element, positionner,
videoscale, capsfilter, NULL);
videoscale, videorate, capsfilter, NULL);
parent = ges_timeline_element_get_parent (GES_TIMELINE_ELEMENT (trksrc));
if (parent) {
self->priv->positionner = GST_FRAME_POSITIONNER (positionner);

View file

@ -72,9 +72,9 @@ _weak_notify_cb (GstFramePositionner * pos, GObject * old)
}
static void
gst_frame_positionner_update_size (GstFramePositionner * pos)
gst_frame_positionner_update_properties (GstFramePositionner * pos)
{
GstCaps *size_caps;
GstCaps *caps;
gint final_width;
gint final_height;
@ -85,30 +85,36 @@ gst_frame_positionner_update_size (GstFramePositionner * pos)
final_height = (pos->height > 0) ? pos->height : pos->track_height;
if (final_width == 0 && final_height == 0)
size_caps = gst_caps_new_empty_simple ("video/x-raw");
caps = gst_caps_new_empty_simple ("video/x-raw");
else if (final_width == 0)
size_caps =
caps =
gst_caps_new_simple ("video/x-raw", "height", G_TYPE_INT, final_height,
NULL);
else if (final_height == 0)
size_caps =
caps =
gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT, final_width,
NULL);
else
size_caps =
caps =
gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT,
final_width, "height", G_TYPE_INT, final_height, NULL);
GST_DEBUG_OBJECT (pos, "updated size to : %d %d", final_width, final_height);
g_object_set (pos->capsfilter, "caps", size_caps, NULL);
if (pos->fps_n != -1)
gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, pos->fps_n,
pos->fps_d, NULL);
GST_DEBUG_OBJECT (pos, "setting caps : %s", gst_caps_to_string (caps));
g_object_set (pos->capsfilter, "caps", caps, NULL);
g_object_notify (G_OBJECT (pos), "width");
g_object_notify (G_OBJECT (pos), "height");
}
static void
sync_size_from_caps (GstFramePositionner * pos, GstCaps * caps)
sync_properties_from_caps (GstFramePositionner * pos, GstCaps * caps)
{
gint width, height;
@ -122,30 +128,35 @@ sync_size_from_caps (GstFramePositionner * pos, GstCaps * caps)
width = 0;
if (!gst_structure_get_int (structure, "height", &height))
width = 0;
if (!gst_structure_get_fraction (structure, "framerate", &(pos->fps_n),
&(pos->fps_d)))
pos->fps_n = -1;
}
pos->track_width = width;
pos->track_height = height;
GST_DEBUG_OBJECT (pos, "syncing size from caps : %d %d", width, height);
GST_DEBUG_OBJECT (pos, "syncing framerate from caps : %d/%d", pos->fps_n,
pos->fps_d);
gst_frame_positionner_update_size (pos);
gst_frame_positionner_update_properties (pos);
}
static void
sync_size_with_track (GstFramePositionner * pos, GESTrack * track)
sync_properties_with_track (GstFramePositionner * pos, GESTrack * track)
{
GstCaps *caps;
g_object_get (track, "restriction-caps", &caps, NULL);
sync_size_from_caps (pos, caps);
sync_properties_from_caps (pos, caps);
}
static void
_track_restriction_changed_cb (GESTrack * track, GParamSpec * arg G_GNUC_UNUSED,
GstFramePositionner * pos)
{
sync_size_with_track (pos, track);
sync_properties_with_track (pos, track);
}
static void
@ -169,7 +180,7 @@ _track_changed_cb (GESTrackElement * trksrc, GParamSpec * arg G_GNUC_UNUSED,
GST_DEBUG_OBJECT (pos, "connecting to track : %p", pos->current_track);
g_signal_connect (pos->current_track, "notify::restriction-caps",
(GCallback) _track_restriction_changed_cb, pos);
sync_size_with_track (pos, pos->current_track);
sync_properties_with_track (pos, pos->current_track);
} else
pos->current_track = NULL;
}
@ -190,7 +201,7 @@ ges_frame_positionner_set_source_and_filter (GstFramePositionner * pos,
(GCallback) _track_restriction_changed_cb, pos);
g_signal_connect (trksrc, "notify::track", (GCallback) _track_changed_cb,
pos);
sync_size_with_track (pos, pos->current_track);
sync_properties_with_track (pos, pos->current_track);
}
static void
@ -302,6 +313,8 @@ gst_frame_positionner_init (GstFramePositionner * framepositionner)
framepositionner->zorder = 0;
framepositionner->width = 0;
framepositionner->height = 0;
framepositionner->fps_n = -1;
framepositionner->fps_d = -1;
framepositionner->track_width = 0;
framepositionner->track_height = 0;
framepositionner->capsfilter = NULL;
@ -332,11 +345,11 @@ gst_frame_positionner_set_property (GObject * object, guint property_id,
break;
case PROP_WIDTH:
framepositionner->width = g_value_get_int (value);
gst_frame_positionner_update_size (framepositionner);
gst_frame_positionner_update_properties (framepositionner);
break;
case PROP_HEIGHT:
framepositionner->height = g_value_get_int (value);
gst_frame_positionner_update_size (framepositionner);
gst_frame_positionner_update_properties (framepositionner);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);

View file

@ -53,6 +53,8 @@ struct _GstFramePositionner
gint height;
gint track_width;
gint track_height;
gint fps_n;
gint fps_d;
};
struct _GstFramePositionnerClass