summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Isorce <jisorce@oblong.com>2017-12-12 17:30:27 +0000
committerJulien Isorce <jisorce@oblong.com>2017-12-14 09:20:49 +0000
commit681087819372e57157a13fbf3ac813a3025a2a29 (patch)
tree89d33c2f883bde2333c6a0784e871bf891fb2172
parent7048134fa9818fc7814942698e87570f31932f26 (diff)
downloadgst-omx-681087819372e57157a13fbf3ac813a3025a2a29.tar.gz
omxvideodec: ignore very little variations of the framerate
If less than 1%. The dynamic format change should not happen when the resolution does not change and when only the framerate changes but very slightly, i.e. from 50000/1677=29.81 to 89/3=29.66 so a "percentage change" of less than 1% (i.e. 100*(29.81-29.66)/29.66 = 0.50 < 1 ). In that case just ignore it to avoid unnecessary renegotiation. https://bugzilla.gnome.org/show_bug.cgi?id=759043
-rw-r--r--omx/gstomxvideo.c16
-rw-r--r--omx/gstomxvideo.h2
-rw-r--r--omx/gstomxvideodec.c3
3 files changed, 20 insertions, 1 deletions
diff --git a/omx/gstomxvideo.c b/omx/gstomxvideo.c
index fca0fd5..c06a2f4 100644
--- a/omx/gstomxvideo.c
+++ b/omx/gstomxvideo.c
@@ -28,6 +28,8 @@
#include "gstomxvideo.h"
+#include <math.h>
+
GST_DEBUG_CATEGORY (gst_omx_video_debug_category);
#define GST_CAT_DEFAULT gst_omx_video_debug_category
@@ -206,3 +208,17 @@ gst_omx_video_calculate_framerate_q16 (GstVideoInfo * info)
return gst_util_uint64_scale_int (1 << 16, info->fps_n, info->fps_d);
}
+
+gboolean
+gst_omx_video_is_equal_framerate_q16 (OMX_U32 q16_a, OMX_U32 q16_b)
+{
+ /* If one of them is 0 use the classic comparison. The value 0 has a special
+ meaning and is used to indicate the frame rate is unknown, variable, or
+ is not needed. */
+ if (!q16_a || !q16_b)
+ return q16_a == q16_b;
+
+ /* If the 'percentage change' is less than 1% then consider it equal to avoid
+ * an unnecessary re-negotiation. */
+ return fabs (((gdouble) q16_a) - ((gdouble) q16_b)) / (gdouble) q16_b < 0.01;
+}
diff --git a/omx/gstomxvideo.h b/omx/gstomxvideo.h
index 87de973..993f3d6 100644
--- a/omx/gstomxvideo.h
+++ b/omx/gstomxvideo.h
@@ -57,6 +57,8 @@ gst_omx_video_find_nearest_frame (GstOMXBuffer * buf, GList * frames);
OMX_U32 gst_omx_video_calculate_framerate_q16 (GstVideoInfo * info);
+gboolean gst_omx_video_is_equal_framerate_q16 (OMX_U32 q16_a, OMX_U32 q16_b);
+
G_END_DECLS
#endif /* __GST_OMX_VIDEO_H__ */
diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c
index 9679c02..b53a013 100644
--- a/omx/gstomxvideodec.c
+++ b/omx/gstomxvideodec.c
@@ -2342,7 +2342,8 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
is_format_change |= port_def.format.video.nFrameHeight != info->height;
is_format_change |= (port_def.format.video.xFramerate == 0
&& info->fps_n != 0)
- || (port_def.format.video.xFramerate != framerate_q16);
+ || !gst_omx_video_is_equal_framerate_q16 (port_def.format.
+ video.xFramerate, framerate_q16);
is_format_change |= (self->codec_data != state->codec_data);
if (klass->is_format_change)
is_format_change |=