private static void ParseH264FormatAttributes(string[] formatAttributes, H264CodecInfo h264CodecInfo)
        {
            string spropParametersSet = formatAttributes.FirstOrDefault(fa =>
                                                                        fa.StartsWith("sprop-parameter-sets", StringComparison.InvariantCultureIgnoreCase));

            if (spropParametersSet == null)
            {
                return;
            }

            string spropParametersSetValue = GetFormatParameterValue(spropParametersSet);

            int commaIndex = spropParametersSetValue.IndexOf(',');

            if (commaIndex == -1)
            {
                byte[] sps = RawH264Frame.StartMarker.Concat(
                    Convert.FromBase64String(spropParametersSetValue)).ToArray();

                h264CodecInfo.SpsPpsBytes = sps;
            }
            else
            {
                IEnumerable <byte> sps = RawH264Frame.StartMarker.Concat(
                    Convert.FromBase64String(spropParametersSetValue.Substring(0, commaIndex)));

                ++commaIndex;

                IEnumerable <byte> pps = RawH264Frame.StartMarker.Concat(
                    Convert.FromBase64String(spropParametersSetValue.Substring(commaIndex)));

                h264CodecInfo.SpsPpsBytes = sps.Concat(pps).ToArray();
            }
        }
        public void Constructor_EmptySpsPps_NoExceptionGenerated()
        {
            H264CodecInfo testCodecInfo = new H264CodecInfo {
                SpsPpsBytes = Array.Empty <byte>()
            };

            new H264VideoPayloadParser(testCodecInfo);
        }
        private static H264CodecInfo CreateTestH264CodecInfo()
        {
            var testCodecInfo = new H264CodecInfo();

            var spsBytes = Convert.FromBase64String("AAAAAWdNQCmaZgUB7YC1AQEBBenA");
            var ppsBytes = Convert.FromBase64String("AAAAAWjuPIA=");

            testCodecInfo.SpsPpsBytes = spsBytes.Concat(ppsBytes).ToArray();
            return(testCodecInfo);
        }
        public void Parse_DifferentAggregationUnits_ReturnsValidIFrame(byte[] testBytes)
        {
            H264CodecInfo testCodecInfo = CreateTestH264CodecInfo();

            RawH264Frame frame  = null;
            var          parser = new H264VideoPayloadParser(testCodecInfo);

            parser.FrameGenerated = rawFrame => frame = (RawH264Frame)rawFrame;
            parser.Parse(TimeSpan.Zero, new ArraySegment <byte>(testBytes), true);

            Assert.IsNotNull(frame);
            Assert.IsInstanceOfType(frame, typeof(RawH264IFrame));
        }
Exemplo n.º 5
0
        private static CodecInfo TryCreateCodecInfo(int payloadFormatNumber)
        {
            CodecInfo codecInfo = null;

            switch (payloadFormatNumber)
            {
            case 0:
                codecInfo = new G711UCodecInfo();
                break;

            case 2:
                codecInfo = new G726CodecInfo(32 * 1000);
                break;

            case 8:
                codecInfo = new G711ACodecInfo();
                break;

            case 10:
                codecInfo = new PCMCodecInfo(44100, 16, 2);
                break;

            case 11:
                codecInfo = new PCMCodecInfo(44100, 16, 1);
                break;

            case 26:
                codecInfo = new MJPEGCodecInfo();
                break;

            case 98:
                codecInfo = new MetadataCodecInfo();
                break;

            case 105:
                codecInfo = new H264CodecInfo();
                break;
            }

            return(codecInfo);
        }
        public void Parse_SDPWithH264Track_ReturnsWithH264CodecTrack()
        {
            IEnumerable <byte> spsBytes =
                RawH264Frame.StartMarker.Concat(Convert.FromBase64String("Z2QAFKzZQ0R+f/zBfMMAQAAAAwBAAAAKI8UKZYA="));
            IEnumerable <byte> ppsBytes = RawH264Frame.StartMarker.Concat(Convert.FromBase64String("aOvssiw="));

            string testInput = "m=video 0 RTP/AVP 96\r\n" +
                               "a=control:streamid=0\r\n" +
                               "a=rtpmap:96 H264/90000\r\n" +
                               "a=fmtp:96 profile-level-id=640014;sprop-parameter-sets=Z2QAFKzZQ0R+f/zBfMMAQAAAAwBAAAAKI8UKZYA=,aOvssiw=\r\n";

            var testBytes = Encoding.ASCII.GetBytes(testInput);

            var parser = new SdpParser();
            RtspMediaTrackInfo videoTrack = parser.Parse(testBytes).Where(t => t is RtspMediaTrackInfo)
                                            .Cast <RtspMediaTrackInfo>().First();

            H264CodecInfo codecInfo = (H264CodecInfo)videoTrack.Codec;

            Assert.IsTrue(spsBytes.Concat(ppsBytes).SequenceEqual(codecInfo.SpsPpsBytes));
        }
        public H264VideoPayloadParser(H264CodecInfo codecInfo)
        {
            if (codecInfo == null)
            {
                throw new ArgumentNullException(nameof(codecInfo));
            }
            if (codecInfo.SpsPpsBytes == null)
            {
                throw new ArgumentException($"{nameof(codecInfo.SpsPpsBytes)} is null", nameof(codecInfo));
            }

            _h264Parser = new H264Parser {
                FrameGenerated = OnFrameGenerated
            };

            if (codecInfo.SpsPpsBytes.Length != 0)
            {
                _h264Parser.Parse(DateTime.MinValue, new ArraySegment <byte>(codecInfo.SpsPpsBytes), false, false);
            }

            _nalBuffer = new ElasticBuffer(8 * 1024, 512 * 1024);
        }
        public H264VideoPayloadParser(H264CodecInfo codecInfo)
        {
            if (codecInfo == null)
            {
                throw new ArgumentNullException(nameof(codecInfo));
            }
            if (codecInfo.SpsPpsBytes == null)
            {
                throw new ArgumentException($"{nameof(codecInfo.SpsPpsBytes)} is null", nameof(codecInfo));
            }

            _h264Parser = new H264Parser(() => GetFrameTimestamp(_timeOffset))
            {
                FrameGenerated = OnFrameGenerated
            };

            if (codecInfo.SpsPpsBytes.Length != 0)
            {
                _h264Parser.Parse(new ArraySegment <byte>(codecInfo.SpsPpsBytes), false);
            }

            _nalStream = new MemoryStream(8 * 1024);
        }