This change changes the flexfec header reader ReadFecHeader function to parse the FEC header according the the updated RFC. The fec_packet argument is expected to have the protected ssrcs list already populated, as they should be retrieved from the RTP header. Updated and added Reader unittests. Unittests that are relevant for the Writer, were put inside a comment. In the next change set, when the header writer will be updated, we will update the unittests accordingly. Bug: webrtc:15002 Change-Id: I118303e31c15c356ffeb2c0aafe503cf293bcad6 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/303260 Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> Commit-Queue: Rasmus Brandt <brandtr@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40172}
71 lines
2.7 KiB
C++
71 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2023 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER2_H_
|
|
#define MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER2_H_
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#include "modules/rtp_rtcp/source/forward_error_correction.h"
|
|
|
|
namespace webrtc {
|
|
|
|
// FlexFEC header in flexible mode (R=0, F=0), minimum 12 bytes.
|
|
// https://datatracker.ietf.org/doc/html/rfc8627#section-4.2.2.1
|
|
//
|
|
// 0 1 2 3
|
|
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
// 0 |0|0|P|X| CC |M| PT recovery | length recovery |
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
// 4 | TS recovery |
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
// 8 | SN base_i |k| Mask [0-14] |
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
// 12 |k| Mask [15-45] (optional) |
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
// 16 | Mask [46-109] (optional) |
|
|
// 20 | |
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
// | ... next SN base and Mask for CSRC_i in CSRC list ... |
|
|
//
|
|
|
|
class FlexfecHeaderReader2 : public FecHeaderReader {
|
|
public:
|
|
FlexfecHeaderReader2();
|
|
~FlexfecHeaderReader2() override;
|
|
|
|
bool ReadFecHeader(
|
|
ForwardErrorCorrection::ReceivedFecPacket* fec_packet) const override;
|
|
};
|
|
|
|
class FlexfecHeaderWriter2 : public FecHeaderWriter {
|
|
public:
|
|
FlexfecHeaderWriter2();
|
|
~FlexfecHeaderWriter2() override;
|
|
|
|
size_t MinPacketMaskSize(const uint8_t* packet_mask,
|
|
size_t packet_mask_size) const override;
|
|
|
|
size_t FecHeaderSize(size_t packet_mask_row_size) const override;
|
|
|
|
void FinalizeFecHeader(
|
|
uint32_t media_ssrc,
|
|
uint16_t seq_num_base,
|
|
const uint8_t* packet_mask,
|
|
size_t packet_mask_size,
|
|
ForwardErrorCorrection::Packet* fec_packet) const override;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER2_H_
|