Skip to content

[BUG] from_seconds/to_seconds & from_frames/to_frames do not produce matching values #1742

@mark-oshea

Description

@mark-oshea

Required:


[X] I believe this isn't a duplicate topic
[X] This report is not related to an adapter

For adapter related issues, please go to the appropriate repository - likely in
the OpenTimelineIO github organization.
For general questions and help please use the
Academy Software Foundation slack,
#opentimelineio.

Select One:

[ ] Build problem
[X] Incorrect Functionality or bug
[ ] New feature or functionality

Description

Frames to Seconds conversion is not accurate on certain values at 25 FPS.

If I instance RationalTime.from_frames with a value of 29, when I call to_seconds() it gives me 1.16.

If I instance RationalTime.from_seconds with a value of 1.16, when I call to_frames() it gives me 28.

I believe this is due to the fact we always round down to nearest int rather than to closest int e.g the maths shows us it's just slightly below frame 29 and not at all close to frame 28:

>>> 1.16 * 25
28.999999999999996

This makes us unsure if we can trust OpenTimelineIO to always calculate correct values when converting between seconds/frames.

Optional


Environment

Operating System:
Python version if appropriate: Python 3.10.7

Reproduction Steps

Tested on v0.14.0, v0.15.0 & v0.16.0.

Example snippet:

>>> import opentimelineio as otio
>>> FRAME_NUM = 29
>>> RATE = 25
>>>
>>> rational_time = otio.opentime.from_frames(FRAME_NUM, RATE)
>>> seconds = rational_time.to_seconds()
>>> print(seconds)
1.16
>>>
>>> rational_time_from_sec = otio.opentime.from_seconds(seconds, RATE)
>>>
>>> print(rational_time)
RationalTime(29, 25)
>>> print(rational_time_from_sec)
RationalTime(29, 25)
>>> print(rational_time.to_frames())
29
>>> print(rational_time_from_sec.to_frames())
28

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions