videotimecode: Fix division by zero in timecode validation function
authorSebastian Dröge <sebastian@centricular.com>
Fri, 14 Dec 2018 11:56:28 +0000 (13:56 +0200)
committerMathieu Duponchelle <mduponchelle1@gmail.com>
Wed, 19 Dec 2018 23:11:24 +0000 (23:11 +0000)
And add some comments about what exactly we're testing in the
non-trivial cases.

gst-libs/gst/video/gstvideotimecode.c

index a7187f30a3dba6883051ce2ae40799ae46a8cb53..52d18d20931786519ae1b1df6656dd446507b916 100644 (file)
@@ -69,7 +69,8 @@ gst_video_time_code_is_valid (const GstVideoTimeCode * tc)
 
   g_return_val_if_fail (tc != NULL, FALSE);
 
-  fr = (tc->config.fps_n + (tc->config.fps_d >> 1)) / tc->config.fps_d;
+  if (tc->config.fps_d == 0)
+    return FALSE;
 
   if (tc->hours >= 24)
     return FALSE;
@@ -77,10 +78,14 @@ gst_video_time_code_is_valid (const GstVideoTimeCode * tc)
     return FALSE;
   if (tc->seconds >= 60)
     return FALSE;
-  if (tc->config.fps_d == 0)
-    return FALSE;
+
+  /* We can't have more frames than rounded up frames per second */
+  fr = (tc->config.fps_n + (tc->config.fps_d >> 1)) / tc->config.fps_d;
   if (tc->frames >= fr && (tc->config.fps_n != 0 || tc->config.fps_d != 1))
     return FALSE;
+
+  /* We either need a specific X/1001 framerate or otherwise an integer
+   * framerate */
   if (tc->config.fps_d == 1001) {
     if (tc->config.fps_n != 30000 && tc->config.fps_n != 60000 &&
         tc->config.fps_n != 24000)
@@ -88,6 +93,10 @@ gst_video_time_code_is_valid (const GstVideoTimeCode * tc)
   } else if (tc->config.fps_n % tc->config.fps_d != 0) {
     return FALSE;
   }
+
+  /* Drop-frame framerates require skipping over the first two
+   * timecodes every minutes except for every tenth minute in case
+   * of 30000/1001 and the first four timecodes for 60000/1001 */
   if ((tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) &&
       tc->minutes % 10 && tc->seconds == 0 && tc->frames < fr / 15) {
     return FALSE;