1 /* 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_ 12 #define MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_ 13 14 #include <stddef.h> 15 #include <stdint.h> 16 17 #include "modules/rtp_rtcp/source/forward_error_correction.h" 18 19 namespace webrtc { 20 21 // FlexFEC header, minimum 20 bytes. 22 // 0 1 2 3 23 // 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 24 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 25 // 0 |R|F|P|X| CC |M| PT recovery | length recovery | 26 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 27 // 4 | TS recovery | 28 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 29 // 8 | SSRCCount | reserved | 30 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 31 // 12 | SSRC_i | 32 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 33 // 16 | SN base_i |k| Mask [0-14] | 34 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 35 // 20 |k| Mask [15-45] (optional) | 36 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 37 // 24 |k| | 38 // +-+ Mask [46-108] (optional) | 39 // 28 | | 40 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 41 // : ... next in SSRC_i ... : 42 // 43 // 44 // FlexFEC header in 'inflexible' mode (F = 1), 20 bytes. 45 // 0 1 2 3 46 // 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 47 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 48 // 0 |0|1|P|X| CC |M| PT recovery | length recovery | 49 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 50 // 4 | TS recovery | 51 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 52 // 8 | SSRCCount | reserved | 53 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 54 // 12 | SSRC_i | 55 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 56 // 16 | SN base_i | M (columns) | N (rows) | 57 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 58 59 class FlexfecHeaderReader : public FecHeaderReader { 60 public: 61 FlexfecHeaderReader(); 62 ~FlexfecHeaderReader() override; 63 64 bool ReadFecHeader( 65 ForwardErrorCorrection::ReceivedFecPacket* fec_packet) const override; 66 }; 67 68 class FlexfecHeaderWriter : public FecHeaderWriter { 69 public: 70 FlexfecHeaderWriter(); 71 ~FlexfecHeaderWriter() override; 72 73 size_t MinPacketMaskSize(const uint8_t* packet_mask, 74 size_t packet_mask_size) const override; 75 76 size_t FecHeaderSize(size_t packet_mask_row_size) const override; 77 78 void FinalizeFecHeader( 79 uint32_t media_ssrc, 80 uint16_t seq_num_base, 81 const uint8_t* packet_mask, 82 size_t packet_mask_size, 83 ForwardErrorCorrection::Packet* fec_packet) const override; 84 }; 85 86 } // namespace webrtc 87 88 #endif // MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_ 89