Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[core] Fixed miscalculations on extreme loss conditions in FEC #1716

Merged
merged 5 commits into from Dec 18, 2020

Conversation

ethouris
Copy link
Collaborator

Involved PRs (need to be retested):

General description:

The procedures concerning extreme conditions, like lots of lost packets in a row, resulting in a necessity of removal of some existing parts. There were two general false presumptions:

  • At least 2 series of matrices were supposed to exist. In result the removal of one series were presuming that there exist always the next series. The problem is that the groups for incoming packets are created dynamically, as packets come in, while with a lots of packets lost in a row this could result in having lots of packet sequence range not covered by existing FEC groups. For example: the distance between the group base and the incoming packet is 10x the matrix size, however the previously received packet was from series 2. Effectively series from 3 to 10 don't exist, while the removal attempt was for all series but last 2. The false presumption was that these series exist, and that you can read any data from them, at least for example to get the value of the new base sequence - reading was also happening from outside the container.
  • Another problem was that the emergency removal was focused only on one type of groups (horizontal or vertical). This was completely wrong - any removal, emergency or not, must be strictly done by one unified function, which simply dismisses whole series of groups and makes sure that all three containers - receiver column queue, receiver row queue and receiver cells - are perfectly in synch, that is, rcv.colq[0].base == rcv.rowq[0].base == rcv.cell_base. Therefore there's one unified function that is called in case of emergency, no matter if triggered from the row or column check, will simply delete all series but last two and will calculate correctly the new base sequence for all containers.

@ethouris ethouris added [core] Area: Changes in SRT library core Priority: High Type: Bug Indicates an unexpected problem or unintended behavior labels Dec 17, 2020
@ethouris ethouris added this to the v1.4.3 milestone Dec 17, 2020
@maxsharabayko maxsharabayko merged commit 21ad8d1 into Haivision:master Dec 18, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[core] Area: Changes in SRT library core Priority: High Type: Bug Indicates an unexpected problem or unintended behavior
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants