From: <do...@fr...> - 2005-12-12 21:43:35
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: dolphy Date: Mon Dec 12 2005 13:43:12 PST Log message: 2005-12-12 Julien MOUTTE <ju...@mo...> * gst/videomixer/videomixer.c: (gst_videomixer_pad_sink_setcaps), (gst_videomixer_getcaps), (gst_videomixer_fill_queues), (gst_videomixer_update_queues), (gst_videomixer_collected): Fix caps negotiation. (#323896) Modified files: . : ChangeLog gst/videomixer : videomixer.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2052&r2=1.2053 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/videomixer/videomixer.c.diff?r1=1.20&r2=1.21 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2052 retrieving revision 1.2053 diff -u -d -r1.2052 -r1.2053 --- ChangeLog 12 Dec 2005 18:14:58 -0000 1.2052 +++ ChangeLog 12 Dec 2005 21:42:59 -0000 1.2053 @@ -1,3 +1,10 @@ +2005-12-12 Julien MOUTTE <ju...@mo...> + + * gst/videomixer/videomixer.c: (gst_videomixer_pad_sink_setcaps), + (gst_videomixer_getcaps), (gst_videomixer_fill_queues), + (gst_videomixer_update_queues), (gst_videomixer_collected): + Fix caps negotiation. (#323896) 2005-12-12 Arwed v. Merkatz <v.m...@gm...> * gst/matroska/matroska-demux.c: Index: videomixer.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/videomixer/videomixer.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- videomixer.c 6 Dec 2005 19:44:56 -0000 1.20 +++ videomixer.c 12 Dec 2005 21:43:00 -0000 1.21 @@ -99,8 +99,8 @@ guint64 queued; guint in_width, in_height; - gint in_framerate_numerator; - gint in_framerate_denominator; + gint fps_n; + gint fps_d; gint xpos, ypos; guint zorder; @@ -227,6 +227,9 @@ gst_object_unref (mix); } +/** + * GstVideoMixerBackground: + */ typedef enum { VIDEO_MIXER_BACKGROUND_CHECKER, @@ -257,8 +260,8 @@ GstVideoMixerBackground background; }; struct _GstVideoMixerClass @@ -279,18 +282,21 @@ mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); mixpad = GST_VIDEO_MIXER_PAD (pad); - GST_DEBUG ("videomixer: setcaps triggered on %s", gst_pad_get_name (pad)); + if (!mixpad) { + goto beach; + } + GST_DEBUG_OBJECT (mixpad, "setcaps triggered"); structure = gst_caps_get_structure (vscaps, 0); if (!gst_structure_get_int (structure, "width", &in_width) || !gst_structure_get_int (structure, "height", &in_height) - || (framerate = gst_structure_get_value (structure, "framerate")) != NULL) + || (framerate = gst_structure_get_value (structure, "framerate")) == NULL) goto beach; - mixpad->in_framerate_numerator = gst_value_get_fraction_numerator (framerate); - mixpad->in_framerate_denominator = - gst_value_get_fraction_denominator (framerate); + mixpad->fps_n = gst_value_get_fraction_numerator (framerate); + mixpad->fps_d = gst_value_get_fraction_denominator (framerate); mixpad->in_width = in_width; mixpad->in_height = in_height; @@ -298,14 +304,19 @@ mixpad->xpos = 0; mixpad->ypos = 0; + /* Biggest input geometry will be our output geometry */ mix->in_width = MAX (mix->in_width, mixpad->in_width); mix->in_height = MAX (mix->in_height, mixpad->in_height); /* If mix framerate < mixpad framerate, using fractions */ - if ((gint64) mix->in_framerate_numerator * mixpad->in_framerate_denominator < - (gint64) mixpad->in_framerate_numerator * mix->in_framerate_denominator) { - mix->in_framerate_numerator = mixpad->in_framerate_numerator; - mix->in_framerate_denominator = mixpad->in_framerate_denominator; + GST_DEBUG_OBJECT (mix, "comparing mix framerate %d/%d to mixpad's %d/%d", + mix->fps_n, mix->fps_d, mixpad->fps_n, mixpad->fps_d); + if ((!mix->fps_n && !mix->fps_d) || + ((gint64) mix->fps_n * mixpad->fps_d < + (gint64) mixpad->fps_n * mix->fps_d)) { + mix->fps_n = mixpad->fps_n; + mix->fps_d = mixpad->fps_d; + GST_DEBUG_OBJECT (mixpad, "becomes the master pad"); mix->master = mixpad; } @@ -529,10 +540,9 @@ if (mix->out_height != 0) { gst_structure_set (structure, "height", G_TYPE_INT, mix->out_height, NULL); - if (mix->in_framerate_denominator != 0) { + if (mix->fps_d != 0) { gst_structure_set (structure, - "framerate", GST_TYPE_FRACTION, mix->in_framerate_numerator, - mix->in_framerate_denominator, NULL); + "framerate", GST_TYPE_FRACTION, mix->fps_n, mix->fps_d, NULL); @@ -907,11 +917,10 @@ duration = GST_BUFFER_DURATION (mixcol->buffer); /* no duration on the buffer, use the framerate */ if (!GST_CLOCK_TIME_IS_VALID (duration)) { - if (mixpad->in_framerate_numerator == 0) { + if (mixpad->fps_n == 0) { duration = GST_CLOCK_TIME_NONE; } else { - duration = GST_SECOND * mixpad->in_framerate_denominator / - mixpad->in_framerate_numerator; + duration = GST_SECOND * mixpad->fps_d / mixpad->fps_n; } } if (GST_CLOCK_TIME_IS_VALID (duration)) @@ -970,11 +979,10 @@ interval = mix->master->queued; if (interval <= 0) { - if (mix->in_framerate_numerator == 0) { + if (mix->fps_n == 0) { interval = G_MAXINT64; } else { - interval = GST_SECOND * mix->in_framerate_denominator / - mix->in_framerate_numerator; + interval = GST_SECOND * mix->fps_d / mix->fps_n; } |