Skip to content

Commit 83952e9

Browse files
committed
optimize get extension and remove optional on rtpframe
1 parent a95d175 commit 83952e9

File tree

12 files changed

+54
-85
lines changed

12 files changed

+54
-85
lines changed

RootEncoder/Sources/RootEncoder/common/Extensions.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@
88
import Foundation
99
import CryptoKit
1010

11+
12+
public extension Array {
13+
mutating func get(destiny: inout Array, index: Int, length: Int) {
14+
destiny[index...index + length - 1] = self[0...length - 1]
15+
self.removeFirst(length)
16+
}
17+
}
18+
1119
public extension Date {
1220
var millisecondsSince1970: Int64 {
1321
Int64((timeIntervalSince1970 * 1000.0).rounded())

RootEncoder/Sources/RootEncoder/rtsp/rtcp/BaseSenderReport.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,15 @@ public class BaseSenderReport {
6565

6666
private func updateAudio(rtpFrame: RtpFrame) throws -> Bool {
6767
audioPacketCount += 1
68-
audioOctetCount += UInt64(rtpFrame.length!)
68+
audioOctetCount += UInt64(rtpFrame.length)
6969

7070
setLong(buffer: &audioBuffer, n: audioPacketCount, begin: 20, end: 24)
7171
setLong(buffer: &audioBuffer, n: audioOctetCount, begin: 24, end: 28);
7272
let millis = UInt64(Date().millisecondsSince1970)
7373
if (millis - audioTime >= interval) {
7474
audioTime = UInt64(Date().millisecondsSince1970)
7575
let nano = UInt64(Date().millisecondsSince1970) * 1000000
76-
setData(buffer: &audioBuffer, ntpts: nano, rtpts: rtpFrame.timeStamp!)
76+
setData(buffer: &audioBuffer, ntpts: nano, rtpts: rtpFrame.timeStamp)
7777
try sendReport(buffer: audioBuffer, rtpFrame: rtpFrame)
7878
return true
7979
}
@@ -82,15 +82,15 @@ public class BaseSenderReport {
8282

8383
private func updateVideo(rtpFrame: RtpFrame) throws -> Bool {
8484
videoPacketCount += 1
85-
videoOctetCount += UInt64(rtpFrame.length!)
85+
videoOctetCount += UInt64(rtpFrame.length)
8686

8787
setLong(buffer: &videoBuffer, n: videoPacketCount, begin: 20, end: 24)
8888
setLong(buffer: &videoBuffer, n: videoOctetCount, begin: 24, end: 28);
8989
let millis = UInt64(Date().millisecondsSince1970)
9090
if (millis - videoTime >= interval) {
9191
videoTime = UInt64(Date().millisecondsSince1970)
9292
let nano = UInt64(Date().millisecondsSince1970) * 1000000
93-
setData(buffer: &videoBuffer, ntpts: nano, rtpts: rtpFrame.timeStamp!)
93+
setData(buffer: &videoBuffer, ntpts: nano, rtpts: rtpFrame.timeStamp)
9494
try sendReport(buffer: videoBuffer, rtpFrame: rtpFrame)
9595
return true
9696
}

RootEncoder/Sources/RootEncoder/rtsp/rtcp/SenderReportTcp.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class SenderReportTcp: BaseSenderReport {
2020

2121
public override func sendReport(buffer: Array<UInt8>, rtpFrame: RtpFrame) throws {
2222
var report = buffer
23-
header[1] = UInt8(2 * rtpFrame.channelIdentifier! + 1)
23+
header[1] = UInt8(2 * rtpFrame.channelIdentifier + 1)
2424
report.insert(contentsOf: header, at: 0)
2525
try socket.write(buffer: report, size: Int(RtpConstants.REPORT_PACKET_LENGTH) + header.count)
2626
}

RootEncoder/Sources/RootEncoder/rtsp/rtp/packets/RtspAacPacket.swift

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,20 @@ public class RtspAacPacket: RtspBasePacket {
99
}
1010

1111
public override func createAndSendPacket(buffer: Array<UInt8>, ts: UInt64, callback: ([RtpFrame]) -> Void) {
12-
var frames = [RtpFrame]()
13-
var buffer = buffer
14-
let naluLength = buffer.count
12+
var fixedBuffer = buffer
13+
let naluLength = fixedBuffer.count
1514
let dts = ts * 1000
1615
let maxPayload = maxPacketSize - RtpConstants.rtpHeaderLength
17-
1816
var sum = 0
17+
var frames = [RtpFrame]()
1918
while (sum < naluLength) {
2019
let length = if (naluLength - sum < maxPayload) {
2120
naluLength - sum
2221
} else {
2322
maxPayload
2423
}
2524
var rtpBuffer = getBuffer(size: length + RtpConstants.rtpHeaderLength + 4)
26-
buffer = buffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 4, length: length)
25+
fixedBuffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 4, length: length)
2726
markPacket(buffer: &rtpBuffer)
2827
let rtpTs = updateTimeStamp(buffer: &rtpBuffer, timeStamp: dts)
2928

@@ -40,11 +39,7 @@ public class RtspAacPacket: RtspBasePacket {
4039
rtpBuffer[RtpConstants.rtpHeaderLength + 3] |= 0x00
4140

4241
updateSeq(buffer: &rtpBuffer)
43-
var frame = RtpFrame()
44-
frame.timeStamp = rtpTs
45-
frame.length = rtpBuffer.count
46-
frame.buffer = rtpBuffer
47-
frame.channelIdentifier = channelIdentifier
42+
let frame = RtpFrame(buffer: rtpBuffer, length: rtpBuffer.count, timeStamp: rtpTs, channelIdentifier: channelIdentifier!)
4843

4944
sum += length
5045
frames.append(frame)

RootEncoder/Sources/RootEncoder/rtsp/rtp/packets/RtspG711Packet.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,25 @@ public class RtspG711Packet: RtspBasePacket {
1818
}
1919

2020
public override func createAndSendPacket(buffer: Array<UInt8>, ts: UInt64, callback: ([RtpFrame]) -> Void) {
21-
var frames = [RtpFrame]()
22-
var buffer = buffer
23-
let naluLength = buffer.count
21+
var fixedBuffer = buffer
22+
let naluLength = fixedBuffer.count
2423
let maxPayload = maxPacketSize - RtpConstants.rtpHeaderLength
25-
2624
var sum = 0
25+
var frames = [RtpFrame]()
2726
while (sum < naluLength) {
2827
let length = if (naluLength - sum < maxPayload) {
2928
naluLength - sum
3029
} else {
3130
maxPayload
3231
}
3332
var rtpBuffer = getBuffer(size: length + RtpConstants.rtpHeaderLength)
34-
buffer = buffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength, length: length)
33+
fixedBuffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength, length: length)
3534
let dts = ts * 1000
3635
markPacket(buffer: &rtpBuffer)
3736
let rtpTs = updateTimeStamp(buffer: &rtpBuffer, timeStamp: dts)
3837
updateSeq(buffer: &rtpBuffer)
3938

40-
var frame = RtpFrame()
41-
frame.timeStamp = rtpTs
42-
frame.length = rtpBuffer.count
43-
frame.buffer = rtpBuffer
44-
frame.channelIdentifier = channelIdentifier
45-
39+
let frame = RtpFrame(buffer: rtpBuffer, length: rtpBuffer.count, timeStamp: rtpTs, channelIdentifier: channelIdentifier!)
4640
sum += length
4741
frames.append(frame)
4842
}

RootEncoder/Sources/RootEncoder/rtsp/rtp/packets/RtspH264Packet.swift

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,23 @@ public class RtspH264Packet: RtspBasePacket {
1212
}
1313

1414
public override func createAndSendPacket(buffer: Array<UInt8>, ts: UInt64, callback: ([RtpFrame]) -> Void) {
15-
var frames = [RtpFrame]()
16-
var buffer = buffer
15+
var fixedBuffer = buffer
1716
let dts = ts * 1000
18-
var frame = RtpFrame()
19-
frame.channelIdentifier = channelIdentifier
2017

2118
var header = Array<UInt8>(repeating: 0, count: 5)
22-
buffer = buffer.get(destiny: &header, index: 0, length: 5)
19+
fixedBuffer.get(destiny: &header, index: 0, length: header.count)
2320

24-
let naluLength = Int(buffer.count)
21+
let naluLength = Int(fixedBuffer.count)
2522
let type: UInt8 = header[4] & 0x1F
26-
23+
var frames = [RtpFrame]()
2724
if type == RtpConstants.IDR {
2825
var rtpBuffer = getBuffer(size: stapA!.count + RtpConstants.rtpHeaderLength)
2926
let rtpTs = updateTimeStamp(buffer: &rtpBuffer, timeStamp: dts)
3027
markPacket(buffer: &rtpBuffer)
3128
rtpBuffer[RtpConstants.rtpHeaderLength...RtpConstants.rtpHeaderLength + stapA!.count - 1] = stapA![0...stapA!.count - 1]
3229
updateSeq(buffer: &rtpBuffer)
3330

34-
frame.timeStamp = rtpTs
35-
frame.length = rtpBuffer.count
36-
frame.buffer = rtpBuffer
31+
let frame = RtpFrame(buffer: rtpBuffer, length: rtpBuffer.count, timeStamp: rtpTs, channelIdentifier: channelIdentifier!)
3732
frames.append(frame)
3833
sendKeyFrame = true
3934
}
@@ -43,15 +38,13 @@ public class RtspH264Packet: RtspBasePacket {
4338
var rtpBuffer = getBuffer(size: naluLength + RtpConstants.rtpHeaderLength + 1)
4439
rtpBuffer[RtpConstants.rtpHeaderLength] = header[4]
4540

46-
buffer = buffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 1, length: naluLength)
41+
fixedBuffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 1, length: naluLength)
4742

4843
let rtpTs = updateTimeStamp(buffer: &rtpBuffer, timeStamp: dts)
4944
markPacket(buffer: &rtpBuffer)
5045
updateSeq(buffer: &rtpBuffer)
5146

52-
frame.timeStamp = rtpTs
53-
frame.length = rtpBuffer.count
54-
frame.buffer = rtpBuffer
47+
let frame = RtpFrame(buffer: rtpBuffer, length: rtpBuffer.count, timeStamp: rtpTs, channelIdentifier: channelIdentifier!)
5548
frames.append(frame)
5649
}
5750
// Large NAL unit => Split nal unit
@@ -68,15 +61,15 @@ public class RtspH264Packet: RtspBasePacket {
6861
let length = if (naluLength - sum > maxPacketSize - RtpConstants.rtpHeaderLength - 2) {
6962
maxPacketSize - RtpConstants.rtpHeaderLength - 2
7063
} else {
71-
buffer.count
64+
fixedBuffer.count
7265
}
7366
var rtpBuffer = getBuffer(size: length + RtpConstants.rtpHeaderLength + 2)
7467
rtpBuffer[RtpConstants.rtpHeaderLength] = header[0]
7568
rtpBuffer[RtpConstants.rtpHeaderLength + 1] = header[1]
7669

7770
let rtpTs = updateTimeStamp(buffer: &rtpBuffer, timeStamp: dts)
7871

79-
buffer = buffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 2, length: length)
72+
fixedBuffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 2, length: length)
8073

8174
sum += length
8275
if sum >= naluLength {
@@ -85,9 +78,7 @@ public class RtspH264Packet: RtspBasePacket {
8578
}
8679
updateSeq(buffer: &rtpBuffer)
8780

88-
frame.timeStamp = rtpTs
89-
frame.length = rtpBuffer.count
90-
frame.buffer = rtpBuffer
81+
let frame = RtpFrame(buffer: rtpBuffer, length: rtpBuffer.count, timeStamp: rtpTs, channelIdentifier: channelIdentifier!)
9182
frames.append(frame)
9283
// Switch start bit
9384
header[1] = header[1] & 0x7F

RootEncoder/Sources/RootEncoder/rtsp/rtp/packets/RtspH265Packet.swift

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,28 @@ public class RtspH265Packet: RtspBasePacket {
1313
}
1414

1515
public override func createAndSendPacket(buffer: Array<UInt8>, ts: UInt64, callback: ([RtpFrame]) -> Void) {
16-
var frames = [RtpFrame]()
17-
var buffer = buffer
16+
var fixedBuffer = buffer
1817
let dts = ts * 1000
19-
var frame = RtpFrame()
20-
frame.channelIdentifier = channelIdentifier
2118

2219
var header = Array<UInt8>(repeating: 0, count: 6)
23-
buffer = buffer.get(destiny: &header, index: 0, length: 6)
24-
//128, 224, 0, 3, 0, 169, 138, 199, 7, 91, 205, 21, 98, 1, 64
20+
fixedBuffer.get(destiny: &header, index: 0, length: header.count)
2521

26-
let naluLength = Int(buffer.count)
22+
let naluLength = Int(fixedBuffer.count)
2723
let type: UInt8 = header[4] >> (1 & 0x3F)
28-
24+
var frames = [RtpFrame]()
2925
// Small NAL unit => Single NAL unit
3026
if (naluLength <= maxPacketSize - RtpConstants.rtpHeaderLength - 2) {
3127
var rtpBuffer = getBuffer(size: naluLength + RtpConstants.rtpHeaderLength + 2)
3228
rtpBuffer[RtpConstants.rtpHeaderLength] = header[4]
3329
rtpBuffer[RtpConstants.rtpHeaderLength + 1] = header[5]
3430

35-
buffer = buffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 2, length: naluLength)
31+
fixedBuffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 2, length: naluLength)
3632

3733
let rtpTs = updateTimeStamp(buffer: &rtpBuffer, timeStamp: dts)
3834
markPacket(buffer: &rtpBuffer)
3935
updateSeq(buffer: &rtpBuffer)
4036

41-
frame.timeStamp = rtpTs
42-
frame.length = rtpBuffer.count
43-
frame.buffer = rtpBuffer
37+
let frame = RtpFrame(buffer: rtpBuffer, length: rtpBuffer.count, timeStamp: rtpTs, channelIdentifier: channelIdentifier!)
4438
frames.append(frame)
4539
}
4640
// Large NAL unit => Split nal unit
@@ -62,7 +56,7 @@ public class RtspH265Packet: RtspBasePacket {
6256
let length = if (naluLength - sum > maxPacketSize - RtpConstants.rtpHeaderLength - 3) {
6357
maxPacketSize - RtpConstants.rtpHeaderLength - 3
6458
} else {
65-
buffer.count
59+
fixedBuffer.count
6660
}
6761
var rtpBuffer = getBuffer(size: length + RtpConstants.rtpHeaderLength + 3)
6862
rtpBuffer[RtpConstants.rtpHeaderLength] = header[0]
@@ -71,7 +65,7 @@ public class RtspH265Packet: RtspBasePacket {
7165

7266
let rtpTs = updateTimeStamp(buffer: &rtpBuffer, timeStamp: dts)
7367

74-
buffer = buffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 3, length: length)
68+
fixedBuffer.get(destiny: &rtpBuffer, index: RtpConstants.rtpHeaderLength + 3, length: length)
7569

7670
sum += length
7771
if sum >= naluLength {
@@ -80,9 +74,7 @@ public class RtspH265Packet: RtspBasePacket {
8074
}
8175
updateSeq(buffer: &rtpBuffer)
8276

83-
frame.timeStamp = rtpTs
84-
frame.length = rtpBuffer.count
85-
frame.buffer = rtpBuffer
77+
let frame = RtpFrame(buffer: rtpBuffer, length: rtpBuffer.count, timeStamp: rtpTs, channelIdentifier: channelIdentifier!)
8678
frames.append(frame)
8779
// Switch start bit
8880
header[2] = header[2] & 0x7F

RootEncoder/Sources/RootEncoder/rtsp/rtp/sockets/RtpSocketTcp.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ public class RtpSocketTcp: BaseRtpSocket {
1919

2020
public override func sendFrame(rtpFrame: RtpFrame) throws {
2121
var buffer = rtpFrame.buffer
22-
header[1] = UInt8(2 * rtpFrame.channelIdentifier!)
23-
header[2] = UInt8(rtpFrame.length! >> 8)
24-
header[3] = UInt8(rtpFrame.length! & 0xFF)
25-
buffer?.insert(contentsOf: header, at: 0)
22+
header[1] = UInt8(2 * rtpFrame.channelIdentifier)
23+
header[2] = UInt8(rtpFrame.length >> 8)
24+
header[3] = UInt8(rtpFrame.length & 0xFF)
25+
buffer.insert(contentsOf: header, at: 0)
2626

27-
try socket.write(buffer: buffer!)
27+
try socket.write(buffer: buffer)
2828
}
2929

3030
public override func flush() {

RootEncoder/Sources/RootEncoder/rtsp/rtp/sockets/RtpSocketUdp.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ public class RtpSocketUdp: BaseRtpSocket, SocketCallback {
3737

3838
public override func sendFrame(rtpFrame: RtpFrame) throws {
3939
if (rtpFrame.isVideoFrame()) {
40-
try videoSocket.write(buffer: rtpFrame.buffer!)
40+
try videoSocket.write(buffer: rtpFrame.buffer)
4141
} else {
42-
try audioSocket.write(buffer: rtpFrame.buffer!)
42+
try audioSocket.write(buffer: rtpFrame.buffer)
4343
}
4444
}
4545

RootEncoder/Sources/RootEncoder/rtsp/rtsp/RtpFrame.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import Foundation
22

33
public struct RtpFrame {
4-
var buffer: Array<UInt8>?
5-
var length: Int?
6-
var timeStamp: UInt64?
7-
var channelIdentifier: Int?
4+
var buffer: Array<UInt8>
5+
var length: Int
6+
var timeStamp: UInt64
7+
var channelIdentifier: Int
88

99
public func isVideoFrame() -> Bool {
1010
channelIdentifier == RtpConstants.trackVideo

0 commit comments

Comments
 (0)