timecodestamper: Skip over invalid LTC timecodes immediately
authorSebastian Dröge <sebastian@centricular.com>
Fri, 10 Jan 2020 11:08:38 +0000 (13:08 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 10 Jan 2020 13:59:27 +0000 (15:59 +0200)
gst/timecode/gsttimecodestamper.c

index 900c23f..9328116 100644 (file)
@@ -1306,6 +1306,16 @@ gst_timecodestamper_transform_ip (GstBaseTransform * vfilter,
           g_queue_get_length (&timecodestamper->ltc_current_tcs));
       g_free (tc_str);
 
+      if (!gst_video_time_code_is_valid (&ltc_tc->timecode)) {
+        tc_str = gst_video_time_code_to_string (&ltc_tc->timecode);
+        GST_INFO_OBJECT (timecodestamper, "Invalid LTC timecode %s", tc_str);
+        g_free (tc_str);
+        gst_video_time_code_clear (&ltc_tc->timecode);
+        g_free (ltc_tc);
+        ltc_tc = NULL;
+        continue;
+      }
+
       /* A timecode frame that starts +/- half a frame to the
        * video frame is considered belonging to that video frame.
        *
@@ -1319,18 +1329,11 @@ gst_timecodestamper_transform_ip (GstBaseTransform * vfilter,
         if (timecodestamper->ltc_auto_resync) {
           if (timecodestamper->ltc_internal_tc)
             gst_video_time_code_free (timecodestamper->ltc_internal_tc);
-          if (gst_video_time_code_is_valid (&ltc_tc->timecode)) {
-            timecodestamper->ltc_internal_tc =
-                gst_video_time_code_copy (&ltc_tc->timecode);
-            timecodestamper->ltc_internal_running_time = ltc_tc->running_time;
-            updated_internal = TRUE;
-            GST_INFO_OBJECT (timecodestamper, "Resynced internal LTC counter");
-          } else {
-            tc_str = gst_video_time_code_to_string (&ltc_tc->timecode);
-            GST_INFO_OBJECT (timecodestamper, "Invalid LTC timecode %s",
-                tc_str);
-            g_free (tc_str);
-          }
+          timecodestamper->ltc_internal_tc =
+              gst_video_time_code_copy (&ltc_tc->timecode);
+          timecodestamper->ltc_internal_running_time = ltc_tc->running_time;
+          updated_internal = TRUE;
+          GST_INFO_OBJECT (timecodestamper, "Resynced internal LTC counter");
         }
 
         /* And store it back for the next frame in case it has more or less