/// <summary> /// Creates media frame data segments. /// </summary> /// <param name="mediaFrame">Media frame.</param> /// <param name="metadataRequired">Indicates whether to include metadata.</param> /// <returns>An array of data segments.</returns> private static ArraySegment <byte>[] CreateDataSegments(RawFrame mediaFrame, bool metadataRequired) { if (!metadataRequired) { return new[] { new byte[] { 0 }, mediaFrame.FrameSegment } } ; var codecName = mediaFrame switch { RawAACFrame _ => "AAC", RawG711AFrame _ => "G711A", RawG711UFrame _ => "G711U", RawG726Frame _ => "G726", RawPCMFrame _ => "PCM", RawH264IFrame _ => "H264", RawH264PFrame _ => "H264", RawJpegFrame _ => "MJPEG", _ => string.Empty }; var bitsPerCodedUnit = mediaFrame switch { RawG726Frame rawG726Frame => rawG726Frame.BitsPerCodedSample, _ => 0 }; var configSegment = mediaFrame switch { RawAACFrame rawAacFrame => rawAacFrame.ConfigSegment, RawH264IFrame rawH264IFrame => rawH264IFrame.SpsPpsSegment, _ => default }; var codecBytes = Encoding.UTF8.GetBytes(codecName); Array.Resize(ref codecBytes, 10); var metaSegment = new byte[19]; using var stream = new MemoryStream(metaSegment); using var writer = new EndianBinaryWriter(stream); writer.Write((byte)1); writer.Write(codecBytes); writer.Write(bitsPerCodedUnit); writer.Write(configSegment.Count); return(configSegment.Count > 0 ? new[] { metaSegment, configSegment, mediaFrame.FrameSegment } : new[] { metaSegment, mediaFrame.FrameSegment }); }
private void GenerateFrame(TimeSpan timeOffset) { ArraySegment <byte> stateBytes = _frameBuffer.StateByteSegment; if (!ArrayUtils.EndsWith(stateBytes.Array, stateBytes.Offset, stateBytes.Count, RawJpegFrame.EndMarkerBytes)) { _frameBuffer.AddBytes(JpegEndMarkerByteSegment); } DateTime timestamp = GetFrameTimestamp(timeOffset); ArraySegment <byte> frameBytes = _frameBuffer.GetAccumulatedBytes(); var frame = new RawJpegFrame(timestamp, frameBytes); OnFrameGenerated(frame); }
private void GenerateFrame(TimeSpan timeOffset) { if (!ArrayUtils.EndsWith(_frameStream.GetBuffer(), 0, (int)_frameStream.Position, RawJpegFrame.EndMarkerBytes)) { _frameStream.Write(JpegEndMarkerByteSegment.Array, JpegEndMarkerByteSegment.Offset, JpegEndMarkerByteSegment.Count); } DateTime timestamp = GetFrameTimestamp(timeOffset); var frameBytes = new ArraySegment <byte>(_frameStream.GetBuffer(), 0, (int)_frameStream.Position); _frameStream.Position = 0; var frame = new RawJpegFrame(timestamp, frameBytes); OnFrameGenerated(frame); }
public void Parse_TestData_ReturnsValidFrame() { byte[] header = GenerateFakeHeader(); byte[] testBytes1 = header.Concat(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }).ToArray(); byte[] testBytes2 = header.Concat(new byte[] { 1, 2, 3, 4 }).ToArray(); RawJpegFrame frame = null; var parser = new MJPEGVideoPayloadParser(); parser.FrameGenerated = rawFrame => frame = (RawJpegFrame)rawFrame; parser.Parse(TimeSpan.Zero, new ArraySegment <byte>(testBytes1), false); parser.Parse(TimeSpan.Zero, new ArraySegment <byte>(testBytes2), false); Assert.IsNotNull(frame); Assert.AreEqual(FrameType.Video, frame.Type); Assert.IsTrue(frame.FrameSegment.Count > 0); }
/************************************************************************/ #region Private methods private void MpStreamFrameReceived(object sender, RawJpegFrame e) { FrameReceived?.Invoke(this, e); }
/************************************************************************/ #region Private methods private void MjpegClientFrameReceived(object sender, RawJpegFrame e) { OnVideoFrameReceived(e); }