aboutsummaryrefslogtreecommitdiff
path: root/plugins/rtp
diff options
context:
space:
mode:
authorfoucault <foucault@users.noreply.github.com>2022-05-17 14:02:12 +0200
committerfiaxh <git@lightrise.org>2022-05-17 14:08:22 +0200
commit186361fd8a381ef3c3334683dfb9cc4de1417596 (patch)
tree0f03291d8772710c8616e6871da0d394d388451e /plugins/rtp
parent99c076254abc6e2b03b784732a76a389e5a4f801 (diff)
downloaddino-186361fd8a381ef3c3334683dfb9cc4de1417596.tar.gz
dino-186361fd8a381ef3c3334683dfb9cc4de1417596.zip
Fix calculation of best camera framerate
When the algorithm iterates over all the available v4l2 capabilities it tries to determine the best framerate for each one of YUYV (video/x-raw) modes presented by the hardware (best_fraction, line 357 in device.vala). Regardless of what's determined to be the "best" YUYV mode from within the conditional right after (line 385) the best fractional framerate will always point to the last iterated framerate, which might be an extremely low one, like 7 or 5 FPS. When the framerate is then stored in the Gst.Structure (line 394) the fractional framerate will always be that last value which might be different than the correct one as calculated by best_fps (line 386). This workaround solves this issue by only updating best_fraction when the conditional in line 385 is satisfied. from issue #1195
Diffstat (limited to 'plugins/rtp')
-rw-r--r--plugins/rtp/src/device.vala4
1 files changed, 3 insertions, 1 deletions
diff --git a/plugins/rtp/src/device.vala b/plugins/rtp/src/device.vala
index d4eca09a..1db8c996 100644
--- a/plugins/rtp/src/device.vala
+++ b/plugins/rtp/src/device.vala
@@ -354,6 +354,7 @@ public class Dino.Plugins.Rtp.Device : MediaDevice, Object {
int best_height = 0;
for (int i = 0; i < device.caps.get_size(); i++) {
unowned Gst.Structure? that = device.caps.get_structure(i);
+ Value? best_fraction_now = null;
if (!that.has_name("video/x-raw")) continue;
int num = 0, den = 0, width = 0, height = 0;
if (!that.has_field("framerate")) continue;
@@ -369,7 +370,7 @@ public class Dino.Plugins.Rtp.Device : MediaDevice, Object {
int fps = den > 0 ? (num/den) : 0;
int in_fps = in_den > 0 ? (in_num/in_den) : 0;
if (in_fps > fps) {
- best_fraction = fraction;
+ best_fraction_now = fraction;
num = in_num;
den = in_den;
}
@@ -386,6 +387,7 @@ public class Dino.Plugins.Rtp.Device : MediaDevice, Object {
best_width = width;
best_height = height;
best_index = i;
+ best_fraction = best_fraction_now;
}
}
Gst.Caps res = caps_copy_nth(device.caps, best_index);