decklink: Only use drop-frame flag for 29.97 and 59.94 FPS
authorVivia Nikolaidou <vivia@ahiru.eu>
Tue, 28 Aug 2018 12:04:53 +0000 (15:04 +0300)
committerVivia Nikolaidou <vivia@ahiru.eu>
Tue, 28 Aug 2018 12:23:48 +0000 (15:23 +0300)
Otherwise it can cause errors in gstvideotimecode.c because drop-frame
is not defined for any other frame rate (e.g. 24000/101)

https://blog.frame.io/2017/07/17/timecode-and-frame-rates/

https://bugzilla.gnome.org/show_bug.cgi?id=797037

sys/decklink/gstdecklinkvideosrc.cpp

index d2c784d..deda24a 100644 (file)
@@ -758,10 +758,22 @@ gst_decklink_video_src_got_frame (GstElement * element,
           flags =
               (GstVideoTimeCodeFlags) (flags |
               GST_VIDEO_TIME_CODE_FLAGS_INTERLACED);
-        if (bmode->fps_d == 1001 && (bmode->fps_n == 30000 || bmode->fps_n == 60000))
-          flags =
-              (GstVideoTimeCodeFlags) (flags |
-              GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME);
+        if (bmode->fps_d == 1001) {
+          if (bmode->fps_n == 30000 || bmode->fps_n == 60000) {
+            /* Some occurrences have been spotted where the driver mistakenly
+             * fails to set the drop-frame flag for drop-frame timecodes.
+             * Assume always drop-frame for 29.97 and 59.94 FPS */
+            flags =
+                (GstVideoTimeCodeFlags) (flags |
+                GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME);
+          } else {
+            /* Drop-frame isn't defined for any other framerates (e.g. 23.976)
+             * */
+            flags =
+                (GstVideoTimeCodeFlags) (flags &
+                ~GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME);
+          }
+        }
         f.tc =
             gst_video_time_code_new (bmode->fps_n, bmode->fps_d, NULL, flags,
             hours, minutes, seconds, frames, field_count);