From 681087819372e57157a13fbf3ac813a3025a2a29 Mon Sep 17 00:00:00 2001 From: Julien Isorce Date: Tue, 12 Dec 2017 17:30:27 +0000 Subject: [PATCH] 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 --- omx/gstomxvideo.c | 16 ++++++++++++++++ omx/gstomxvideo.h | 2 ++ omx/gstomxvideodec.c | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/omx/gstomxvideo.c b/omx/gstomxvideo.c index fca0fd589d..c06a2f4820 100644 --- a/omx/gstomxvideo.c +++ b/omx/gstomxvideo.c @@ -28,6 +28,8 @@ #include "gstomxvideo.h" +#include + 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 87de9739df..993f3d69bc 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 9679c02964..b53a0132b2 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 |=