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