/// <summary> /// Save screenshots when we receive video from subscribed participant. /// </summary> /// <param name="sender"> /// The sender. /// </param> /// <param name="e"> /// The video media received arguments. /// </param> private void OnVideoMediaReceived(object sender, VideoMediaReceivedEventArgs e) { // leave only logging in here this.logger.Info($"[{this.Call.Id}]: Capturing image: [VideoMediaReceivedEventArgs(Data=<{e.Buffer.Data.ToString()}>, Length={e.Buffer.Length}, Timestamp={e.Buffer.Timestamp}, Width={e.Buffer.VideoFormat.Width}, Height={e.Buffer.VideoFormat.Height}, ColorFormat={e.Buffer.VideoFormat.VideoColorFormat}, FrameRate={e.Buffer.VideoFormat.FrameRate})]"); e.Buffer.Dispose(); }
/// <summary> /// Receive vbss from subscribed participant. /// </summary> /// <param name="sender"> /// The sender. /// </param> /// <param name="e"> /// The video media received arguments. /// </param> private void OnVbssMediaReceived(object sender, VideoMediaReceivedEventArgs e) { this.GraphLogger.Info($"[{e.SocketId}]: Received VBSS: [VideoMediaReceivedEventArgs(Data=<{e.Buffer.Data.ToString()}>, Length={e.Buffer.Length}, Timestamp={e.Buffer.Timestamp}, Width={e.Buffer.VideoFormat.Width}, Height={e.Buffer.VideoFormat.Height}, ColorFormat={e.Buffer.VideoFormat.VideoColorFormat}, FrameRate={e.Buffer.VideoFormat.FrameRate})]"); // TBD: Policy Recording bots can record the VBSS here e.Buffer.Dispose(); }
/// <summary> /// Save screenshots when we receive video from the subscribed participant. /// </summary> /// <param name="sender"> /// The sender. /// </param> /// <param name="e"> /// The video media received arguments. /// </param> private void OnVideoMediaReceived(object sender, VideoMediaReceivedEventArgs e) { // leave only logging in here this.logger.Info($"[VideoMediaReceivedEventArgs(Data=<{e.Buffer.Data.ToString()}>, Length={e.Buffer.Length}, Timestamp={e.Buffer.Timestamp}, Width={e.Buffer.VideoFormat.Width}, Height={e.Buffer.VideoFormat.Height}, ColorFormat={e.Buffer.VideoFormat.VideoColorFormat}, FrameRate={e.Buffer.VideoFormat.FrameRate})]"); /* TODO: Do something with video here */ e.Buffer.Dispose(); }
/// <summary> /// Save screenshots when we receive video from subscribed participant. /// </summary> /// <param name="sender"> /// The sender. /// </param> /// <param name="e"> /// The video media received arguments. /// </param> private void OnVideoMediaReceived(object sender, VideoMediaReceivedEventArgs e) { try { if (Interlocked.Decrement(ref this.maxIngestFrameCount) > 0) { this.logger.Info( $"[{this.Call.Id}]: Capturing image: [VideoMediaReceivedEventArgs(Data=<{e.Buffer.Data.ToString()}>, " + $"Length={e.Buffer.Length}, Timestamp={e.Buffer.Timestamp}, Width={e.Buffer.VideoFormat.Width}, " + $"Height={e.Buffer.VideoFormat.Height}, ColorFormat={e.Buffer.VideoFormat.VideoColorFormat}, FrameRate={e.Buffer.VideoFormat.FrameRate})]"); } // 33 ms frequency ~ 30 fps if (DateTime.Now > this.lastVideoSentTimeUtc + TimeSpan.FromMilliseconds(33)) { this.lastVideoSentTimeUtc = DateTime.Now; // Step 1: Send Video with added hue byte[] buffer = e.Buffer.ApplyHue(this.hueColor); // Use the real length of the data (Media may send us a larger buffer) VideoFormat sendVideoFormat = e.Buffer.VideoFormat.GetSendVideoFormat(); var videoSendBuffer = new VideoSendBuffer(buffer, (uint)buffer.Length, sendVideoFormat); this.Call.GetLocalMediaSession().VideoSocket.Send(videoSendBuffer); if (DateTime.Now > this.lastVideoCapturedTimeUtc + this.videoCaptureFrequency) { // Step 2: Update screenshot of image with hue applied. // Update the last capture timestamp this.lastVideoCapturedTimeUtc = DateTime.Now; // Transform to bitmap object Bitmap bmpObject = MediaUtils.TransformNv12ToBmpFaster( buffer, e.Buffer.VideoFormat.Width, e.Buffer.VideoFormat.Height, this.logger); // Update the bitmap cache this.LatestScreenshotImage = bmpObject; } } } catch (Exception ex) { this.logger.Error(ex, $"[{this.Call.Id}] Exception in VideoMediaReceived"); } e.Buffer.Dispose(); }
/// <summary> /// Callback from the media platform when raw video is received. This is loopbacked to the user after adding the hue of the user's choice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnVideoMediaReceived(object sender, VideoMediaReceivedEventArgs e) { try { CorrelationId.SetCurrentId(_correlationId); Log.Verbose( new CallerInfo(), LogContext.Media, "[{0}] [VideoMediaReceivedEventArgs(Data=<{1}>, Length={2}, Timestamp={3}, Width={4}, Height={5}, ColorFormat={6}, FrameRate={7})]", this.Id, e.Buffer.Data.ToString(), e.Buffer.Length, e.Buffer.Timestamp, e.Buffer.VideoFormat.Width, e.Buffer.VideoFormat.Height, e.Buffer.VideoFormat.VideoColorFormat, e.Buffer.VideoFormat.FrameRate); byte[] buffer = new byte[e.Buffer.Length]; Marshal.Copy(e.Buffer.Data, buffer, 0, (int)e.Buffer.Length); VideoMediaBuffer videoRenderMediaBuffer = e.Buffer as VideoMediaBuffer; AddHue(DefaultHueColor, buffer, e.Buffer.VideoFormat.Width, e.Buffer.VideoFormat.Height); VideoFormat sendVideoFormat = GetSendVideoFormat(e.Buffer.VideoFormat); var videoSendBuffer = new VideoSendBuffer(buffer, (uint)buffer.Length, sendVideoFormat); _videoSocket.Send(videoSendBuffer); } catch (Exception ex) { Log.Error(new CallerInfo(), LogContext.Media, $"[{this.Id}]: Exception in VideoMediaReceived {ex.ToString()}"); } finally { e.Buffer.Dispose(); } }
private void OnVideoMediaReceived(object sender, VideoMediaReceivedEventArgs e) { try { CorrelationId.SetCurrentId(_correlationId); if (DateTime.Now > this._lastVideoCapturedTimeUtc + this.VideoCaptureFrequency) { // Update the last capture timestamp this._lastVideoCapturedTimeUtc = DateTime.Now; Log.Info( new CallerInfo(), LogContext.Media, "[{0}]: Capturing image: [VideoMediaReceivedEventArgs(Data=<{1}>, Length={2}, Timestamp={3}, Width={4}, Height={5}, ColorFormat={6}, FrameRate={7})]", this.Id, e.Buffer.Data.ToString(), e.Buffer.Length, e.Buffer.Timestamp, e.Buffer.VideoFormat.Width, e.Buffer.VideoFormat.Height, e.Buffer.VideoFormat.VideoColorFormat, e.Buffer.VideoFormat.FrameRate); // Make a copy of the media buffer Stopwatch watch = new Stopwatch(); watch.Start(); byte[] buffer = new byte[e.Buffer.Length]; Marshal.Copy(e.Buffer.Data, buffer, 0, (int)e.Buffer.Length); VideoMediaBuffer videoRenderMediaBuffer = e.Buffer as VideoMediaBuffer; IntPtr ptrToBuffer = Marshal.AllocHGlobal(buffer.Length); Marshal.Copy(buffer, 0, ptrToBuffer, buffer.Length); watch.Stop(); Log.Info(new CallerInfo(), LogContext.Media, $"{this.Id} Took {watch.ElapsedMilliseconds} ms to copy buffer"); // Transform to bitmap object Bitmap bmpObject = MediaUtils.TransformNV12ToBmpFaster(buffer, e.Buffer.VideoFormat.Width, e.Buffer.VideoFormat.Height); bool sendChatMessage = (CurrentVideoImage == null); Log.Info(new CallerInfo(), LogContext.Media, $"{this.Id} send chat message {sendChatMessage}"); // 3. Update the bitmap cache CurrentVideoImage = bmpObject; if (sendChatMessage) { Task.Run(async() => { try { await RealTimeMediaCall.SendMessageForCall(RealTimeMediaCall); }catch (Exception ex) { Log.Info(new CallerInfo(), LogContext.FrontEnd, $"Exception in SendingChatMessage {ex}"); } }); } } } catch (Exception ex) { Log.Error(new CallerInfo(), LogContext.Media, $"{this.Id} Exception in VideoMediaReceived {ex.ToString()}"); } e.Buffer.Dispose(); }