diff --git a/scheme.tlb b/scheme.tlb new file mode 100644 index 0000000..03a5f55 --- /dev/null +++ b/scheme.tlb @@ -0,0 +1,49 @@ +// Extras + +extras$_ {t:Type} (## 8) [ length:(## 8) extra:t ] = Extras t; + +extraStreamFlags#01 streamId:(## 8) flags:# enabled:flags.0?true dtx:flags.1?true extraEC:flags.2?true paused:flags.3?true = ExtraSignaling; +extraStreamCsd#02 streamId:(## 8) width:(## 16) height:(## 16) count:(## 8) [ length:(## 8) codecSpecificData:bytes ]= ExtraSignaling; + +extraLanEndpoint#03 address:# port:(## 16) = ExtraSignaling; +extraIpv6Endpoint#07 address:(## 128) port:(## 16) = ExtraSignaling; + +extraNetworkChanged#04 flags:# dataSavingEnabled:flags.0?true = ExtraSignaling; + +extraGroupCallKey#05 key:(## 256) = ExtraSignaling; +extraGroupCallUpgrade#06 = ExtraSignaling; + +// Stream info +streamInfo$_ streamId:(## 8) type:(## 8) codec:# frameDurationIgnored:(## 16) enabled:(## 8)= StreamInfo; + +// Packet +packet$_ type:(## 8) ackSeq:# seq:# ackMask:# flags:(## 8) extras:flags.0?Extras data:payload = Packet; + +payloadInit#0 peerVersion:# minVersion:# flags:# streams:Extras dataSavingEnabled:flags.0?true groupCallSupported:flags.1?true videoSendSupported:flags.2?true videoRecvSupported:flags.3?true = Payload; +payloadInitAck#1 peerVersion:# minVersion:# streams:Extras = Payload; + +payloadStreamData#4 + streamId:(## 6) + flags:(## 2) + + length:(## flags.0 ? 11 : 8) + eFlags:(## flags.0 ? 5 : 0) + + fragmented:eFlags.4?true + keyframe:eFlags.5?true + + pts:# + data:bytes + + extraFEC:eFlags.3?Extras + + = Payload; + +payloadPing#6 = Payload; +payloadPong#7 seq:# = Payload; + +payloadNop#E = Payload; + +// Deprecated +payloadStreamDataX2#8 a:payloadStreamData b:payloadStreamData = Payload; +payloadStreamDataX3#9 a:payloadStreamData b:payloadStreamData c:payloadStreamData = Payload; \ No newline at end of file diff --git a/schemeNew.tlb b/schemeNew.tlb new file mode 100644 index 0000000..6a97e06 --- /dev/null +++ b/schemeNew.tlb @@ -0,0 +1,60 @@ +// Simplified scheme, for the new protocol +// Try unifying all flags, lengths and so on + +packet$_ + seq:# ackSeq:# ackMask:# + + streamId:(## 2) // Max 2 streams, we don't need much anyway (0 and 3 are reserved values) + // If 0, is a pure-service message + // If 1, is an audio packet + // If 2, is a video packet + // If 3, is packet from one of the group call streams + flags:(## 6) + + streamIdExtended:(streamId == 3 ? (## 8) : false) // Extended stream ID for group calls + + length:(## flags.0 ? 11 : (streamId > 0 ? 8 : 0)) + eFlags:(## flags.0 ? 5 : 0) // We shouldn't typically need this, but since we have the space why not use it + + fragmented:eFlags.0?true // Logically, this flag can only appear on *big* fragmented messages + keyframe:eFlags.1?true // This flag can only appear for video streams (typically *big* messages, see ^) + + data:bytes + + extraFEC:flags.1?ExtraFEC + extraSignaling:flags.2?Extras + + = Packet; + +// ExtraFEC +extraFEC$_ mask:(## 8) [ length:(## 8) _:bytes ] = ExtraFEC; + +// Extras +extras$_ {t:Type} (## 8) [ length:(## 8) extra:t ] = Extras t; + +extraStreamFlags#01 streamId:(## 8) flags:# enabled:flags.0?true dtx:flags.1?true extraEC:flags.2?true paused:flags.3?true = ExtraSignaling; +extraStreamCsd#02 streamId:(## 8) width:(## 16) height:(## 16) count:(## 8) [ length:(## 8) codecSpecificData:bytes ]= ExtraSignaling; + +extraLanEndpoint#03 address:# port:(## 16) = ExtraSignaling; +extraIpv6Endpoint#07 address:(## 128) port:(## 16) = ExtraSignaling; + +extraNetworkChanged#04 flags:# dataSavingEnabled:flags.0?true = ExtraSignaling; + +extraGroupCallKey#05 key:(## 256) = ExtraSignaling; +extraGroupCallUpgrade#06 = ExtraSignaling; + + + +// All signaling starting from here can only be done on packets with streamID 0 (only signaling, no data). +// New init/initACK +extraInit#08 peerVersion:# minVersion:# flags:(## 8) streams:Extras dataSavingEnabled:flags.0?true groupCallSupported:flags.1?true videoSendSupported:flags.2?true videoRecvSupported:flags.3?true = ExtraSignaling; +extraInitAck#09 peerVersion:# minVersion:# streams:Extras = ExtraSignaling; + +// Misc signaling +extraPing#A = ExtraSignaling; +extraPong#B seq:# = ExtraSignaling; + +extraNop#C = ExtraSignaling; + +// Stream info +streamInfo$_ streamId:(## 8) type:(## 8) codec:# frameDurationIgnored:(## 16) enabled:(## 8)= StreamInfo; \ No newline at end of file