Improve packet loss on old TUTK proto

This commit is contained in:
Alex X
2026-01-20 14:19:18 +03:00
parent 7793a55853
commit 75bd1f1b2b
2 changed files with 16 additions and 13 deletions
+13 -10
View File
@@ -50,7 +50,8 @@ type Session16 struct {
seqSendCmd1 uint16 seqSendCmd1 uint16
seqSendAud uint16 seqSendAud uint16
waitSeq uint16 waitFSeq uint16
waitCSeq uint16
waitSize int waitSize int
waitData []byte waitData []byte
} }
@@ -183,7 +184,7 @@ func (s *Session16) SessionRead(chID byte, cmd []byte) int {
} }
// 0 01030800 command + version // 0 01030800 command + version
// 4 00000000 frame num // 4 00000000 frame seq
// 8 ac880100 total size // 8 ac880100 total size
// 12 6200 chunk seq // 12 6200 chunk seq
// 14 2000 tail (pkt header) size // 14 2000 tail (pkt header) size
@@ -197,25 +198,27 @@ func (s *Session16) SessionRead(chID byte, cmd []byte) int {
switch cmd[1] { switch cmd[1] {
case 0x03: case 0x03:
seq := binary.LittleEndian.Uint16(cmd[12:]) frameSeq := binary.LittleEndian.Uint16(cmd[4:])
if seq != s.waitSeq { chunkSeq := binary.LittleEndian.Uint16(cmd[12:])
s.waitSeq = 0 if chunkSeq == 0 {
return msgMediaLost s.waitFSeq = frameSeq
} s.waitCSeq = 0
if seq == 0 {
s.waitData = s.waitData[:0] s.waitData = s.waitData[:0]
payloadSize := binary.LittleEndian.Uint32(cmd[8:]) payloadSize := binary.LittleEndian.Uint32(cmd[8:])
hdrSize := binary.LittleEndian.Uint16(cmd[14:]) hdrSize := binary.LittleEndian.Uint16(cmd[14:])
s.waitSize = int(hdrSize) + int(payloadSize) s.waitSize = int(hdrSize) + int(payloadSize)
} else if frameSeq != s.waitFSeq || chunkSeq != s.waitCSeq {
s.waitCSeq = 0
return msgMediaLost
} }
s.waitData = append(s.waitData, cmd[24:]...) s.waitData = append(s.waitData, cmd[24:]...)
if n := len(s.waitData); n < s.waitSize { if n := len(s.waitData); n < s.waitSize {
s.waitSeq++ s.waitCSeq++
return msgMediaChunk return msgMediaChunk
} }
s.waitSeq = 0 s.waitCSeq = 0
payloadSize := binary.LittleEndian.Uint32(cmd[8:]) payloadSize := binary.LittleEndian.Uint32(cmd[8:])
packetData[0] = bytes.Clone(s.waitData[payloadSize:]) packetData[0] = bytes.Clone(s.waitData[payloadSize:])
+3 -3
View File
@@ -171,15 +171,15 @@ func (s *Session25) handleChunk(cmd []byte, checkSeq bool) int {
// "0x20 chunk seq for first chunk if only one chunk". // "0x20 chunk seq for first chunk if only one chunk".
if binary.LittleEndian.Uint16(cmd2[6:]) == 0 || binary.LittleEndian.Uint16(cmd2[4:]) == 1 { if binary.LittleEndian.Uint16(cmd2[6:]) == 0 || binary.LittleEndian.Uint16(cmd2[4:]) == 1 {
s.waitData = s.waitData[:0] s.waitData = s.waitData[:0]
s.waitSeq = seq s.waitCSeq = seq
} else if seq != s.waitSeq { } else if seq != s.waitCSeq {
return msgMediaLost return msgMediaLost
} }
s.waitData = append(s.waitData, cmd2[20:]...) s.waitData = append(s.waitData, cmd2[20:]...)
if flags&0b0001 == 0 { if flags&0b0001 == 0 {
s.waitSeq++ s.waitCSeq++
return msgMediaChunk return msgMediaChunk
} }