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