diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2007-09-05 00:12:46 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2007-09-05 00:12:46 +0000 |
commit | c9d0575c7470e8af571f90d25716a01815f3bb40 (patch) | |
tree | ee4fb4b48ae265ac8bd9a34d40e45dd730fe4d05 /sys/v4l2/v4l2src_calls.c | |
parent | 93e1176891d983ce7a1ee95c4016a03f13efb1e5 (diff) |
sys/v4l2/v4l2src_calls.c: Add some more debugging in the framerate function.
Original commit message from CVS:
* sys/v4l2/v4l2src_calls.c:
(gst_v4l2src_probe_caps_for_format_and_size):
Add some more debugging in the framerate function.
Iterate stepwise framerate up to and _including_ the max and if nothing
was added to the list, add a dummy 0/1 to 100/1 framerate so that we
don't end up with an empty list.
Diffstat (limited to 'sys/v4l2/v4l2src_calls.c')
-rw-r--r-- | sys/v4l2/v4l2src_calls.c | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/sys/v4l2/v4l2src_calls.c b/sys/v4l2/v4l2src_calls.c index 5483e6da..56b87909 100644 --- a/sys/v4l2/v4l2src_calls.c +++ b/sys/v4l2/v4l2src_calls.c @@ -462,9 +462,11 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, ival.width = width; ival.height = height; + GST_LOG_OBJECT (v4l2src, "get frame interval for %ux%u, %" GST_FOURCC_FORMAT, + width, height, GST_FOURCC_ARGS (pixelformat)); + /* keep in mind that v4l2 gives us frame intervals (durations); we invert the * fraction to get framerate */ - if (ioctl (fd, VIDIOC_ENUM_FRAMEINTERVALS, &ival) < 0) goto enum_frameintervals_failed; @@ -472,7 +474,6 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, GValue frac = { 0, }; g_value_init (&rate, GST_TYPE_LIST); - g_value_init (&frac, GST_TYPE_FRACTION); do { @@ -485,6 +486,8 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, denom >>= 1; } + GST_LOG_OBJECT (v4l2src, "adding discrete framerate: %d/%d", denom, num); + gst_value_set_fraction (&frac, denom, num); gst_value_list_append_value (&rate, &frac); @@ -494,6 +497,7 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, GValue frac = { 0, }; GValue step = { 0, }; GValue max = { 0, }; + gboolean added = FALSE; g_value_init (&rate, GST_TYPE_LIST); @@ -507,6 +511,7 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, num >>= 1; denom >>= 1; } + GST_LOG_OBJECT (v4l2src, "stepwise min frame interval: %d/%d", num, denom); gst_value_set_fraction (&frac, num, denom); num = ival.stepwise.step.numerator; @@ -517,6 +522,7 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, } /* since we only have gst_value_fraction_subtract and not add, negate the numerator */ + GST_LOG_OBJECT (v4l2src, "stepwise step frame interval: %d/%d", num, denom); gst_value_set_fraction (&step, -num, denom); num = ival.stepwise.max.numerator; @@ -525,22 +531,35 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, num >>= 1; denom >>= 1; } + GST_LOG_OBJECT (v4l2src, "stepwise max frame interval: %d/%d", num, denom); gst_value_set_fraction (&max, num, denom); - while (gst_value_compare (&frac, &max) == GST_VALUE_LESS_THAN) { + while (gst_value_compare (&frac, &max) <= 0) { GValue frac = { 0, }; g_value_init (&frac, GST_TYPE_FRACTION); - /* invert */ - gst_value_set_fraction (&frac, - gst_value_get_fraction_denominator (&frac), - gst_value_get_fraction_numerator (&frac)); + + num = gst_value_get_fraction_numerator (&frac); + denom = gst_value_get_fraction_denominator (&frac); + GST_LOG_OBJECT (v4l2src, "adding stepwise framerate: %d/%d", denom, num); + + /* invert to get the framerate */ + gst_value_set_fraction (&frac, denom, num); gst_value_list_append_value (&rate, &frac); + added = TRUE; + /* we're actually adding because step was negated above. This is because + * there is no _add function... */ if (!gst_value_fraction_subtract (&frac, &frac, &step)) { - GST_INFO_OBJECT (v4l2src, "could not step fraction!"); + GST_WARNING_OBJECT (v4l2src, "could not step fraction!"); break; } } + if (!added) { + /* no range was added, make a default range */ + GST_WARNING_OBJECT (v4l2src, "no range added, setting 0/1 to 100/1"); + g_value_init (&rate, GST_TYPE_FRACTION_RANGE); + gst_value_set_fraction_range_full (&rate, 0, 1, 100, 1); + } } else if (ival.type == V4L2_FRMIVAL_TYPE_CONTINUOUS) { guint32 maxnum, maxdenom; @@ -553,6 +572,7 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, denom >>= 1; } + /* FIXME? doesn't it make more sense to have min and max as the range? */ maxnum = ival.stepwise.step.numerator; maxdenom = ival.stepwise.step.denominator; if (maxnum > G_MAXINT || maxdenom > G_MAXINT) { @@ -560,6 +580,9 @@ gst_v4l2src_probe_caps_for_format_and_size (GstV4l2Src * v4l2src, maxdenom >>= 1; } + GST_LOG_OBJECT (v4l2src, "continuous frame interval %d/%d to %d/%d", + maxdenom, maxnum, denom, num); + gst_value_set_fraction_range_full (&rate, maxdenom, maxnum, denom, num); } else { goto unknown_type; |