static void gst_videomixer_pad_class_init (GstVideoMixerPadClass * klass);
+
static void gst_videomixer_pad_init (GstVideoMixerPad * mixerpad);
+
static void gst_videomixer_pad_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static void gst_videomixer_pad_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static gboolean gst_videomixer_src_event (GstPad * pad, GstEvent * event);
+
static gboolean gst_videomixer_sink_event (GstPad * pad, GstEvent * event);
const GValue * value, GParamSpec * pspec)
{
GstVideoMixerPad *pad;
+
GstVideoMixer *mix;
pad = GST_VIDEO_MIXER_PAD (object);
gst_videomixer_set_master_geometry (GstVideoMixer * mix)
{
GSList *walk;
+
gint width = 0, height = 0, fps_n = 0, fps_d = 0;
+
GstVideoMixerPad *master = NULL;
walk = mix->sinkpads;
gst_videomixer_pad_sink_setcaps (GstPad * pad, GstCaps * vscaps)
{
GstVideoMixer *mix;
+
GstVideoMixerPad *mixpad;
+
GstStructure *structure;
+
gint in_width, in_height;
+
gboolean ret = FALSE;
+
const GValue *framerate;
mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
gst_video_mixer_background_get_type (void)
{
static GType video_mixer_background_type = 0;
+
static const GEnumValue video_mixer_background[] = {
{VIDEO_MIXER_BACKGROUND_CHECKER, "Checker pattern", "checker"},
{VIDEO_MIXER_BACKGROUND_BLACK, "Black", "black"},
static void gst_videomixer_finalize (GObject * object);
static GstCaps *gst_videomixer_getcaps (GstPad * pad);
+
static gboolean gst_videomixer_query (GstPad * pad, GstQuery * query);
static GstFlowReturn gst_videomixer_collected (GstCollectPads * pads,
static GstPad *gst_videomixer_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * name);
static void gst_videomixer_release_pad (GstElement * element, GstPad * pad);
+
static void gst_videomixer_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_videomixer_get_property (GObject * object, guint prop_id,
guint index)
{
GstVideoMixer *mix = GST_VIDEO_MIXER (child_proxy);
+
GstObject *obj;
GST_VIDEO_MIXER_STATE_LOCK (mix);
gst_videomixer_child_proxy_get_children_count (GstChildProxy * child_proxy)
{
guint count = 0;
+
GstVideoMixer *mix = GST_VIDEO_MIXER (child_proxy);
GST_VIDEO_MIXER_STATE_LOCK (mix);
gst_videomixer_class_init (GstVideoMixerClass * klass)
{
GObjectClass *gobject_class;
+
GstElementClass *gstelement_class;
gobject_class = (GObjectClass *) klass;
gst_videomixer_query_duration (GstVideoMixer * mix, GstQuery * query)
{
gint64 max;
+
gboolean res;
+
GstFormat format;
+
GstIterator *it;
+
gboolean done;
/* parse format */
it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix));
while (!done) {
GstIteratorResult ires;
+
gpointer item;
ires = gst_iterator_next (it, &item);
case GST_ITERATOR_OK:
{
GstPad *pad = GST_PAD_CAST (item);
+
gint64 duration;
/* ask sink peer for duration */
else if (duration > max)
max = duration;
}
+ gst_object_unref (pad);
break;
}
case GST_ITERATOR_RESYNC:
gst_videomixer_query_latency (GstVideoMixer * mix, GstQuery * query)
{
GstClockTime min, max;
+
gboolean live;
+
gboolean res;
+
GstIterator *it;
+
gboolean done;
res = TRUE;
it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix));
while (!done) {
GstIteratorResult ires;
+
gpointer item;
ires = gst_iterator_next (it, &item);
case GST_ITERATOR_OK:
{
GstPad *pad = GST_PAD_CAST (item);
+
GstQuery *peerquery;
+
GstClockTime min_cur, max_cur;
+
gboolean live_cur;
peerquery = gst_query_new_latency ();
}
gst_query_unref (peerquery);
+ gst_object_unref (pad);
break;
}
case GST_ITERATOR_RESYNC:
gst_videomixer_query (GstPad * pad, GstQuery * query)
{
GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
+
gboolean res = FALSE;
switch (GST_QUERY_TYPE (query)) {
gst_videomixer_getcaps (GstPad * pad)
{
GstVideoMixer *mix;
+
GstCaps *caps;
+
GstStructure *structure;
mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
GstPadTemplate * templ, const gchar * req_name)
{
GstVideoMixer *mix = NULL;
+
GstVideoMixerPad *mixpad = NULL;
+
GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
g_return_val_if_fail (templ != NULL, NULL);
if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) {
gint serial = 0;
+
gchar *name = NULL;
+
GstVideoMixerCollect *mixcol = NULL;
if (req_name == NULL || strlen (req_name) < 6) {
gst_videomixer_release_pad (GstElement * element, GstPad * pad)
{
GstVideoMixer *mix = NULL;
+
GstVideoMixerPad *mixpad;
mix = GST_VIDEO_MIXER (element);
guint8 * dest, gint dest_width, gint dest_height)
{
gint alpha, b_alpha;
+
gint i, j;
+
gint src_stride, dest_stride;
+
gint src_add, dest_add;
+
gint Y, U, V;
src_stride = src_width * 4;
gst_videomixer_fill_queues (GstVideoMixer * mix)
{
GSList *walk = NULL;
+
gboolean eos = TRUE;
g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), FALSE);
walk = mix->collect->data;
while (walk) {
GstCollectData *data = (GstCollectData *) walk->data;
+
GstVideoMixerCollect *mixcol = (GstVideoMixerCollect *) data;
+
GstVideoMixerPad *mixpad = mixcol->mixpad;
walk = g_slist_next (walk);
}
if (mix->sendseg && (mixpad == mix->master)) {
GstEvent *event;
+
GstSegment *segment = &data->segment;
/* FIXME, use rate/applied_rate as set on all sinkpads.
walk = mix->sinkpads;
while (walk) { /* We walk with this list because it's ordered */
GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (walk->data);
+
GstVideoMixerCollect *mixcol = pad->mixcol;
walk = g_slist_next (walk);
gst_videomixer_update_queues (GstVideoMixer * mix)
{
GSList *walk;
+
guint64 interval;
interval = mix->master->queued;
walk = mix->sinkpads;
while (walk) {
GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (walk->data);
+
GstVideoMixerCollect *mixcol = pad->mixcol;
walk = g_slist_next (walk);
gst_videomixer_collected (GstCollectPads * pads, GstVideoMixer * mix)
{
GstFlowReturn ret = GST_FLOW_OK;
+
GstBuffer *outbuf = NULL;
+
size_t outsize = 0;
+
gboolean eos = FALSE;
g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), GST_FLOW_ERROR);
forward_event (GstVideoMixer * mix, GstEvent * event)
{
gboolean ret;
+
GstIterator *it;
GValue vret = { 0 };
gst_videomixer_src_event (GstPad * pad, GstEvent * event)
{
GstVideoMixer *mix;
+
gboolean result;
mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
case GST_EVENT_SEEK:
{
GstSeekFlags flags;
+
GstSeekType curtype;
+
gint64 cur;
/* parse the seek parameters */
gst_videomixer_sink_event (GstPad * pad, GstEvent * event)
{
GstVideoMixer *videomixer;
+
gboolean ret;
videomixer = GST_VIDEO_MIXER (gst_pad_get_parent (pad));
gst_videomixer_change_state (GstElement * element, GstStateChange transition)
{
GstVideoMixer *mix;
+
GstStateChangeReturn ret;
g_return_val_if_fail (GST_IS_VIDEO_MIXER (element), GST_STATE_CHANGE_FAILURE);