Omniverse Kit 108 Migration Guide#

This guide details the steps and considerations necessary for migrating extensions and applications to Omniverse Kit 108. It incorporates essential updates, dependency changes and known issues, ensuring a clear and structured approach to facilitate a upgrading from previous releases.

The Omniverse Kit 108 release includes the following note-worthy dependencies, amongst others:

Component

Reference

OpenUSD 25.02

Changelog

Python 3.12

Release Notes

Table of Contents#

  1. Preparing for Migration

  2. Carbonite

  3. OpenUSD Update

  4. Live Streaming

Preparing for Migration#

Before starting any update process, please ensure you have the following prerequisites in order to minimize disruptions during migration:

  • Ensure you have access to the latest Omniverse Kit SDK.

  • You are familiar with your application’s architecture, and existing dependencies.

  • You have a backup of your current project, to prevent any potential data loss during migration.

  • A process in place to confirm all functionalities of your application and extensions behave as expected after upgrading.

    • This process can vary depending on your organization, but typically includes elements such as automated builds, unit or integration tests, documentation about your feature’s behavior, reviewing log information, etc.

Carbonite#

Required Code Updates#

carb::extras::Path#

We removed implicit conversion from Path to std::string. Beginning with Kit 108, converting a Path object to a std::string requires explicitly calling the getString() member function:

Before (Stops working in Kit 108)

After (Compatible with Kit 107 & Kit 108)

Path p = ...  string s = p;

Path p = ...  string s = p.getString();

Also, as part of the effort to remove null-terminated strings, the following functions now accept carb::cpp::string_view only: getPathParent, getPathExtension, getPathStem and getPathRelative (all from carb::extra namespace).

If you are using those functions, you will have to replace them using the following table (consider the variable p to be a char* representing a null-terminated string).

Before (Stops working in Kit 108)

After (Compatible with Kit 107 & Kit 108)

char* p = ...; auto r = getPathParent(p);

char* p = ...; auto r = Path(p).getParent();

char* p = ...; auto r = getPathExtension(p);

char* p = ...; auto r = Path(p).getExtension();

char* p = ...; auto r = getPathStem(p);

char* p = ...; auto r = Path(p).getStem();

char* p = ...; auto r = getPathRelative(p1, p2)

char* p = ...; auto r = Path(p1).getRelative(p2);

If your char* is obtained by calling the method .c_str() from a std::string or an omni::string, the solution is just to remove .c_str():

Before (Stops working in Kit 108)

After (Compatible with Kit 107 & Kit 108)

string s = ...; r = getPathParent(s.c_str());

string s = ...; r = getPathParent(s);

Library.h#

Library.h doesn’t provide the functions getDefaultLibraryPrefix and getDefaultLibraryExtension anymore. They should be replaced with the defines CARB_LIBRARY_PREFIX and CARB_LIBRARY_EXTENSION respectively.

Other Breaking Changes#

omni::string#

The class omni::string no longer treats construction from nullptr as an error. Instead, it will create a valid empty string. This does not require changes to the code.

carb.crashreporter-breakpad.plugin#

Changed the default setting of /crashreporter/compressDumpFiles to true since most products have always enabled that.

omni.structuredlog.plugin#

Changed the default for the /telemetry/enableAnonymousData setting to true. By default, all emitted and transmitted structured log messages will now be sent using an anonymous user ID and the open endpoint (unless configured otherwise). The setting can still be disabled on the command line or in a config file if needed. It can also be overridden with the OMNI_TELEMETRY_DISABLE_ANONYMOUS_DATA environment variable.

Assert macros moved to Assert.h#

include/carb/Defines.h no longer provides CARB_ASSERT and other assert macros. These are now in a new header file: include/carb/Assert.h.

OpenUSD Update#

We updated from OpenUSD 24.05 and Python 3.11 to OpenUSD 25.02 and Python 3.12. This requires any C++ extension to be rebuilt.

Breaking Changes and Migration Requirements#

  • GfMatrix Lossy Overloads

  • Documentation Field Changes

  • Boost Python Fork

    • OpenUSD now uses a fork of Boost Python. This may affect extensions that directly interact with Python bindings.

    • Ensure your C++ extensions are compatible with the new Boost Python fork implementation.

  • NDR Deprecation

    • The Node Definition Registry (NDR) is being removed from OpenUSD. If your extensions rely on NDR functionality, you will need to migrate to alternative approaches.

    • See: Deprecation of pxr.usd.ndr

  • Scalar Translate and Scale xformOps

    • OpenUSD now supports scalar transform operations. Tooling that interacts with xformOps directly should consider scalar translate and scale operations (e.g., xformOp:translateX) in addition to vector operations (e.g., xformOp:translateXYZ).

    • Update your transform handling code to account for both scalar and vector xformOps.

