Skip to content

Commit 8f59586

Browse files
committed
R Refactoring, comments, cleanup
1 parent e061625 commit 8f59586

7 files changed

Lines changed: 467 additions & 160 deletions

File tree

src/RTSPServerApp/Program.cs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,6 @@
1515

1616
using (var server = new RTSPServer(port, userName, password))
1717
{
18-
try
19-
{
20-
server.StartListen();
21-
}
22-
catch (Exception ex)
23-
{
24-
Console.WriteLine(ex.ToString());
25-
}
26-
27-
Console.WriteLine($"RTSP URL is rtsp://{userName}:{password}@{hostName}:{port}");
28-
2918
Dictionary<uint, IList<IList<byte[]>>> parsedMDAT;
3019
uint videoTrackId = 0;
3120
uint audioTrackId = 0;
@@ -75,11 +64,11 @@
7564
{
7665
if (videoIndex == 0)
7766
{
78-
rtspVideoTrack.SetSPS_PPS(videoTrack[0][0], videoTrack[0][1]);
67+
rtspVideoTrack.SetParameterSets(videoTrack[0][0], videoTrack[0][1]);
7968
videoIndex++;
8069
}
8170

82-
server.FeedInRawNAL((uint)(videoIndex * videoSampleDuration), (List<byte[]>)videoTrack[videoIndex++ % videoTrack.Count]);
71+
server.FeedInRawVideoSamples((uint)(videoIndex * videoSampleDuration), (List<byte[]>)videoTrack[videoIndex++ % videoTrack.Count]);
8372

8473
if (videoIndex % videoTrack.Count == 0)
8574
{
@@ -94,12 +83,13 @@
9483
var audioTrack = parsedMDAT[audioTrackId];
9584
var audioConfigDescriptor = audioSampleEntry.GetAudioSpecificConfigDescriptor();
9685
var audioSamplingRate = audioConfigDescriptor.GetSamplingFrequency();
97-
var rtspAudioTrack = new SharpRTSPServer.AACTrack(audioSamplingRate, audioConfigDescriptor.ChannelConfiguration, await audioConfigDescriptor.ToBytes());
86+
var rtspAudioTrack = new SharpRTSPServer.AACTrack(audioSamplingRate, audioConfigDescriptor.ChannelConfiguration);
87+
rtspAudioTrack.SetConfigDescriptor(await audioConfigDescriptor.ToBytes());
9888
server.AudioTrack = rtspAudioTrack;
9989
audioTimer = new Timer(audioSampleDuration * 1000 / audioSamplingRate);
10090
audioTimer.Elapsed += (s, e) =>
10191
{
102-
server.FeedInAudioPacket((uint)(audioIndex * audioSampleDuration), audioTrack[0][audioIndex++ % audioTrack[0].Count]);
92+
server.FeedInRawAudioSamples((uint)(audioIndex * audioSampleDuration), new List<byte[]>() { audioTrack[0][audioIndex++ % audioTrack[0].Count] });
10393

10494
if (audioIndex % audioTrack[0].Count == 0)
10595
{
@@ -108,6 +98,17 @@
10898
};
10999
}
110100

101+
try
102+
{
103+
server.StartListen();
104+
}
105+
catch (Exception ex)
106+
{
107+
Console.WriteLine(ex.ToString());
108+
}
109+
110+
Console.WriteLine($"RTSP URL is rtsp://{userName}:{password}@{hostName}:{port}");
111+
111112
videoTimer?.Start();
112113
audioTimer?.Start();
113114

src/SharpRTSPClient/RTSPClient.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ public class RTSPClient : IDisposable
3838
private readonly ILogger _logger;
3939
private readonly ILoggerFactory _loggerFactory;
4040

41-
// Events that applications can receive
4241
public event EventHandler<NewStreamEventArgs> NewVideoStream;
4342
public event EventHandler<NewStreamEventArgs> NewAudioStream;
4443
public event EventHandler<SimpleDataEventArgs> ReceivedVideoData;
@@ -289,7 +288,7 @@ public void Pause()
289288
}
290289

291290
/// <summary>
292-
/// Play.
291+
/// Start playing.
293292
/// </summary>
294293
/// <exception cref="InvalidOperationException"></exception>
295294
public void Play()
@@ -362,7 +361,7 @@ public void Play(DateTime seekTimeFrom, DateTime seekTimeTo, double speed = 1.0)
362361
}
363362

364363
/// <summary>
365-
/// Stop.
364+
/// Stop playing.
366365
/// </summary>
367366
public void Stop()
368367
{

src/SharpRTSPServer/AACTrack.cs

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,89 @@
66

77
namespace SharpRTSPServer
88
{
9+
/// <summary>
10+
/// AAC track.
11+
/// </summary>
912
public class AACTrack : ITrack
1013
{
14+
/// <summary>
15+
/// Track ID.
16+
/// </summary>
1117
public int ID { get; set; } = 1;
18+
19+
/// <summary>
20+
/// Sampling rate.
21+
/// </summary>
1222
public int SamplingRate { get; set; } = 44100;
23+
24+
/// <summary>
25+
/// Number of channels.
26+
/// </summary>
1327
public int Channels { get; set; } = 1;
14-
public string ConfigDescriptor { get; set; } = "1390"; // hex
1528

16-
public bool IsReady { get { return !string.IsNullOrWhiteSpace(ConfigDescriptor); } }
29+
/// <summary>
30+
/// AAC configuration descriptor.
31+
/// </summary>
32+
public byte[] ConfigDescriptor { get; set; }
33+
34+
/// <summary>
35+
/// Is the track ready?
36+
/// </summary>
37+
public bool IsReady { get { return ConfigDescriptor != null && ConfigDescriptor.Length > 0; } }
38+
39+
private int _payloadType = -1;
1740

18-
public int PayloadType => RTSPServer.DYNAMIC_PAYLOAD_TYPE + ID;
41+
/// <summary>
42+
/// Payload type. AAC uses a dynamic payload type, which by default we calculate as 96 + track ID.
43+
/// </summary>
44+
public int PayloadType
45+
{
46+
get
47+
{
48+
if (_payloadType < 0)
49+
{
50+
return RTSPServer.DYNAMIC_PAYLOAD_TYPE + ID;
51+
}
52+
else
53+
{
54+
return _payloadType;
55+
}
56+
}
57+
set
58+
{
59+
_payloadType = value;
60+
}
61+
}
1962

20-
public AACTrack(int samplingRate, int channels, byte[] configDescriptor)
63+
/// <summary>
64+
/// Ctor.
65+
/// </summary>
66+
/// <param name="samplingRate">Audio sampling rate.</param>
67+
/// <param name="channels">Number of audio channels.</param>
68+
public AACTrack(int samplingRate, int channels)
2169
{
2270
this.SamplingRate = samplingRate;
2371
this.Channels = channels;
24-
this.ConfigDescriptor = Utilities.ToHexString(configDescriptor);
72+
}
73+
74+
/// <summary>
75+
/// Ctor.
76+
/// </summary>
77+
/// <param name="configDescriptor">AAC configuration descriptor.</param>
78+
/// <param name="samplingRate">Audio sampling rate.</param>
79+
/// <param name="channels">Number of audio channels.</param>
80+
public AACTrack(byte[] configDescriptor, int samplingRate, int channels) : this(samplingRate, channels)
81+
{
82+
SetConfigDescriptor(configDescriptor);
83+
}
84+
85+
/// <summary>
86+
/// Set the AAC configuration Descriptor.
87+
/// </summary>
88+
/// <param name="configDescriptor">AAC Configuration Descriptor.</param>
89+
public void SetConfigDescriptor(byte[] configDescriptor)
90+
{
91+
this.ConfigDescriptor = configDescriptor;
2592
}
2693

2794
public StringBuilder BuildSDP(StringBuilder sdp)
@@ -30,11 +97,11 @@ public StringBuilder BuildSDP(StringBuilder sdp)
3097
sdp.Append($"a=control:trackID={ID}\n");
3198
sdp.Append($"a=rtpmap:{PayloadType} mpeg4-generic/{SamplingRate}/{Channels}\n");
3299
sdp.Append($"a=fmtp:{PayloadType} profile-level-id={GetAACProfileLevel(SamplingRate, Channels)}; " +
33-
$"config={ConfigDescriptor}; streamType=5; mode=AAC-hbr; objectType=64; sizeLength=13; indexLength=3; indexDeltaLength=3\n");
100+
$"config={Utilities.ToHexString(ConfigDescriptor)}; streamType=5; mode=AAC-hbr; objectType=64; sizeLength=13; indexLength=3; indexDeltaLength=3\n");
34101
return sdp;
35102
}
36103

37-
public (List<Memory<byte>>, List<IMemoryOwner<byte>>) PrepareRtpPackets(List<byte[]> samples, uint rtpTimestamp)
104+
public (List<Memory<byte>>, List<IMemoryOwner<byte>>) CreateRtpPackets(List<byte[]> samples, uint rtpTimestamp)
38105
{
39106
List<Memory<byte>> rtpPackets = new List<Memory<byte>>();
40107
List<IMemoryOwner<byte>> memoryOwners = new List<IMemoryOwner<byte>>();

src/SharpRTSPServer/G711Track.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class PCMUTrack : ITrack
1313

1414
public bool IsReady { get { return true; } }
1515

16-
public int PayloadType => 0;
16+
public int PayloadType { get; set; } = 0;
1717

1818
public StringBuilder BuildSDP(StringBuilder sdp)
1919
{
@@ -23,7 +23,7 @@ public StringBuilder BuildSDP(StringBuilder sdp)
2323
return sdp;
2424
}
2525

26-
public (List<Memory<byte>>, List<IMemoryOwner<byte>>) PrepareRtpPackets(List<byte[]> samples, uint rtpTimestamp)
26+
public (List<Memory<byte>>, List<IMemoryOwner<byte>>) CreateRtpPackets(List<byte[]> samples, uint rtpTimestamp)
2727
{
2828
List<Memory<byte>> rtpPackets = new List<Memory<byte>>();
2929
List<IMemoryOwner<byte>> memoryOwners = new List<IMemoryOwner<byte>>();
@@ -62,7 +62,7 @@ public class PCMATrack : ITrack
6262

6363
public bool IsReady { get { return true; } }
6464

65-
public int PayloadType => 8;
65+
public int PayloadType { get; set; } = 8;
6666

6767
public StringBuilder BuildSDP(StringBuilder sdp)
6868
{
@@ -72,7 +72,7 @@ public StringBuilder BuildSDP(StringBuilder sdp)
7272
return sdp;
7373
}
7474

75-
public (List<Memory<byte>>, List<IMemoryOwner<byte>>) PrepareRtpPackets(List<byte[]> samples, uint rtpTimestamp)
75+
public (List<Memory<byte>>, List<IMemoryOwner<byte>>) CreateRtpPackets(List<byte[]> samples, uint rtpTimestamp)
7676
{
7777
List<Memory<byte>> rtpPackets = new List<Memory<byte>>();
7878
List<IMemoryOwner<byte>> memoryOwners = new List<IMemoryOwner<byte>>();

0 commit comments

Comments
 (0)