7.7 KiB
7.7 KiB
Frame Rate Synchronization Specification
Overview
This document specifies the implementation details for synchronizing video playback with Maya's timeline frame rate and providing user-adjustable playback rate control.
Requirements
- Read Maya's current frame rate from the timeline
- Synchronize video frame advancement with Maya's timeline when enabled
- Allow user to override playback speed with a multiplier
- Support looping and non-looping playback modes
- Handle frame rate changes in Maya's timeline dynamically
- Provide smooth playback even when Maya's frame rate differs from video's native frame rate
Implementation Details
Frame Rate Sources
- Maya's Timeline Frame Rate: Obtained from
MTime::uiUnit()orMTime::getFrameRate() - Video's Native Frame Rate: Obtained from FFmpeg decoder (
getFrameRate()method) - User Playback Rate Multiplier: Custom attribute on the MPxNode
Core Logic
Frame Calculation Algorithm
When useMayaFrameRate is enabled:
effectiveFrameRate = mayaFrameRate * userPlaybackRate
targetFrame = (currentTime - startTime) * effectiveFrameRate
When useMayaFrameRate is disabled:
effectiveFrameRate = videoFrameRate * userPlaybackRate
targetFrame = (currentTime - startTime) * effectiveFrameRate
Where:
currentTime: Maya's current time in secondsstartTime: Time when video playback started or was resettargetFrame: Frame number to display (0-based)mayaFrameRate: Frames per second from Maya's timelinevideoFrameRate: Native frames per second from video fileuserPlaybackRate: User-defined multiplier (1.0 = normal speed)
Implementation Components
Time Management Class
Handles time calculations and frame targeting:
- Store start time when playback begins or resets
- Calculate target frame based on current time and settings
- Handle looping by wrapping target frame within video duration
- Provide methods to get current frame with sub-frame precision for interpolation
Attribute Definitions
In the MPxNode:
useMayaFrameRate(bool): Toggle between Maya-synced and video-native frame ratesplaybackRate(double): User-adjustable playback rate multiplier (default 1.0)startTime(double): Internal attribute to track when playback startedisPlaying(bool): Internal attribute to track playback state
Integration with Maya Timeline
- Connect to Maya's timeChanged event via node attributes
- Use
currentTimeinput attribute driven by Maya's timeline - Update node computation when timeline changes
- Handle scrubbing (jumping to different times) correctly
Threading Considerations
- Time calculations occur on Maya's main thread during node computation
- No shared state with decoding thread except for frame requests
- Frame requests to decoder should be thread-safe
Error Handling
- Handle invalid frame rates (zero or negative)
- Clamp playback rate to reasonable range (e.g., 0.01 to 10.0)
- Handle case where video frame rate is unavailable
- Graceful degradation to approximate synchronization
Performance Considerations
- Minimize calculations in node compute method
- Cache Maya's frame rate when possible (update only when changed)
- Avoid expensive trigonometric or transcendental functions in real-time paths
Integration Points
- MPxNode: Provides frame calculation logic and attributes
- FFmpeg Decoder: Receives frame requests based on calculated target frame
- Viewport 2.0: Displays the frame requested by the synchronization logic
- Caching: Requests frames from cache based on target frame
Maya API Specifics
- Use MTime class for time manipulations
- Use MAnimControl to get Maya's current time if not using attribute connection
- Use MTime::uiUnit() to get current UI time unit
- Register time changed callbacks if needed for more responsive updates
Dependencies
- Maya API 2023 (MTime, MAnimControl)
- MPxNode implementation
- FFmpeg decoder interface
Overview
This document specifies the implementation details for synchronizing video playback with Maya's timeline frame rate and providing user-adjustable playback rate control.
Requirements
- Read Maya's current frame rate from the timeline
- Synchronize video frame advancement with Maya's timeline when enabled
- Allow user to override playback speed with a multiplier
- Support looping and non-looping playback modes
- Handle frame rate changes in Maya's timeline dynamically
- Provide smooth playback even when Maya's frame rate differs from video's native frame rate
Implementation Details
Frame Rate Sources
- Maya's Timeline Frame Rate: Obtained from
MTime::uiUnit()orMTime::getFrameRate() - Video's Native Frame Rate: Obtained from FFmpeg decoder (
getFrameRate()method) - User Playback Rate Multiplier: Custom attribute on the MPxNode
Core Logic
Frame Calculation Algorithm
When useMayaFrameRate is enabled:
effectiveFrameRate = mayaFrameRate * userPlaybackRate
targetFrame = (currentTime - startTime) * effectiveFrameRate
When useMayaFrameRate is disabled:
effectiveFrameRate = videoFrameRate * userPlaybackRate
targetFrame = (currentTime - startTime) * effectiveFrameRate
Where:
currentTime: Maya's current time in secondsstartTime: Time when video playback started or was resettargetFrame: Frame number to display (0-based)mayaFrameRate: Frames per second from Maya's timelinevideoFrameRate: Native frames per second from video fileuserPlaybackRate: User-defined multiplier (1.0 = normal speed)
Implementation Components
Time Management Class
Handles time calculations and frame targeting:
- Store start time when playback begins or resets
- Calculate target frame based on current time and settings
- Handle looping by wrapping target frame within video duration
- Provide methods to get current frame with sub-frame precision for interpolation
Attribute Definitions
In the MPxNode:
useMayaFrameRate(bool): Toggle between Maya-synced and video-native frame ratesplaybackRate(double): User-adjustable playback rate multiplier (default 1.0)startTime(double): Internal attribute to track when playback startedisPlaying(bool): Internal attribute to track playback state
Integration with Maya Timeline
- Connect to Maya's timeChanged event via node attributes
- Use
currentTimeinput attribute driven by Maya's timeline - Update node computation when timeline changes
- Handle scrubbing (jumping to different times) correctly
Threading Considerations
- Time calculations occur on Maya's main thread during node computation
- No shared state with decoding thread except for frame requests
- Frame requests to decoder should be thread-safe
Error Handling
- Handle invalid frame rates (zero or negative)
- Clamp playback rate to reasonable range (e.g., 0.01 to 10.0)
- Handle case where video frame rate is unavailable
- Graceful degradation to approximate synchronization
Performance Considerations
- Minimize calculations in node compute method
- Cache Maya's frame rate when possible (update only when changed)
- Avoid expensive trigonometric or transcendental functions in real-time paths
Integration Points
- MPxNode: Provides frame calculation logic and attributes
- FFmpeg Decoder: Receives frame requests based on calculated target frame
- Viewport 2.0: Displays the frame requested by the synchronization logic
- Caching: Requests frames from cache based on target frame
Maya API Specifics
- Use MTime class for time manipulations
- Use MAnimControl to get Maya's current time if not using attribute connection
- Use MTime::uiUnit() to get current UI time unit
- Register time changed callbacks if needed for more responsive updates
Dependencies
- Maya API 2023 (MTime, MAnimControl)
- MPxNode implementation
- FFmpeg decoder interface