Live Streaming#

When upgrading from Kit 107 to Kit 108, several important changes were made to the livestream extensions as part of the “Livestream 2.0” restructuring. This section outlines the required changes for existing applications.

Extension Dependencies#

New Required Extensions:

In Kit 108, livestream functionality has been split into multiple focused extensions. You now need to explicitly enable the appropriate extensions based on your use case:

[dependencies]
# For application framebuffer streaming
"omni.kit.livestream.app" = {}

# For specific AOV streaming (if needed)
"omni.kit.livestream.aov" = {}

# Core streaming infrastructure (automatically included as dependency)
"omni.kit.livestream.core" = {}

# Session management (if using REST endpoints)
"omni.services.livestream.session" = {}

What Changed:

  • omni.kit.livestream.core no longer provides direct streaming functionality

  • Application streaming moved to omni.kit.livestream.app

  • AOV streaming moved to omni.kit.livestream.aov

  • Session management requires omni.services.livestream.session instead of the legacy omni.services.livestream.nvcf

Settings Migration#

Primary Stream Settings Migration#

Legacy Settings (Kit 107 and earlier):

[settings]
# DEPRECATED - These settings are now legacy
app.livestream.port = 49100
app.livestream.fixedHostPort = 1024
app.livestream.publicEndpointPort = 47998
app.livestream.publicEndpointAddress = "192.168.1.100"
app.livestream.allowDynamicResize = false
app.livestream.webrtcEtli = true

New Settings (Kit 108+):

[settings]
# Primary application stream settings
exts."omni.kit.livestream.app".primaryStream.signalPort = 49100
exts."omni.kit.livestream.app".primaryStream.streamPort = 47998
exts."omni.kit.livestream.app".primaryStream.publicIp = "192.168.1.100"
exts."omni.kit.livestream.app".primaryStream.allowDynamicResize = false
exts."omni.kit.livestream.app".primaryStream.enableEventTracing = true
exts."omni.kit.livestream.app".primaryStream.streamType = "webrtc"

Primary Stream Setting Mapping:

Legacy Setting

New Setting

Notes

app.livestream.port

exts."omni.kit.livestream.app".primaryStream.signalPort

TCP port for connection negotiation

app.livestream.fixedHostPort

exts."omni.kit.livestream.app".primaryStream.streamPort

UDP port for media transport (please note that the default value has been changed from 1024 to 47998)

app.livestream.publicEndpointPort

exts."omni.kit.livestream.app".primaryStream.streamPort

UDP port for media transport (legacy if app.livestream.publicEndpointAddress was set, now streamPort always used`)

app.livestream.publicEndpointAddress

exts."omni.kit.livestream.app".primaryStream.publicIp

Public IP for NAT traversal

app.livestream.allowDynamicResize

exts."omni.kit.livestream.app".primaryStream.allowDynamicResize

Dynamic resize capability

app.livestream.webrtcEtli

exts."omni.kit.livestream.app".primaryStream.enableEventTracing

Event trace logging

Automatic Legacy Stream Setting Migration:

The system provides automatic migration for most legacy app stream settings:

  • Legacy settings related to app streaming under /app/livestream are automatically detected

  • Values are migrated to corresponding primary stream settings

  • Warning messages are logged encouraging migration to new settings

  • Legacy settings take precedence over new settings if both are present

Session Management Settings Migration#

Legacy NVCF Settings (Kit 107 and earlier):

[settings]
# DEPRECATED - These settings are now legacy
app.livestream.nvcf.quitOnSessionEnded = true
app.livestream.nvcf.sessionResumeTimeoutSeconds = 0
app.livestream.nvcf.waitForCustomReadyEvent = false

New Session Settings (Kit 108+):

[settings]
# Session management settings
exts."omni.services.livestream.session".quitOnSessionEnded = true
exts."omni.services.livestream.session".resumeTimeoutSeconds = 30
exts."omni.services.livestream.session".waitForSessionReadyEvent = false

Session Management Setting Mapping:

Legacy Setting

New Setting

Notes

app.livestream.nvcf.quitOnSessionEnded

exts."omni.services.livestream.session".quitOnSessionEnded

Whether to quit when session ends

app.livestream.nvcf.sessionResumeTimeoutSeconds

exts."omni.services.livestream.session".resumeTimeoutSeconds

Session resumption timeout - setting name changed, default changed from 0 to 30

app.livestream.nvcf.waitForCustomReadyEvent

exts."omni.services.livestream.session".waitForSessionReadyEvent

Wait for explicit session ready event - setting name changed

Logging Settings Migration#

Legacy Logging Settings (Kit 107 and earlier):

[settings]
# DEPRECATED - This setting has been removed
app.livestream.logLevel = "info"

New Logging Settings (Kit 108+):

[settings]
# Carb log channel based logging (consistent with other Kit extensions)
log.channels."omni.kit.livestream.streamsdk" = "error" # StreamSDK specific logging
log.channels."omni.kit.livestream.webrtc" = "info"     # WebRTC extension logging
log.channels."omni.kit.livestream.app" = "info"        # App extension logging
log.channels."omni.kit.livestream.aov" = "info"        # AOV extension logging

Logging Migration Notes:

  • The legacy /app/livestream/logLevel setting has been completely removed

  • Logging is now handled through carb’s log channel system for consistency with other Kit extensions

  • Each livestream extension has a dedicated log channel that can be configured independently

  • Available log levels: “disabled”, “fatal”, “error”, “warn”, “info”, “verbose”

  • StreamSDK has a dedicated log channel omni.kit.livestream.streamsdk that defaults to “error” to reduce noise

  • No automatic migration is provided for the legacy logLevel setting as it was set to “silence” by default

Command Line Migration#

Primary Stream Command Line Migration#

Kit 107 Command Line:

./kit/kit your_app.kit \
  --/app/livestream/port=49100 \
  --/app/livestream/fixedHostPort=47998

Kit 108 Command Line:

./kit/kit your_app.kit \
  --/exts/omni.kit.livestream.app/primaryStream/signalPort=49100 \
  --/exts/omni.kit.livestream.app/primaryStream/streamPort=47998

Session Management Command Line Migration#

Kit 107 NVCF Command Line:

./kit/kit your_app.kit \
  --/app/livestream/nvcf/quitOnSessionEnded=true \
  --/app/livestream/nvcf/sessionResumeTimeoutSeconds=0 \
  --/app/livestream/nvcf/waitForCustomReadyEvent=false \
  --/exts/omni.services.transport.server.http/port=8010

Kit 108 Session Command Line:

./kit/kit your_app.kit \
  --/exts/omni.services.livestream.session/quitOnSessionEnded=true \
  --/exts/omni.services.livestream.session/resumeTimeoutSeconds=30 \
  --/exts/omni.services.livestream.session/waitForSessionReadyEvent=false \
  --/exts/omni.services.transport.server.http/port=8011

Logging Command Line Migration#

Kit 107 Logging Command Line:

./kit/kit your_app.kit \
  --/app/livestream/logLevel=info

Kit 108 Logging Command Line:

./kit/kit your_app.kit \
  --/log/channels/omni.kit.livestream.streamsdk=error \
  --/log/channels/omni.kit.livestream.webrtc.plugin=info \
  --/log/channels/omni.kit.livestream.app.plugin=info

Breaking Changes#

  1. Extension Structure: The monolithic omni.kit.livestream.core has been split into focused extensions

  2. Setting Paths: All primary stream settings moved from /app/livestream to /exts/omni.kit.livestream.app/primaryStream

  3. Session Management Extension: omni.services.livestream.nvcf has been renamed to omni.services.livestream.session with updated settings paths

  4. Explicit Dependencies: Applications must now explicitly depend on omni.kit.livestream.app for application streaming

  5. AOV Streaming: Moved to separate omni.kit.livestream.aov extension with its own configuration structure

  6. Logging Settings: The /app/livestream/logLevel setting has been removed and replaced with carb log channel system

  7. HTTP Port Default: Session service HTTP port default changed from 8010 to 8011

Validation#

To verify successful migration:

  1. Check application starts without deprecation warnings in logs.

  2. Confirm streaming functionality works as expected.

  3. Verify all required extensions are properly loaded.

  4. Test both primary and spectator streams if applicable.

  5. Verify session management REST endpoints are accessible (if using session service).

For applications using AOV streaming, additional migration may be required for the omni.kit.livestream.aov extension configuration.