h265parse: Derive src fps from vui_time_scale & vui_num_units_in_tick
authorZeeshan Ali <zeenix@collabora.co.uk>
Thu, 14 Jun 2018 14:20:54 +0000 (16:20 +0200)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 31 Mar 2020 14:13:30 +0000 (14:13 +0000)
gst/videoparsers/gsth265parse.c

index 359e1e2..1839ace 100644 (file)
@@ -1969,15 +1969,27 @@ gst_h265_parse_update_src_caps (GstH265Parse * h265parse, GstCaps * caps)
     }
 
     /* 0/1 is set as the default in the codec parser */
-    if ((vui->timing_info_present_flag ||
-            (vps && vps->timing_info_present_flag)) &&
-        !(sps->fps_num == 0 && sps->fps_den == 1)) {
-      if (G_UNLIKELY (h265parse->fps_num != sps->fps_num
-              || h265parse->fps_den != sps->fps_den)) {
+    if (vui->timing_info_present_flag) {
+      gint fps_num = 0, fps_den = 1;
+
+      if (!(sps->fps_num == 0 && sps->fps_den == 1)) {
+        fps_num = sps->fps_num;
+        fps_den = sps->fps_den;
+      } else if (!(sps->vui_params.time_scale == 0 &&
+              sps->vui_params.num_units_in_tick == 1)) {
+        fps_num = sps->vui_params.time_scale;
+        fps_den = sps->vui_params.num_units_in_tick;
+
+        if (sps->profile_tier_level.interlaced_source_flag)
+          fps_num /= 2;
+      }
+
+      if (G_UNLIKELY (h265parse->fps_num != fps_num
+              || h265parse->fps_den != fps_den)) {
         GST_INFO_OBJECT (h265parse, "framerate changed %d/%d",
-            sps->fps_num, sps->fps_den);
-        h265parse->fps_num = sps->fps_num;
-        h265parse->fps_den = sps->fps_den;
+            fps_num, fps_den);
+        h265parse->fps_num = fps_num;
+        h265parse->fps_den = fps_den;
         modified = TRUE;
       }
     }