blob: 1fce36a584bb89bb351f5d515032ef315a52343b [file] [log] [blame]
/*
* 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_