Skip to content

Add core C++ support for otioz and otiod #1869

@darbyjohnston

Description

@darbyjohnston

After some discussion in Slack:
https://academysoftwarefdn.slack.com/archives/CMQ9J4BQC/p1729878665473649

I wanted to create a proposal for adding core C++ support for otioz and otiod. I think adding them to the C++ API would have a couple of benefits:

  • Broader adoption by users of the C++ API and other language bindings.
  • Provide a common interface to ensure bundles are created according to the specification.

I propose adding minizip-ng as a new dependency to support otioz. It has a permissive license (zlib), and is also used by OpenColorIO for their .ocioz files. The use of minizip-ng would be internal and not part of the OTIO public API.

Outline of the required work:

Add an enum for the media reference policy

(https://opentimelineio.readthedocs.io/en/stable/tutorials/otio-filebundles.html#mediareferencepolicy)

enum class MediaReferencePolicy
{
    ErrorIfNotFile,
    MissingIfNotFile,
    AllMissing
 };

Add constants for the file bundle versions

static std::string const otiozVersion = "1.0.0";
static std::string const otiodVersion = "1.0.0";

Add I/O functions to SerializableObject

bool to_otioz_file(
    std::string const&        file_name,
    MediaReferencePolicy      media_reference_policy   = MediaReferencePolicy::ErrorIfNotFile,
    ErrorStatus*              error_status             = nullptr,
    const schema_version_map* target_family_label_spec = nullptr,
    int                       indent                   = 4) const;
  • Create a new ZIP file.
  • Resolve external references based on the media reference policy and add them to the ZIP file.
  • Create the version file and add it to the ZIP file.
  • Clone the SerializableObject and modify it based upon the media reference policy, and to change the external reference paths.
  • Call to_json_string() to create content.otio and add it to the ZIP file.
static SerializableObject* from_otioz_file(
    std::string const& file_name,
    std::string const& temp_dir,
    ErrorStatus*       error_status = nullptr);
  • Unzip the file to the temporary directory.
  • Call from_json_file() on the content.otio file in the temporary directory.

Should we also add a version of this function that reads the otioz directly without unzipping it (i.e., memory-mapping)?

bool to_otiod_bundle(
    std::string const&        dir_name,
    MediaReferencePolicy      media_reference_policy   = MediaReferencePolicy::ErrorIfNotFile,
    ErrorStatus*              error_status             = nullptr,
    const schema_version_map* target_family_label_spec = nullptr,
    int                       indent                   = 4) const;
  • Create the given directory.
  • Resolve external references based on the media reference policy and copy them to the directory.
  • Create the version file in the directory.
  • Clone the SerializableObject and modify it based upon the media reference policy, and to change the external reference paths.
  • Call to_json_string() to create the content.otio file in the directory.
static SerializableObject* from_otiod_bundle(
    std::string const& file_name,
    ErrorStatus*       error_status = nullptr);
  • Call from_json_file() on the content.otio file in the otiod directory.

Python bindings

Add Python bindings for the new C++ functionality and update the otioz/otiod Python adapters to use the new code.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions