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)); }
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); }