protected virtual void OnPlaybackClipVideoCodecChanged(OscMessage message)
        {
            var channelLayer = message.GetChannelAndLayer();

            if (channelLayer.Item1 == null || channelLayer.Item2 == null)
            {
                return;
            }

            var codec = message.FirstOrDefault()?.ToString();

            PlaybackClipVideoCodecChanged?.Invoke(this, new PlaybackClipCodecEventArg(codec, message.IsBackground(), channelLayer.Item1.Value, channelLayer.Item2.Value));
        }
        protected virtual void OnPlaybackClipFieldChanged(OscMessage message)
        {
            var channelLayer = message.GetChannelAndLayer();

            if (channelLayer.Item1 == null || channelLayer.Item2 == null)
            {
                return;
            }

            var isProgresive = ProgressiveValue.Equals(message.FirstOrDefault()?.ToString(), StringComparison.OrdinalIgnoreCase);

            PlaybackClipFieldChanged?.Invoke(this, new PlaybackClipFieldEventArg(isProgresive, message.IsBackground(), channelLayer.Item1.Value, channelLayer.Item2.Value));
        }
        protected virtual void OnPlaybackLoopChanged(OscMessage message)
        {
            var channelLayer = message.GetChannelAndLayer();

            if (channelLayer.Item1 == null || channelLayer.Item2 == null)
            {
                return;
            }

            var isLoop = (bool)message.FirstOrDefault();

            PlaybackLoopChanged?.Invoke(this, new PlaybackLoopEventArgs(isLoop, message.IsBackground(), channelLayer.Item1.Value, channelLayer.Item2.Value));
        }