[Bf-blender-cvs] [88d6390] master: Fix T45644: bpy.utils.smpte_from_frame drops frame

Campbell Barton noreply at git.blender.org
Mon Aug 3 06:12:35 CEST 2015


Commit: 88d63905a833a5e89c2860b10db43d1f7966594c
Author: Campbell Barton
Date:   Mon Aug 3 13:32:58 2015 +1000
Branches: master
https://developer.blender.org/rB88d63905a833a5e89c2860b10db43d1f7966594c

Fix T45644: bpy.utils.smpte_from_frame drops frame

D1444 by @lichtwerk, with minor fix & docstring updates

===================================================================

M	release/scripts/modules/bpy/utils/__init__.py

===================================================================

diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py
index 7a1224d..481db46 100644
--- a/release/scripts/modules/bpy/utils/__init__.py
+++ b/release/scripts/modules/bpy/utils/__init__.py
@@ -377,46 +377,31 @@ def preset_paths(subdir):
 
 def smpte_from_seconds(time, fps=None):
     """
-    Returns an SMPTE formatted string from the time in seconds: "HH:MM:SS:FF".
+    Returns an SMPTE formatted string from the *time*:
+    ``HH:MM:SS:FF``.
 
     If the *fps* is not given the current scene is used.
-    """
-    import math
-
-    if fps is None:
-        fps = _bpy.context.scene.render.fps
-
-    hours = minutes = seconds = frames = 0
-
-    if time < 0:
-        time = - time
-        neg = "-"
-    else:
-        neg = ""
-
-    if time >= 3600.0:  # hours
-        hours = int(time / 3600.0)
-        time = time % 3600.0
-    if time >= 60.0:  # minutes
-        minutes = int(time / 60.0)
-        time = time % 60.0
 
-    seconds = int(time)
-    frames = int(round(math.floor(((time - seconds) * fps))))
+    :arg time: time in seconds.
+    :type time: int, float or ``datetime.timedelta``.
+    :return: the frame string.
+    :rtype: string
+    """
 
-    return "%s%02d:%02d:%02d:%02d" % (neg, hours, minutes, seconds, frames)
+    return smpte_from_frame(time_to_frame(time, fps=fps), fps)
 
 
 def smpte_from_frame(frame, fps=None, fps_base=None):
     """
-    Returns an SMPTE formatted string from the frame: "HH:MM:SS:FF".
+    Returns an SMPTE formatted string from the *frame*:
+    ``HH:MM:SS:FF``.
 
     If *fps* and *fps_base* are not given the current scene is used.
 
-    :arg time: time in seconds.
-    :type time: number or timedelta object
-    :return: the frame.
-    :rtype: float
+    :arg frame: frame number.
+    :type frame: int or float.
+    :return: the frame string.
+    :rtype: string
     """
 
     if fps is None:
@@ -425,7 +410,17 @@ def smpte_from_frame(frame, fps=None, fps_base=None):
     if fps_base is None:
         fps_base = _bpy.context.scene.render.fps_base
 
-    return smpte_from_seconds((frame * fps_base) / fps, fps)
+    sign = "-" if frame < 0 else ""
+    frame = abs(frame * fps_base)
+
+    return (
+        "%s%02d:%02d:%02d:%02d" % (
+        sign,
+        int(frame / (3600 * fps)),          # HH
+        int((frame / (60 * fps)) % 60),     # MM
+        int((frame / fps) % 60),            # SS
+        int(frame % fps),                   # FF
+        ))
 
 
 def time_from_frame(frame, fps=None, fps_base=None):
@@ -435,7 +430,7 @@ def time_from_frame(frame, fps=None, fps_base=None):
     If *fps* and *fps_base* are not given the current scene is used.
 
     :arg frame: number.
-    :type frame: the frame number
+    :type frame: int or float.
     :return: the time in seconds.
     :rtype: datetime.timedelta
     """
@@ -459,7 +454,7 @@ def time_to_frame(time, fps=None, fps_base=None):
     If *fps* and *fps_base* are not given the current scene is used.
 
     :arg time: time in seconds.
-    :type time: number or a datetime.timedelta object
+    :type time: number or a ``datetime.timedelta`` object
     :return: the frame.
     :rtype: float
     """




More information about the Bf-blender-cvs mailing list