-
Notifications
You must be signed in to change notification settings - Fork 309
Description
Feature Request
New Feature
Description
Many NLE programs allow users to color code individual clips and/or tracks in the timeline user interface. This color information is encoded in AAF, and XML files. It would be great if OTIO had a schema property to carry this in a portable way.
Context
Since this PR OpenTimelineIO/raven#14 Raven has minimal support for this as app-specific metadata. That feature was added to help instigate discussion about this schema change.
OTIO already carries per-marker color coding, as an enumerated string value (e.g. "RED", "CYAN", etc.) which has been awkward at times. Perhaps we could revisit that decision and see if maybe storing an RGB triple, or hexadecimal value like "#FF0" might be better.
Metadata
Metadata
Assignees
Labels
No labels
Activity
jminor commentedon Jun 6, 2023
Notes about marker colors as names vs RGB values here: https://github.com/AcademySoftwareFoundation/OpenTimelineIO/wiki/Editorial-File-Format-Notes
jminor commentedon Jun 8, 2023
Here's a note from @apetrynet (paraphrased from discussion elsewhere):
OTIO could serialize color values as normalized values between 0 and 1 including alpha (like OIIO). That way we're free from bit depth and can convert between known types like hex, string, int etc. This would need some mapping and convenience functions. Also suggest keeping the marker color strings (including lower case representation) as a mapping to normalized values.
e4lam commentedon Sep 26, 2023
Do we really need to concern ourselves with bit depths? I'd imagine 99% of the use cases would be for user interfaces where HTML codes in the form of
#RRGGBBAA
(with theAA
being optional) hexadecimal codes would cover it.reinecke commentedon Oct 4, 2023
I like the proposal @jminor puts forward (with 0-1 float values) because it lets us have one RGBA color schema with utility functions to convert in/out of most the other common representations and it has high reusability for effect parameters or other places where more accurate color may be needed.
The conversion model is in-line with the pattern
RationalTime
uses withfrom_frames
,to_frames
,from_timecode
,to_timecode
. In this case it might be something like:from_hex
to_hex
from_rgba_integer_list
(Accepts a bit-depth)to_rgba_integer_list
(accepts a bit-depth)For the named colors, we could consider mapping them to specific color by adding a method to this struct. I think it's better to have that struct know about name to color mapping than make a ground truth color representation have some notion of named colors.
semagnum commentedon May 12, 2025
Hi, just wanted to say I coded up a base class working in preparation for Dev Days, I'm hoping to add it as a new attribute for clips and tracks before making a PR.
e4lam commentedon Aug 5, 2025
@semagnum Sorry, so what is the new format? Can I just do
color="#FF0011"
now?semagnum commentedon Aug 5, 2025
This is currently the format: tests/baselines/empty_color.json
I did include utility converters to/from hex code within the
Color
class, so implementing that would just be a matter of adding it as an option to the deserializer, if that's what you're hoping for :)e4lam commentedon Aug 5, 2025
No, I'm seeking clarification on how one is supposed to be able to specify custom colors for tracks/clips/etc that are outside of the preset list of named colors in an OTIO json file. So if I understand what you linked to, one is supposed to create their own color names separately, and then creating your own schema for how to link tracks/clips to the color names? That is exceptionally unwieldy for use cases where you have a large number of tracks/clips each with their separate colours. You have to in essence create your own indexing scheme if that is the case.
jminor commentedon Aug 6, 2025
You don't need to add colors to a list. Each Clip can have its own color like this:
jminor commentedon Aug 6, 2025
@semagnum in preparing the example above I noticed a bug though... This isn't working as expected:
semagnum commentedon Aug 6, 2025
Gotcha, I'll try to take a look at the deserializer. I'll have more time later this week. Any help troubleshooting would be appreciated.
e4lam commentedon Aug 6, 2025
Ah ok, that sounds a lot better! What is the intention of have the name in that case?
jminor commentedon Aug 6, 2025
Some applications and formats that OTIO interoperates with only support named colors. Having a name field lets those use cases key off of the name instead of the RGB values. You can see a bit more discussion about that choice here: #1887
semagnum commentedon Aug 6, 2025
Found the root cause, the deserializer was incorrectly looking for a float when the constructor needs a double. Will make a PR.
semagnum commentedon Aug 11, 2025
@jminor if you or someone else could review that PR, I'd appreciate it. I'd hate for a hotfix to linger any longer than it needs to
jminor commentedon Aug 11, 2025
@semagnum looks great. I verified it locally in a fresh build of Raven. Thanks for the quick fix - merged.