Example #1
0
        /// <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);
        }
Example #3
0
        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);
        }
Example #5
0
        /************************************************************************/

        #region Private methods
        private void MpStreamFrameReceived(object sender, RawJpegFrame e)
        {
            FrameReceived?.Invoke(this, e);
        }
Example #6
0
        /************************************************************************/

        #region Private methods
        private void MjpegClientFrameReceived(object sender, RawJpegFrame e)
        {
            OnVideoFrameReceived(e);
        }