| /* |
| * Copyright (c) 2012 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 WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_BURSTY_H_ |
| #define WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_BURSTY_H_ |
| |
| // This file contains a set of packets masks for the FEC code. The masks in |
| // this table are specifically designed to favor recovery of bursty/consecutive |
| // loss network conditions. The tradeoff is worse recovery for random losses. |
| // These packet masks are currently defined to protect up to 12 media packets. |
| // They have the following property: for any packet mask defined by the |
| // parameters (k,m), where k = number of media packets, m = number of FEC |
| // packets, all "consecutive" losses of size <= m are completely recoverable. |
| // By consecutive losses we mean consecutive with respect to the sequence |
| // number ordering of the list (media and FEC) of packets. The difference |
| // between these masks (|kFecMaskBursty|) and |kFecMaskRandom| type, defined |
| // in fec_private_tables.h, is more significant for longer codes |
| // (i.e., more packets/symbols in the code, so larger (k,m), i.e., k > 4, |
| // m > 3). |
| |
| #include "webrtc/typedefs.h" |
| |
| namespace webrtc { |
| namespace fec_private_tables { |
| |
| const uint8_t kMaskBursty1_1[2] = { |
| 0x80, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty2_1[2] = { |
| 0xc0, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty2_2[4] = { |
| 0x80, 0x00, |
| 0xc0, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty3_1[2] = { |
| 0xe0, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty3_2[4] = { |
| 0xc0, 0x00, |
| 0xa0, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty3_3[6] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty4_1[2] = { |
| 0xf0, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty4_2[4] = { |
| 0xa0, 0x00, |
| 0xd0, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty4_3[6] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x90, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty4_4[8] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty5_1[2] = { |
| 0xf8, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty5_2[4] = { |
| 0xd0, 0x00, |
| 0xa8, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty5_3[6] = { |
| 0x70, 0x00, |
| 0x90, 0x00, |
| 0xc8, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty5_4[8] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x88, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty5_5[10] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty6_1[2] = { |
| 0xfc, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty6_2[4] = { |
| 0xa8, 0x00, |
| 0xd4, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty6_3[6] = { |
| 0x94, 0x00, |
| 0xc8, 0x00, |
| 0x64, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty6_4[8] = { |
| 0x60, 0x00, |
| 0x38, 0x00, |
| 0x88, 0x00, |
| 0xc4, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty6_5[10] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x84, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty6_6[12] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty7_1[2] = { |
| 0xfe, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty7_2[4] = { |
| 0xd4, 0x00, |
| 0xaa, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty7_3[6] = { |
| 0xc8, 0x00, |
| 0x74, 0x00, |
| 0x92, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty7_4[8] = { |
| 0x38, 0x00, |
| 0x8a, 0x00, |
| 0xc4, 0x00, |
| 0x62, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty7_5[10] = { |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x1c, 0x00, |
| 0x84, 0x00, |
| 0xc2, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty7_6[12] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x82, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty7_7[14] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty8_1[2] = { |
| 0xff, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty8_2[4] = { |
| 0xaa, 0x00, |
| 0xd5, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty8_3[6] = { |
| 0x74, 0x00, |
| 0x92, 0x00, |
| 0xc9, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty8_4[8] = { |
| 0x8a, 0x00, |
| 0xc5, 0x00, |
| 0x62, 0x00, |
| 0x31, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty8_5[10] = { |
| 0x30, 0x00, |
| 0x1c, 0x00, |
| 0x85, 0x00, |
| 0xc2, 0x00, |
| 0x61, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty8_6[12] = { |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0e, 0x00, |
| 0x82, 0x00, |
| 0xc1, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty8_7[14] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x81, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty8_8[16] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00 |
| }; |
| |
| const uint8_t kMaskBursty9_1[2] = { |
| 0xff, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty9_2[4] = { |
| 0xd5, 0x00, |
| 0xaa, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty9_3[6] = { |
| 0x92, 0x00, |
| 0xc9, 0x00, |
| 0x74, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty9_4[8] = { |
| 0xc5, 0x00, |
| 0x62, 0x00, |
| 0x39, 0x00, |
| 0x8a, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty9_5[10] = { |
| 0x1c, 0x00, |
| 0x85, 0x00, |
| 0xc2, 0x80, |
| 0x61, 0x00, |
| 0x30, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty9_6[12] = { |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0e, 0x00, |
| 0x82, 0x80, |
| 0xc1, 0x00, |
| 0x60, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty9_7[14] = { |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x07, 0x00, |
| 0x81, 0x00, |
| 0xc0, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty9_8[16] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x80, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty9_9[18] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80 |
| }; |
| |
| const uint8_t kMaskBursty10_1[2] = { |
| 0xff, 0xc0 |
| }; |
| |
| const uint8_t kMaskBursty10_2[4] = { |
| 0xaa, 0x80, |
| 0xd5, 0x40 |
| }; |
| |
| const uint8_t kMaskBursty10_3[6] = { |
| 0xc9, 0x00, |
| 0x74, 0x80, |
| 0x92, 0x40 |
| }; |
| |
| const uint8_t kMaskBursty10_4[8] = { |
| 0x62, 0x00, |
| 0x39, 0x00, |
| 0x8a, 0x80, |
| 0xc5, 0x40 |
| }; |
| |
| const uint8_t kMaskBursty10_5[10] = { |
| 0x85, 0x00, |
| 0xc2, 0x80, |
| 0x61, 0x40, |
| 0x30, 0x80, |
| 0x18, 0x40 |
| }; |
| |
| const uint8_t kMaskBursty10_6[12] = { |
| 0x18, 0x00, |
| 0x0e, 0x00, |
| 0x82, 0x80, |
| 0xc1, 0x40, |
| 0x60, 0x80, |
| 0x30, 0x40 |
| }; |
| |
| const uint8_t kMaskBursty10_7[14] = { |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x07, 0x00, |
| 0x81, 0x40, |
| 0xc0, 0x80, |
| 0x60, 0x40 |
| }; |
| |
| const uint8_t kMaskBursty10_8[16] = { |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x80, 0x80, |
| 0xc0, 0x40 |
| }; |
| |
| const uint8_t kMaskBursty10_9[18] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x80, 0x40 |
| }; |
| |
| const uint8_t kMaskBursty10_10[20] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x00, 0xc0 |
| }; |
| |
| const uint8_t kMaskBursty11_1[2] = { |
| 0xff, 0xe0 |
| }; |
| |
| const uint8_t kMaskBursty11_2[4] = { |
| 0xd5, 0x40, |
| 0xaa, 0xa0 |
| }; |
| |
| const uint8_t kMaskBursty11_3[6] = { |
| 0x74, 0x80, |
| 0x92, 0x40, |
| 0xc9, 0x20 |
| }; |
| |
| const uint8_t kMaskBursty11_4[8] = { |
| 0x39, 0x00, |
| 0x8a, 0x80, |
| 0xc5, 0x40, |
| 0x62, 0x20 |
| }; |
| |
| const uint8_t kMaskBursty11_5[10] = { |
| 0xc2, 0xc0, |
| 0x61, 0x00, |
| 0x30, 0xa0, |
| 0x1c, 0x40, |
| 0x85, 0x20 |
| }; |
| |
| const uint8_t kMaskBursty11_6[12] = { |
| 0x0e, 0x00, |
| 0x82, 0x80, |
| 0xc1, 0x40, |
| 0x60, 0xa0, |
| 0x30, 0x40, |
| 0x18, 0x20 |
| }; |
| |
| const uint8_t kMaskBursty11_7[14] = { |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x07, 0x00, |
| 0x81, 0x40, |
| 0xc0, 0xa0, |
| 0x60, 0x40, |
| 0x30, 0x20 |
| }; |
| |
| const uint8_t kMaskBursty11_8[16] = { |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x40, |
| 0x80, 0xa0, |
| 0xc0, 0x40, |
| 0x60, 0x20 |
| }; |
| |
| const uint8_t kMaskBursty11_9[18] = { |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x80, 0x40, |
| 0xc0, 0x20 |
| }; |
| |
| const uint8_t kMaskBursty11_10[20] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x00, 0xc0, |
| 0x80, 0x20 |
| }; |
| |
| const uint8_t kMaskBursty11_11[22] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x00, 0xc0, |
| 0x00, 0x60 |
| }; |
| |
| const uint8_t kMaskBursty12_1[2] = { |
| 0xff, 0xf0 |
| }; |
| |
| const uint8_t kMaskBursty12_2[4] = { |
| 0xaa, 0xa0, |
| 0xd5, 0x50 |
| }; |
| |
| const uint8_t kMaskBursty12_3[6] = { |
| 0x92, 0x40, |
| 0xc9, 0x20, |
| 0x74, 0x90 |
| }; |
| |
| const uint8_t kMaskBursty12_4[8] = { |
| 0x8a, 0x80, |
| 0xc5, 0x40, |
| 0x62, 0x20, |
| 0x39, 0x10 |
| }; |
| |
| const uint8_t kMaskBursty12_5[10] = { |
| 0x61, 0x00, |
| 0x30, 0xa0, |
| 0x1c, 0x50, |
| 0x85, 0x20, |
| 0xc2, 0x90 |
| }; |
| |
| const uint8_t kMaskBursty12_6[12] = { |
| 0x82, 0x90, |
| 0xc1, 0x40, |
| 0x60, 0xa0, |
| 0x30, 0x50, |
| 0x18, 0x20, |
| 0x0c, 0x10 |
| }; |
| |
| const uint8_t kMaskBursty12_7[14] = { |
| 0x0c, 0x00, |
| 0x07, 0x00, |
| 0x81, 0x40, |
| 0xc0, 0xa0, |
| 0x60, 0x50, |
| 0x30, 0x20, |
| 0x18, 0x10 |
| }; |
| |
| const uint8_t kMaskBursty12_8[16] = { |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x80, 0xa0, |
| 0xc0, 0x50, |
| 0x60, 0x20, |
| 0x30, 0x10 |
| }; |
| |
| const uint8_t kMaskBursty12_9[18] = { |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x80, 0x50, |
| 0xc0, 0x20, |
| 0x60, 0x10 |
| }; |
| |
| const uint8_t kMaskBursty12_10[20] = { |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x00, 0xc0, |
| 0x80, 0x20, |
| 0xc0, 0x10 |
| }; |
| |
| const uint8_t kMaskBursty12_11[22] = { |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x00, 0xc0, |
| 0x00, 0x60, |
| 0x80, 0x10 |
| }; |
| |
| const uint8_t kMaskBursty12_12[24] = { |
| 0x80, 0x00, |
| 0xc0, 0x00, |
| 0x60, 0x00, |
| 0x30, 0x00, |
| 0x18, 0x00, |
| 0x0c, 0x00, |
| 0x06, 0x00, |
| 0x03, 0x00, |
| 0x01, 0x80, |
| 0x00, 0xc0, |
| 0x00, 0x60, |
| 0x00, 0x30 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty1[1] = { |
| kMaskBursty1_1 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty2[2] = { |
| kMaskBursty2_1, |
| kMaskBursty2_2 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty3[3] = { |
| kMaskBursty3_1, |
| kMaskBursty3_2, |
| kMaskBursty3_3 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty4[4] = { |
| kMaskBursty4_1, |
| kMaskBursty4_2, |
| kMaskBursty4_3, |
| kMaskBursty4_4 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty5[5] = { |
| kMaskBursty5_1, |
| kMaskBursty5_2, |
| kMaskBursty5_3, |
| kMaskBursty5_4, |
| kMaskBursty5_5 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty6[6] = { |
| kMaskBursty6_1, |
| kMaskBursty6_2, |
| kMaskBursty6_3, |
| kMaskBursty6_4, |
| kMaskBursty6_5, |
| kMaskBursty6_6 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty7[7] = { |
| kMaskBursty7_1, |
| kMaskBursty7_2, |
| kMaskBursty7_3, |
| kMaskBursty7_4, |
| kMaskBursty7_5, |
| kMaskBursty7_6, |
| kMaskBursty7_7 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty8[8] = { |
| kMaskBursty8_1, |
| kMaskBursty8_2, |
| kMaskBursty8_3, |
| kMaskBursty8_4, |
| kMaskBursty8_5, |
| kMaskBursty8_6, |
| kMaskBursty8_7, |
| kMaskBursty8_8 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty9[9] = { |
| kMaskBursty9_1, |
| kMaskBursty9_2, |
| kMaskBursty9_3, |
| kMaskBursty9_4, |
| kMaskBursty9_5, |
| kMaskBursty9_6, |
| kMaskBursty9_7, |
| kMaskBursty9_8, |
| kMaskBursty9_9 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty10[10] = { |
| kMaskBursty10_1, |
| kMaskBursty10_2, |
| kMaskBursty10_3, |
| kMaskBursty10_4, |
| kMaskBursty10_5, |
| kMaskBursty10_6, |
| kMaskBursty10_7, |
| kMaskBursty10_8, |
| kMaskBursty10_9, |
| kMaskBursty10_10 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty11[11] = { |
| kMaskBursty11_1, |
| kMaskBursty11_2, |
| kMaskBursty11_3, |
| kMaskBursty11_4, |
| kMaskBursty11_5, |
| kMaskBursty11_6, |
| kMaskBursty11_7, |
| kMaskBursty11_8, |
| kMaskBursty11_9, |
| kMaskBursty11_10, |
| kMaskBursty11_11 |
| }; |
| |
| const uint8_t* const kPacketMaskBursty12[12] = { |
| kMaskBursty12_1, |
| kMaskBursty12_2, |
| kMaskBursty12_3, |
| kMaskBursty12_4, |
| kMaskBursty12_5, |
| kMaskBursty12_6, |
| kMaskBursty12_7, |
| kMaskBursty12_8, |
| kMaskBursty12_9, |
| kMaskBursty12_10, |
| kMaskBursty12_11, |
| kMaskBursty12_12 |
| }; |
| |
| const uint8_t* const* const kPacketMaskBurstyTbl[12] = { |
| kPacketMaskBursty1, |
| kPacketMaskBursty2, |
| kPacketMaskBursty3, |
| kPacketMaskBursty4, |
| kPacketMaskBursty5, |
| kPacketMaskBursty6, |
| kPacketMaskBursty7, |
| kPacketMaskBursty8, |
| kPacketMaskBursty9, |
| kPacketMaskBursty10, |
| kPacketMaskBursty11, |
| kPacketMaskBursty12 |
| }; |
| |
| } // namespace fec_private_tables |
| } // namespace webrtc |
| #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_BURSTY_H_ |