Skip to content

Conversation

npcook
Copy link
Contributor

@npcook npcook commented Apr 17, 2025

The AV1 packetizer did not properly packetize all AV1 bitstreams. It incorrectly calculated the "w" field from the AV1 RTP spec once and applied it to all RTP packets. This field needs to be determined on a per-packet basis. In practice, this meant the packetizer generated invalid RTP packets if w = 0 for the first packet (i.e. 4 or more OBUs).

Rewrite the packetizer to accurately determine how many OBU fragments are present in each RTP packet. The general idea is:

  1. Start with the first OBU in the user buffer
  2. Fill the RTP packet with data from the current OBU
  3. If there is space left over in the packet, move to the next OBU and repeat Added sdp_media_disabled API function #2
  4. Once the RTP packet is full, report it to the handler and clear it and repeat Added sdp_media_disabled API function #2

Update the tests to get wider coverage of this new algorithm. Add another stream with more OBUs and test each stream with varying packet sizes. Also, fix the frame re-assembly code in the test to conform to the spec.

Name this new algorithm av1_packetize_new and keep the old av1_packetize_high around for now. Library users can switch to the new implementation for testing until it replaces av1_packetize_high.

AV1 RTP spec: https://aomediacodec.github.io/av1-rtp-spec/

@npcook
Copy link
Contributor Author

npcook commented Apr 17, 2025

Updated to fix the OOM sanitizer

The AV1 packetizer did not properly packetize all AV1 bitstreams. It
incorrectly calculated the "w" field from the AV1 RTP spec once and
applied it to all RTP packets. This field needs to be determined on a
per-packet basis. In practice, this meant the packetizer generated
invalid RTP packets if w = 0 for the first packet (i.e. 4 or more OBUs).

Rewrite the packetizer to accurately determine how many OBU fragments
are present in each RTP packet. The general idea is:
1. Start with the first OBU in the user buffer
2. Fill the RTP packet with data from the current OBU
3. If there is space left over in the packet, move to the next OBU and
   repeat baresip#2
4. Once the RTP packet is full, report it to the handler and clear it
   and repeat baresip#2

Update the tests to get wider coverage of this new algorithm. Add
another stream with more OBUs and test each stream with varying packet
sizes. Also, fix the frame re-assembly code in the test to conform to
the spec.

Name this new algorithm av1_packetize_new and keep the old
av1_packetize_high around for now. Library users can switch to the new
implementation for testing until it replaces av1_packetize_high.

AV1 RTP spec: https://aomediacodec.github.io/av1-rtp-spec/
@alfredh alfredh merged commit 662989f into baresip:main Apr 19, 2025
38 checks passed
@alfredh
Copy link
Contributor

alfredh commented Apr 19, 2025

Thank Nick!

jmontorosf pushed a commit to sipfront/re that referenced this pull request Jun 12, 2025
The AV1 packetizer did not properly packetize all AV1 bitstreams. It
incorrectly calculated the "w" field from the AV1 RTP spec once and
applied it to all RTP packets. This field needs to be determined on a
per-packet basis. In practice, this meant the packetizer generated
invalid RTP packets if w = 0 for the first packet (i.e. 4 or more OBUs).

Rewrite the packetizer to accurately determine how many OBU fragments
are present in each RTP packet. The general idea is:
1. Start with the first OBU in the user buffer
2. Fill the RTP packet with data from the current OBU
3. If there is space left over in the packet, move to the next OBU and
   repeat baresip#2
4. Once the RTP packet is full, report it to the handler and clear it
   and repeat baresip#2

Update the tests to get wider coverage of this new algorithm. Add
another stream with more OBUs and test each stream with varying packet
sizes. Also, fix the frame re-assembly code in the test to conform to
the spec.

Name this new algorithm av1_packetize_new and keep the old
av1_packetize_high around for now. Library users can switch to the new
implementation for testing until it replaces av1_packetize_high.

AV1 RTP spec: https://aomediacodec.github.io/av1-rtp-spec/

Co-authored-by: Nicholas Cook <nicholasc@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants