Skip to content

Commit 4bab390

Browse files
committed
fix(client-common): handle video/audio stream seq more intelligently
1 parent 632bcb1 commit 4bab390

File tree

1 file changed

+32
-32
lines changed

1 file changed

+32
-32
lines changed

mm-client-common/src/attachment.rs

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,13 @@ impl Attachment {
116116
attached_msg: attached,
117117

118118
video_packet_ring: PacketRing::new(),
119-
video_stream_seq: 0,
120-
prev_video_stream_seq: 0,
119+
video_stream_seq: None,
120+
prev_video_stream_seq: None,
121121
video_stream_seq_offset,
122122

123123
audio_packet_ring: PacketRing::new(),
124-
audio_stream_seq: 0,
125-
prev_audio_stream_seq: 0,
124+
audio_stream_seq: None,
125+
prev_audio_stream_seq: None,
126126
audio_stream_seq_offset: 0,
127127

128128
notify_detached: Some(detached_tx),
@@ -342,13 +342,13 @@ pub(crate) struct AttachmentState {
342342
reattach_required: bool,
343343

344344
video_packet_ring: PacketRing,
345-
video_stream_seq: u64,
346-
prev_video_stream_seq: u64,
345+
video_stream_seq: Option<u64>,
346+
prev_video_stream_seq: Option<u64>,
347347
video_stream_seq_offset: u64,
348348

349349
audio_packet_ring: PacketRing,
350-
audio_stream_seq: u64,
351-
prev_audio_stream_seq: u64,
350+
audio_stream_seq: Option<u64>,
351+
prev_audio_stream_seq: Option<u64>,
352352
audio_stream_seq_offset: u64,
353353

354354
// A future representing the end of the attachment.
@@ -367,15 +367,15 @@ impl AttachmentState {
367367
protocol::MessageType::VideoChunk(chunk) => {
368368
// We always send packets for two streams - the current one and
369369
// (if there is one) the previous one.
370-
if chunk.stream_seq > self.video_stream_seq {
370+
if self.video_stream_seq.is_none_or(|s| s < chunk.stream_seq) {
371371
// A new stream started.
372372
self.prev_video_stream_seq = self.video_stream_seq;
373-
self.video_stream_seq = chunk.stream_seq;
373+
self.video_stream_seq = Some(chunk.stream_seq);
374374

375375
let res = self.attached_msg.streaming_resolution.unwrap_or_default();
376376

377377
self.delegate.video_stream_start(
378-
self.video_stream_seq + self.video_stream_seq_offset,
378+
chunk.stream_seq + self.video_stream_seq_offset,
379379
VideoStreamParams {
380380
width: res.width,
381381
height: res.height,
@@ -385,26 +385,26 @@ impl AttachmentState {
385385
);
386386

387387
// Discard any older packets.
388-
self.video_packet_ring
389-
.discard(self.prev_video_stream_seq.saturating_sub(1));
388+
if let Some(prev) = self.prev_video_stream_seq {
389+
self.video_packet_ring.discard(prev.saturating_sub(1));
390+
}
390391
}
391392

392393
if let Err(err) = self.video_packet_ring.recv_chunk(chunk) {
393394
error!("error in packet ring: {:#}", err);
394395
}
395396

396-
for mut packet in self
397-
.video_packet_ring
398-
.drain_completed(self.prev_video_stream_seq)
399-
{
400-
packet.stream_seq += self.video_stream_seq_offset;
401-
self.delegate.video_packet(Arc::new(packet));
397+
if let Some(prev) = self.prev_video_stream_seq {
398+
for mut packet in self.video_packet_ring.drain_completed(prev) {
399+
packet.stream_seq += self.video_stream_seq_offset;
400+
self.delegate.video_packet(Arc::new(packet));
401+
}
402402
}
403403

404404
if self.video_stream_seq != self.prev_video_stream_seq {
405405
for mut packet in self
406406
.video_packet_ring
407-
.drain_completed(self.video_stream_seq)
407+
.drain_completed(self.video_stream_seq.unwrap())
408408
{
409409
packet.stream_seq += self.video_stream_seq_offset;
410410
self.delegate.video_packet(Arc::new(packet));
@@ -414,10 +414,10 @@ impl AttachmentState {
414414
protocol::MessageType::AudioChunk(chunk) => {
415415
// We always send packets for two streams - the current one and
416416
// (if there is one) the previous one.
417-
if chunk.stream_seq > self.audio_stream_seq {
417+
if self.audio_stream_seq.is_none_or(|s| s < chunk.stream_seq) {
418418
// A new stream started.
419419
self.prev_audio_stream_seq = self.audio_stream_seq;
420-
self.audio_stream_seq = chunk.stream_seq;
420+
self.audio_stream_seq = Some(chunk.stream_seq);
421421

422422
let channels = self
423423
.attached_msg
@@ -427,7 +427,7 @@ impl AttachmentState {
427427
.unwrap_or_default();
428428

429429
self.delegate.audio_stream_start(
430-
self.audio_stream_seq + self.audio_stream_seq_offset,
430+
chunk.stream_seq + self.audio_stream_seq_offset,
431431
AudioStreamParams {
432432
codec: self.attached_msg.audio_codec(),
433433
sample_rate: self.attached_msg.sample_rate_hz,
@@ -436,26 +436,26 @@ impl AttachmentState {
436436
);
437437

438438
// Discard any older packets.
439-
self.audio_packet_ring
440-
.discard(self.prev_audio_stream_seq.saturating_sub(1));
439+
if let Some(prev) = self.prev_audio_stream_seq {
440+
self.audio_packet_ring.discard(prev.saturating_sub(1));
441+
}
441442
}
442443

443444
if let Err(err) = self.audio_packet_ring.recv_chunk(chunk) {
444445
error!("error in packet ring: {:#}", err);
445446
}
446447

447-
for mut packet in self
448-
.audio_packet_ring
449-
.drain_completed(self.prev_audio_stream_seq)
450-
{
451-
packet.stream_seq += self.audio_stream_seq_offset;
452-
self.delegate.audio_packet(Arc::new(packet));
448+
if let Some(prev) = self.prev_audio_stream_seq {
449+
for mut packet in self.audio_packet_ring.drain_completed(prev) {
450+
packet.stream_seq += self.audio_stream_seq_offset;
451+
self.delegate.audio_packet(Arc::new(packet));
452+
}
453453
}
454454

455455
if self.audio_stream_seq != self.prev_audio_stream_seq {
456456
for mut packet in self
457457
.audio_packet_ring
458-
.drain_completed(self.audio_stream_seq)
458+
.drain_completed(self.audio_stream_seq.unwrap())
459459
{
460460
packet.stream_seq += self.audio_stream_seq_offset;
461461
self.delegate.audio_packet(Arc::new(packet));

0 commit comments

Comments
 (0)