1 /* 2 * Copyright (c) 2012 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_FEC_PRIVATE_TABLES_BURSTY_H_ 12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_BURSTY_H_ 13 14 // This file contains a set of packets masks for the FEC code. The masks in 15 // this table are specifically designed to favor recovery of bursty/consecutive 16 // loss network conditions. The tradeoff is worse recovery for random losses. 17 // These packet masks are currently defined to protect up to 12 media packets. 18 // They have the following property: for any packet mask defined by the 19 // parameters (k,m), where k = number of media packets, m = number of FEC 20 // packets, all "consecutive" losses of size <= m are completely recoverable. 21 // By consecutive losses we mean consecutive with respect to the sequence 22 // number ordering of the list (media and FEC) of packets. The difference 23 // between these masks (|kFecMaskBursty|) and |kFecMaskRandom| type, defined 24 // in fec_private_tables.h, is more significant for longer codes 25 // (i.e., more packets/symbols in the code, so larger (k,m), i.e., k > 4, 26 // m > 3). 27 28 #include "webrtc/typedefs.h" 29 30 namespace webrtc { 31 namespace fec_private_tables { 32 33 const uint8_t kMaskBursty1_1[2] = { 34 0x80, 0x00 35 }; 36 37 const uint8_t kMaskBursty2_1[2] = { 38 0xc0, 0x00 39 }; 40 41 const uint8_t kMaskBursty2_2[4] = { 42 0x80, 0x00, 43 0xc0, 0x00 44 }; 45 46 const uint8_t kMaskBursty3_1[2] = { 47 0xe0, 0x00 48 }; 49 50 const uint8_t kMaskBursty3_2[4] = { 51 0xc0, 0x00, 52 0xa0, 0x00 53 }; 54 55 const uint8_t kMaskBursty3_3[6] = { 56 0x80, 0x00, 57 0xc0, 0x00, 58 0x60, 0x00 59 }; 60 61 const uint8_t kMaskBursty4_1[2] = { 62 0xf0, 0x00 63 }; 64 65 const uint8_t kMaskBursty4_2[4] = { 66 0xa0, 0x00, 67 0xd0, 0x00 68 }; 69 70 const uint8_t kMaskBursty4_3[6] = { 71 0xc0, 0x00, 72 0x60, 0x00, 73 0x90, 0x00 74 }; 75 76 const uint8_t kMaskBursty4_4[8] = { 77 0x80, 0x00, 78 0xc0, 0x00, 79 0x60, 0x00, 80 0x30, 0x00 81 }; 82 83 const uint8_t kMaskBursty5_1[2] = { 84 0xf8, 0x00 85 }; 86 87 const uint8_t kMaskBursty5_2[4] = { 88 0xd0, 0x00, 89 0xa8, 0x00 90 }; 91 92 const uint8_t kMaskBursty5_3[6] = { 93 0x70, 0x00, 94 0x90, 0x00, 95 0xc8, 0x00 96 }; 97 98 const uint8_t kMaskBursty5_4[8] = { 99 0xc0, 0x00, 100 0x60, 0x00, 101 0x30, 0x00, 102 0x88, 0x00 103 }; 104 105 const uint8_t kMaskBursty5_5[10] = { 106 0x80, 0x00, 107 0xc0, 0x00, 108 0x60, 0x00, 109 0x30, 0x00, 110 0x18, 0x00 111 }; 112 113 const uint8_t kMaskBursty6_1[2] = { 114 0xfc, 0x00 115 }; 116 117 const uint8_t kMaskBursty6_2[4] = { 118 0xa8, 0x00, 119 0xd4, 0x00 120 }; 121 122 const uint8_t kMaskBursty6_3[6] = { 123 0x94, 0x00, 124 0xc8, 0x00, 125 0x64, 0x00 126 }; 127 128 const uint8_t kMaskBursty6_4[8] = { 129 0x60, 0x00, 130 0x38, 0x00, 131 0x88, 0x00, 132 0xc4, 0x00 133 }; 134 135 const uint8_t kMaskBursty6_5[10] = { 136 0xc0, 0x00, 137 0x60, 0x00, 138 0x30, 0x00, 139 0x18, 0x00, 140 0x84, 0x00 141 }; 142 143 const uint8_t kMaskBursty6_6[12] = { 144 0x80, 0x00, 145 0xc0, 0x00, 146 0x60, 0x00, 147 0x30, 0x00, 148 0x18, 0x00, 149 0x0c, 0x00 150 }; 151 152 const uint8_t kMaskBursty7_1[2] = { 153 0xfe, 0x00 154 }; 155 156 const uint8_t kMaskBursty7_2[4] = { 157 0xd4, 0x00, 158 0xaa, 0x00 159 }; 160 161 const uint8_t kMaskBursty7_3[6] = { 162 0xc8, 0x00, 163 0x74, 0x00, 164 0x92, 0x00 165 }; 166 167 const uint8_t kMaskBursty7_4[8] = { 168 0x38, 0x00, 169 0x8a, 0x00, 170 0xc4, 0x00, 171 0x62, 0x00 172 }; 173 174 const uint8_t kMaskBursty7_5[10] = { 175 0x60, 0x00, 176 0x30, 0x00, 177 0x1c, 0x00, 178 0x84, 0x00, 179 0xc2, 0x00 180 }; 181 182 const uint8_t kMaskBursty7_6[12] = { 183 0xc0, 0x00, 184 0x60, 0x00, 185 0x30, 0x00, 186 0x18, 0x00, 187 0x0c, 0x00, 188 0x82, 0x00 189 }; 190 191 const uint8_t kMaskBursty7_7[14] = { 192 0x80, 0x00, 193 0xc0, 0x00, 194 0x60, 0x00, 195 0x30, 0x00, 196 0x18, 0x00, 197 0x0c, 0x00, 198 0x06, 0x00 199 }; 200 201 const uint8_t kMaskBursty8_1[2] = { 202 0xff, 0x00 203 }; 204 205 const uint8_t kMaskBursty8_2[4] = { 206 0xaa, 0x00, 207 0xd5, 0x00 208 }; 209 210 const uint8_t kMaskBursty8_3[6] = { 211 0x74, 0x00, 212 0x92, 0x00, 213 0xc9, 0x00 214 }; 215 216 const uint8_t kMaskBursty8_4[8] = { 217 0x8a, 0x00, 218 0xc5, 0x00, 219 0x62, 0x00, 220 0x31, 0x00 221 }; 222 223 const uint8_t kMaskBursty8_5[10] = { 224 0x30, 0x00, 225 0x1c, 0x00, 226 0x85, 0x00, 227 0xc2, 0x00, 228 0x61, 0x00 229 }; 230 231 const uint8_t kMaskBursty8_6[12] = { 232 0x60, 0x00, 233 0x30, 0x00, 234 0x18, 0x00, 235 0x0e, 0x00, 236 0x82, 0x00, 237 0xc1, 0x00 238 }; 239 240 const uint8_t kMaskBursty8_7[14] = { 241 0xc0, 0x00, 242 0x60, 0x00, 243 0x30, 0x00, 244 0x18, 0x00, 245 0x0c, 0x00, 246 0x06, 0x00, 247 0x81, 0x00 248 }; 249 250 const uint8_t kMaskBursty8_8[16] = { 251 0x80, 0x00, 252 0xc0, 0x00, 253 0x60, 0x00, 254 0x30, 0x00, 255 0x18, 0x00, 256 0x0c, 0x00, 257 0x06, 0x00, 258 0x03, 0x00 259 }; 260 261 const uint8_t kMaskBursty9_1[2] = { 262 0xff, 0x80 263 }; 264 265 const uint8_t kMaskBursty9_2[4] = { 266 0xd5, 0x00, 267 0xaa, 0x80 268 }; 269 270 const uint8_t kMaskBursty9_3[6] = { 271 0x92, 0x00, 272 0xc9, 0x00, 273 0x74, 0x80 274 }; 275 276 const uint8_t kMaskBursty9_4[8] = { 277 0xc5, 0x00, 278 0x62, 0x00, 279 0x39, 0x00, 280 0x8a, 0x80 281 }; 282 283 const uint8_t kMaskBursty9_5[10] = { 284 0x1c, 0x00, 285 0x85, 0x00, 286 0xc2, 0x80, 287 0x61, 0x00, 288 0x30, 0x80 289 }; 290 291 const uint8_t kMaskBursty9_6[12] = { 292 0x30, 0x00, 293 0x18, 0x00, 294 0x0e, 0x00, 295 0x82, 0x80, 296 0xc1, 0x00, 297 0x60, 0x80 298 }; 299 300 const uint8_t kMaskBursty9_7[14] = { 301 0x60, 0x00, 302 0x30, 0x00, 303 0x18, 0x00, 304 0x0c, 0x00, 305 0x07, 0x00, 306 0x81, 0x00, 307 0xc0, 0x80 308 }; 309 310 const uint8_t kMaskBursty9_8[16] = { 311 0xc0, 0x00, 312 0x60, 0x00, 313 0x30, 0x00, 314 0x18, 0x00, 315 0x0c, 0x00, 316 0x06, 0x00, 317 0x03, 0x00, 318 0x80, 0x80 319 }; 320 321 const uint8_t kMaskBursty9_9[18] = { 322 0x80, 0x00, 323 0xc0, 0x00, 324 0x60, 0x00, 325 0x30, 0x00, 326 0x18, 0x00, 327 0x0c, 0x00, 328 0x06, 0x00, 329 0x03, 0x00, 330 0x01, 0x80 331 }; 332 333 const uint8_t kMaskBursty10_1[2] = { 334 0xff, 0xc0 335 }; 336 337 const uint8_t kMaskBursty10_2[4] = { 338 0xaa, 0x80, 339 0xd5, 0x40 340 }; 341 342 const uint8_t kMaskBursty10_3[6] = { 343 0xc9, 0x00, 344 0x74, 0x80, 345 0x92, 0x40 346 }; 347 348 const uint8_t kMaskBursty10_4[8] = { 349 0x62, 0x00, 350 0x39, 0x00, 351 0x8a, 0x80, 352 0xc5, 0x40 353 }; 354 355 const uint8_t kMaskBursty10_5[10] = { 356 0x85, 0x00, 357 0xc2, 0x80, 358 0x61, 0x40, 359 0x30, 0x80, 360 0x18, 0x40 361 }; 362 363 const uint8_t kMaskBursty10_6[12] = { 364 0x18, 0x00, 365 0x0e, 0x00, 366 0x82, 0x80, 367 0xc1, 0x40, 368 0x60, 0x80, 369 0x30, 0x40 370 }; 371 372 const uint8_t kMaskBursty10_7[14] = { 373 0x30, 0x00, 374 0x18, 0x00, 375 0x0c, 0x00, 376 0x07, 0x00, 377 0x81, 0x40, 378 0xc0, 0x80, 379 0x60, 0x40 380 }; 381 382 const uint8_t kMaskBursty10_8[16] = { 383 0x60, 0x00, 384 0x30, 0x00, 385 0x18, 0x00, 386 0x0c, 0x00, 387 0x06, 0x00, 388 0x03, 0x00, 389 0x80, 0x80, 390 0xc0, 0x40 391 }; 392 393 const uint8_t kMaskBursty10_9[18] = { 394 0xc0, 0x00, 395 0x60, 0x00, 396 0x30, 0x00, 397 0x18, 0x00, 398 0x0c, 0x00, 399 0x06, 0x00, 400 0x03, 0x00, 401 0x01, 0x80, 402 0x80, 0x40 403 }; 404 405 const uint8_t kMaskBursty10_10[20] = { 406 0x80, 0x00, 407 0xc0, 0x00, 408 0x60, 0x00, 409 0x30, 0x00, 410 0x18, 0x00, 411 0x0c, 0x00, 412 0x06, 0x00, 413 0x03, 0x00, 414 0x01, 0x80, 415 0x00, 0xc0 416 }; 417 418 const uint8_t kMaskBursty11_1[2] = { 419 0xff, 0xe0 420 }; 421 422 const uint8_t kMaskBursty11_2[4] = { 423 0xd5, 0x40, 424 0xaa, 0xa0 425 }; 426 427 const uint8_t kMaskBursty11_3[6] = { 428 0x74, 0x80, 429 0x92, 0x40, 430 0xc9, 0x20 431 }; 432 433 const uint8_t kMaskBursty11_4[8] = { 434 0x39, 0x00, 435 0x8a, 0x80, 436 0xc5, 0x40, 437 0x62, 0x20 438 }; 439 440 const uint8_t kMaskBursty11_5[10] = { 441 0xc2, 0xc0, 442 0x61, 0x00, 443 0x30, 0xa0, 444 0x1c, 0x40, 445 0x85, 0x20 446 }; 447 448 const uint8_t kMaskBursty11_6[12] = { 449 0x0e, 0x00, 450 0x82, 0x80, 451 0xc1, 0x40, 452 0x60, 0xa0, 453 0x30, 0x40, 454 0x18, 0x20 455 }; 456 457 const uint8_t kMaskBursty11_7[14] = { 458 0x18, 0x00, 459 0x0c, 0x00, 460 0x07, 0x00, 461 0x81, 0x40, 462 0xc0, 0xa0, 463 0x60, 0x40, 464 0x30, 0x20 465 }; 466 467 const uint8_t kMaskBursty11_8[16] = { 468 0x30, 0x00, 469 0x18, 0x00, 470 0x0c, 0x00, 471 0x06, 0x00, 472 0x03, 0x40, 473 0x80, 0xa0, 474 0xc0, 0x40, 475 0x60, 0x20 476 }; 477 478 const uint8_t kMaskBursty11_9[18] = { 479 0x60, 0x00, 480 0x30, 0x00, 481 0x18, 0x00, 482 0x0c, 0x00, 483 0x06, 0x00, 484 0x03, 0x00, 485 0x01, 0x80, 486 0x80, 0x40, 487 0xc0, 0x20 488 }; 489 490 const uint8_t kMaskBursty11_10[20] = { 491 0xc0, 0x00, 492 0x60, 0x00, 493 0x30, 0x00, 494 0x18, 0x00, 495 0x0c, 0x00, 496 0x06, 0x00, 497 0x03, 0x00, 498 0x01, 0x80, 499 0x00, 0xc0, 500 0x80, 0x20 501 }; 502 503 const uint8_t kMaskBursty11_11[22] = { 504 0x80, 0x00, 505 0xc0, 0x00, 506 0x60, 0x00, 507 0x30, 0x00, 508 0x18, 0x00, 509 0x0c, 0x00, 510 0x06, 0x00, 511 0x03, 0x00, 512 0x01, 0x80, 513 0x00, 0xc0, 514 0x00, 0x60 515 }; 516 517 const uint8_t kMaskBursty12_1[2] = { 518 0xff, 0xf0 519 }; 520 521 const uint8_t kMaskBursty12_2[4] = { 522 0xaa, 0xa0, 523 0xd5, 0x50 524 }; 525 526 const uint8_t kMaskBursty12_3[6] = { 527 0x92, 0x40, 528 0xc9, 0x20, 529 0x74, 0x90 530 }; 531 532 const uint8_t kMaskBursty12_4[8] = { 533 0x8a, 0x80, 534 0xc5, 0x40, 535 0x62, 0x20, 536 0x39, 0x10 537 }; 538 539 const uint8_t kMaskBursty12_5[10] = { 540 0x61, 0x00, 541 0x30, 0xa0, 542 0x1c, 0x50, 543 0x85, 0x20, 544 0xc2, 0x90 545 }; 546 547 const uint8_t kMaskBursty12_6[12] = { 548 0x82, 0x90, 549 0xc1, 0x40, 550 0x60, 0xa0, 551 0x30, 0x50, 552 0x18, 0x20, 553 0x0c, 0x10 554 }; 555 556 const uint8_t kMaskBursty12_7[14] = { 557 0x0c, 0x00, 558 0x07, 0x00, 559 0x81, 0x40, 560 0xc0, 0xa0, 561 0x60, 0x50, 562 0x30, 0x20, 563 0x18, 0x10 564 }; 565 566 const uint8_t kMaskBursty12_8[16] = { 567 0x18, 0x00, 568 0x0c, 0x00, 569 0x06, 0x00, 570 0x03, 0x00, 571 0x80, 0xa0, 572 0xc0, 0x50, 573 0x60, 0x20, 574 0x30, 0x10 575 }; 576 577 const uint8_t kMaskBursty12_9[18] = { 578 0x30, 0x00, 579 0x18, 0x00, 580 0x0c, 0x00, 581 0x06, 0x00, 582 0x03, 0x00, 583 0x01, 0x80, 584 0x80, 0x50, 585 0xc0, 0x20, 586 0x60, 0x10 587 }; 588 589 const uint8_t kMaskBursty12_10[20] = { 590 0x60, 0x00, 591 0x30, 0x00, 592 0x18, 0x00, 593 0x0c, 0x00, 594 0x06, 0x00, 595 0x03, 0x00, 596 0x01, 0x80, 597 0x00, 0xc0, 598 0x80, 0x20, 599 0xc0, 0x10 600 }; 601 602 const uint8_t kMaskBursty12_11[22] = { 603 0xc0, 0x00, 604 0x60, 0x00, 605 0x30, 0x00, 606 0x18, 0x00, 607 0x0c, 0x00, 608 0x06, 0x00, 609 0x03, 0x00, 610 0x01, 0x80, 611 0x00, 0xc0, 612 0x00, 0x60, 613 0x80, 0x10 614 }; 615 616 const uint8_t kMaskBursty12_12[24] = { 617 0x80, 0x00, 618 0xc0, 0x00, 619 0x60, 0x00, 620 0x30, 0x00, 621 0x18, 0x00, 622 0x0c, 0x00, 623 0x06, 0x00, 624 0x03, 0x00, 625 0x01, 0x80, 626 0x00, 0xc0, 627 0x00, 0x60, 628 0x00, 0x30 629 }; 630 631 const uint8_t* kPacketMaskBursty1[1] = { 632 kMaskBursty1_1 633 }; 634 635 const uint8_t* kPacketMaskBursty2[2] = { 636 kMaskBursty2_1, 637 kMaskBursty2_2 638 }; 639 640 const uint8_t* kPacketMaskBursty3[3] = { 641 kMaskBursty3_1, 642 kMaskBursty3_2, 643 kMaskBursty3_3 644 }; 645 646 const uint8_t* kPacketMaskBursty4[4] = { 647 kMaskBursty4_1, 648 kMaskBursty4_2, 649 kMaskBursty4_3, 650 kMaskBursty4_4 651 }; 652 653 const uint8_t* kPacketMaskBursty5[5] = { 654 kMaskBursty5_1, 655 kMaskBursty5_2, 656 kMaskBursty5_3, 657 kMaskBursty5_4, 658 kMaskBursty5_5 659 }; 660 661 const uint8_t* kPacketMaskBursty6[6] = { 662 kMaskBursty6_1, 663 kMaskBursty6_2, 664 kMaskBursty6_3, 665 kMaskBursty6_4, 666 kMaskBursty6_5, 667 kMaskBursty6_6 668 }; 669 670 const uint8_t* kPacketMaskBursty7[7] = { 671 kMaskBursty7_1, 672 kMaskBursty7_2, 673 kMaskBursty7_3, 674 kMaskBursty7_4, 675 kMaskBursty7_5, 676 kMaskBursty7_6, 677 kMaskBursty7_7 678 }; 679 680 const uint8_t* kPacketMaskBursty8[8] = { 681 kMaskBursty8_1, 682 kMaskBursty8_2, 683 kMaskBursty8_3, 684 kMaskBursty8_4, 685 kMaskBursty8_5, 686 kMaskBursty8_6, 687 kMaskBursty8_7, 688 kMaskBursty8_8 689 }; 690 691 const uint8_t* kPacketMaskBursty9[9] = { 692 kMaskBursty9_1, 693 kMaskBursty9_2, 694 kMaskBursty9_3, 695 kMaskBursty9_4, 696 kMaskBursty9_5, 697 kMaskBursty9_6, 698 kMaskBursty9_7, 699 kMaskBursty9_8, 700 kMaskBursty9_9 701 }; 702 703 const uint8_t* kPacketMaskBursty10[10] = { 704 kMaskBursty10_1, 705 kMaskBursty10_2, 706 kMaskBursty10_3, 707 kMaskBursty10_4, 708 kMaskBursty10_5, 709 kMaskBursty10_6, 710 kMaskBursty10_7, 711 kMaskBursty10_8, 712 kMaskBursty10_9, 713 kMaskBursty10_10 714 }; 715 716 const uint8_t* kPacketMaskBursty11[11] = { 717 kMaskBursty11_1, 718 kMaskBursty11_2, 719 kMaskBursty11_3, 720 kMaskBursty11_4, 721 kMaskBursty11_5, 722 kMaskBursty11_6, 723 kMaskBursty11_7, 724 kMaskBursty11_8, 725 kMaskBursty11_9, 726 kMaskBursty11_10, 727 kMaskBursty11_11 728 }; 729 730 const uint8_t* kPacketMaskBursty12[12] = { 731 kMaskBursty12_1, 732 kMaskBursty12_2, 733 kMaskBursty12_3, 734 kMaskBursty12_4, 735 kMaskBursty12_5, 736 kMaskBursty12_6, 737 kMaskBursty12_7, 738 kMaskBursty12_8, 739 kMaskBursty12_9, 740 kMaskBursty12_10, 741 kMaskBursty12_11, 742 kMaskBursty12_12 743 }; 744 745 const uint8_t** kPacketMaskBurstyTbl[12] = { 746 kPacketMaskBursty1, 747 kPacketMaskBursty2, 748 kPacketMaskBursty3, 749 kPacketMaskBursty4, 750 kPacketMaskBursty5, 751 kPacketMaskBursty6, 752 kPacketMaskBursty7, 753 kPacketMaskBursty8, 754 kPacketMaskBursty9, 755 kPacketMaskBursty10, 756 kPacketMaskBursty11, 757 kPacketMaskBursty12 758 }; 759 760 } // namespace fec_private_tables 761 } // namespace webrtc 762 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_BURSTY_H_ 763