Line data Source code
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 WEBRTC_MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_
12 : #define WEBRTC_MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_
13 :
14 : #include "webrtc/base/basictypes.h"
15 : #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
16 :
17 : namespace webrtc {
18 :
19 : // FlexFEC header, minimum 20 bytes.
20 : // 0 1 2 3
21 : // 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
22 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
23 : // 0 |R|F|P|X| CC |M| PT recovery | length recovery |
24 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
25 : // 4 | TS recovery |
26 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
27 : // 8 | SSRCCount | reserved |
28 : // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
29 : // 12 | SSRC_i |
30 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31 : // 16 | SN base_i |k| Mask [0-14] |
32 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33 : // 20 |k| Mask [15-45] (optional) |
34 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
35 : // 24 |k| |
36 : // +-+ Mask [46-108] (optional) |
37 : // 28 | |
38 : // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
39 : // : ... next in SSRC_i ... :
40 : //
41 : //
42 : // FlexFEC header in 'inflexible' mode (F = 1), 20 bytes.
43 : // 0 1 2 3
44 : // 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
45 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46 : // 0 |0|1|P|X| CC |M| PT recovery | length recovery |
47 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48 : // 4 | TS recovery |
49 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 : // 8 | SSRCCount | reserved |
51 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 : // 12 | SSRC_i |
53 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54 : // 16 | SN base_i | M (columns) | N (rows) |
55 : // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 :
57 0 : class FlexfecHeaderReader : public FecHeaderReader {
58 : public:
59 : FlexfecHeaderReader();
60 : ~FlexfecHeaderReader() override;
61 :
62 : bool ReadFecHeader(
63 : ForwardErrorCorrection::ReceivedFecPacket* fec_packet) const override;
64 : };
65 :
66 0 : class FlexfecHeaderWriter : public FecHeaderWriter {
67 : public:
68 : FlexfecHeaderWriter();
69 : ~FlexfecHeaderWriter() override;
70 :
71 : size_t MinPacketMaskSize(const uint8_t* packet_mask,
72 : size_t packet_mask_size) const override;
73 :
74 : size_t FecHeaderSize(size_t packet_mask_row_size) const override;
75 :
76 : void FinalizeFecHeader(
77 : uint32_t media_ssrc,
78 : uint16_t seq_num_base,
79 : const uint8_t* packet_mask,
80 : size_t packet_mask_size,
81 : ForwardErrorCorrection::Packet* fec_packet) const override;
82 : };
83 :
84 : } // namespace webrtc
85 :
86 : #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_
|