/// <summary>
        /// Callback handler for the lowOnFrames event that the vbss frame player will raise when there are no more frames to stream.
        /// The behavior is to enqueue more frames.
        /// </summary>
        /// <param name="sender">The vbss frame player.</param>
        /// <param name="e">LowOnframes eventArgs.</param>
        private void OnVbssPlayerLowOnFrames(object sender, LowOnFramesEventArgs e)
        {
            if (this.shutdown != 1)
            {
                this.logger.Info($"Low on frames event raised for the vbss player, remaining lenght is {e.RemainingMediaLengthInMS} ms");

                // Create the video buffers
                this.vbssMediaBuffers = Utilities.CreateVideoMediaBuffers(DateTime.Now.Ticks, this.vbssKnownSupportedFormats, true, this.logger);
                this.vbssFramePlayer?.EnqueueBuffersAsync(new List <AudioMediaBuffer>(), this.vbssMediaBuffers).ForgetAndLogExceptionAsync(this.logger);
                this.logger.Info("enqueued more frames in the vbssFramePlayer");
            }
        }
        /// <summary>
        /// Event to signal the player is low on frames.
        /// </summary>
        /// <param name="sender">The video socket.</param>
        /// <param name="e">Event containing media type and length of media remaining.</param>
        private void OnAudioVideoFramePlayerLowOnFrames(object sender, LowOnFramesEventArgs e)
        {
            if (this.shutdown != 1)
            {
                this.logger.Info($"Low on frames event raised for {e.MediaType}, remaining lenght is {e.RemainingMediaLengthInMS} ms");

                // here we want to keep the AV creation in sync so we take as reference audio.
                if (e.MediaType == MediaType.Audio)
                {
                    // use the past tick as reference to avoid av out of sync
                    this.CreateAVBuffers(this.mediaTick, replayed: true);
                    this.audioVideoFramePlayer?.EnqueueBuffersAsync(this.audioMediaBuffers, this.videoMediaBuffers).ForgetAndLogExceptionAsync(this.logger, "Failed to enqueue AV buffers");

                    this.logger.Info($"Low on audio event raised, enqueued {this.audioMediaBuffers.Count} buffers last audio tick {this.audioTick} and mediatick {this.mediaTick}");
                }

                this.logger.Info("enqueued more frames in the audioVideoPlayer");
            }
        }
        private void OnLowOnFrames(object sender, LowOnFramesEventArgs e)
        {
            if (Interlocked.CompareExchange(ref _disposed, 1, 1) == 1)
            {
                return;
            }

            Log.Info(
                new CallerInfo(),
                LogContext.Media,
                "Low in frames event raised]");
            _videoMediaBuffers = _downloadManager.GetVideoMediaBuffers(_mediaTick);
            _audioMediaBuffers = _downloadManager.GetAudioMediaBuffers(_mediaTick);
            _mediaTick         = Math.Max(_audioMediaBuffers.Last().Timestamp, _videoMediaBuffers.Last().Timestamp);
            _audioVideoFramePlayer.EnqueueBuffersAsync(_audioMediaBuffers, _videoMediaBuffers).ForgetAndLogException();
            Log.Info(
                new CallerInfo(),
                LogContext.Media,
                "enqueued more frames in frames event raised");
        }