1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
|
Network Working Group J. Rosenberg
Request for Comments: 2733 dynamicsoft
Category: Standards Track H. Schulzrinne
Columbia University
December 1999
An RTP Payload Format for Generic Forward Error Correction
Status of this Memo
This document specifies an Internet standards track protocol for the
Internet community, and requests discussion and suggestions for
improvements. Please refer to the current edition of the "Internet
Official Protocol Standards" (STD 1) for the standardization state
and status of this protocol. Distribution of this memo is unlimited.
Copyright Notice
Copyright (C) The Internet Society (1999). All Rights Reserved.
Abstract
This document specifies a payload format for generic forward error
correction of media encapsulated in RTP. It is engineered for FEC
algorithms based on the exclusive-or (parity) operation. The payload
format allows end systems to transmit using arbitrary block lengths
and parity schemes. It also allows for the recovery of both the
payload and critical RTP header fields. Since FEC is sent as a
separate stream, it is backwards compatible with non-FEC capable
hosts, so that receivers which do not wish to implement FEC can just
ignore the extensions.
Table of Contents
1 Introduction ........................................... 2
2 Terminology ............................................ 2
3 Basic Operation ........................................ 3
4 Parity Codes ........................................... 5
5 RTP Media Packet Structure ............................. 6
6 FEC Packet Structure ................................... 7
6.1 RTP Header of FEC Packets .............................. 7
6.2 FEC Header ............................................. 7
7 Protection Operation ................................... 9
8 Recovery Procedures .................................... 10
8.1 Reconstruction ......................................... 10
8.2 Determination of When to Recover ....................... 12
Rosenberg & Schulzrinne Standards Track [Page 1]
^L
RFC 2733 Generic FEC December 1999
9 Example ................................................ 16
10 Use with Redundant Encodings ........................... 17
11 Indicating FEC Usage in SDP ............................ 20
11.1 FEC as a Separate Stream ............................... 20
11.2 Use with Redundant Encodings ........................... 21
11.3 Usage with RTSP ........................................ 22
12 Security Considerations ................................ 23
13 Acknowledgments ........................................ 24
14 Authors' Addresses ..................................... 24
15 Bibliography ........................................... 25
16 Full Copyright Statement ............................... 26
1 Introduction
The quality of packet voice on the Internet has been mediocre due, in
part, to high packet loss rates. This is especially true on wide-area
connections. Unfortunately, the strict delay requirements of real-
time multimedia usually eliminate the possibility of retransmissions.
It is for this reason that forward error correction (FEC) has been
proposed to compensate for packet loss in the Internet [1] [2]. In
particular, the use of traditional error correcting codes, such as
parity, Reed-Solomon, and Hamming codes, has attracted attention. To
support these mechanisms, protocol support is required.
This document defines a payload format for RTP [3] which allows for
generic forward error correction of real time media. In this context,
generic means that the FEC protocol is (1) independent of the nature
of the media being protected, be it audio, video, or otherwise, (2)
flexible enough to support a wide variety of FEC mechanisms, (3)
designed for adaptivity so that the FEC technique can be modified
easily without out of band signaling, and (4) supportive of a number
of different mechanisms for transporting the FEC packets.
2 Terminology
The following terms are used throughout this document:
Media Payload: is a piece of raw, un-protected user data which
is to be transmitted from the sender. The media payload is
placed inside of an RTP packet.
Media Header: is the RTP header for the packet containing the
media payload.
Media Packet: The combination of a media payload and media
header is called a media packet.
Rosenberg & Schulzrinne Standards Track [Page 2]
^L
RFC 2733 Generic FEC December 1999
FEC Packet: The forward error correction algorithms at the
transmitter take the media packets as an input. They output
both the media packets that they are passed, and new
packets called FEC packets. The FEC packets are formatted
according to the rules specified in this document.
FEC Header: The FEC header is the header information contained
in an FEC packet.
FEC Payload: The FEC payload is the payload in an FEC packet.
Associated: An FEC packet is said to be "associated" with one or
more media packets when those media packets are used to
generate the FEC packet (by use of the exclusive or
operation).
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 [4].
3 Basic Operation
The payload format described here is used whenever a participant in
an RTP session would like to protect a media stream it is sending
with forward error correction (FEC). The FEC supported by the format
are those codes based on simple exclusive or (xor) parities. The
sender takes some set of packets from the media stream, and applies
an xor operation across the payloads. The sender also applies the xor
operation over components of the RTP headers. Based on the procedures
defined here, the result is an RTP packet containing FEC information.
This packet can be used at the receiver to recover any one of the
packets used to generate the FEC packet. This document does not
mandate the particular set of media packets combined to generate an
FEC packet (such a set [is] referred to as a code). Use of differing
sets results in a tradeoff between overhead, delay, and
recoverability. Section 4 outlines some possible combinations.
The payload format contains information that allows the sender to
tell the receiver exactly which media packets have been used to
generate the FEC. Specifically, each FEC packet contains a bitmask,
called the offset mask, containing 24 bits. If bit i in the mask is
set to 1, the media packet with sequence number N + i was used to
generate this FEC packet. N is called the sequence number base, and
is sent in the FEC packet as well. The offset mask and payload type
are sufficient to signal arbitrary parity based forward error
correction schemes with little overhead.
Rosenberg & Schulzrinne Standards Track [Page 3]
^L
RFC 2733 Generic FEC December 1999
This document also describes procedures that allow the receiver to
make use of the FEC without having to know the details of specific
codes. This allows the sender much flexibility; it can adapt the code
in use based on network conditions, and be certain the receivers can
still make use of the FEC for recovery.
As the sender generates FEC packets, they are sent to the receivers.
The sender still usually sends the original media stream, as if there
were no FEC. This allows the media stream to still be used by
receivers who are not FEC capable. However, some FEC codes do not
require the original media to be sent; the FEC stream is sufficient
for recovery. These codes have the drawback that all receivers must
be FEC capable. However, they are supported by this format.
The FEC packets are not sent in the same RTP stream as the media
packets. They can be sent as a separate stream, or as a secondary
codec in the redundant codec payload format [5]. When sent as a
separate stream, the FEC packets have their own sequence number
space. Although the timestamps for the FEC packets are derived from
the media packets, they increment monotonically. FEC packet streams
thus work well with any header compression mechanism which requires
fixed deltas between fields in the packet header.
This document does not prescribe the definition of "separate
streams", but leaves this to applications and higher level protocols
to define. For multicast, the separate stream may be implemented by
separate multicast groups, different ports in the same group, or by a
different SSRC within the same group/port. For unicast, different
ports or different SSRC may be used. Each of these approaches has
drawbacks and benefits which depend on the application.
At the receiver, the FEC and original media are received. If no media
packets are lost, the FEC can be ignored. In the event of loss, the
FEC packets can be combined with other media and FEC packets that
have been received, resulting in recovery of missing media packets.
The recovery is exact; the payload is perfectly reconstructed, along
with most components of the header.
RTP packets which contain data formatted according to this
specification (i.e., FEC packets) are signaled using dynamic RTP
payload types.
Rosenberg & Schulzrinne Standards Track [Page 4]
^L
RFC 2733 Generic FEC December 1999
4 Parity Codes
For brevity, we define the function f(x,y,..) to be the XOR (parity)
operator applied to the packets x,y,... The output of this function
is another packet, called the parity packet. For simplicity, we
assume here that the parity packet is computed as the bitwise XOR of
the input packets. The exact procedure is specified in section 6.
Recovery of data packets using parity codes is accomplished by
generating one or more parity packets over a group of data packets.
To be effective, the parity packets must be generated by linearly
independent combinations of data packets. The particular combination
is called a parity code. One class of codes takes a group of k data
packets, and generates n-k parity packets. There are a large number
of possible parity codes for a given n,k. The payload format does not
mandate a particular code.
For example, consider a parity code which generates a single parity
packet over two data packets. If the original media packets are
a,b,c,d, the packets generated by the sender are:
a b c d <-- media stream
f(a,b) f(c,d) <-- FEC stream
where time increases to the right. In this example, the error
correction scheme (we use the terms scheme and code interchangeably)
introduces a 50% overhead. But if b is lost, a and f(a,b) can be used
to recover b.
Some additional codes are listed below. In each, the original media
stream consists of packets a,b,c,d and so on.
Scheme 1
--------
This scheme is the similar to the one in the example above. However,
instead of sending b, followed by f(a,b), f(a,b) is sent before b.
Doing this clearly requires additional delay at the sender. However,
if allows some bursts of two consecutive packet losses to be
recovered. The packets generated by the sender look like:
a b c d e <-- media stream
f(a,b) f(b,c) f(c,d) f(d,e) <-- FEC stream
Rosenberg & Schulzrinne Standards Track [Page 5]
^L
RFC 2733 Generic FEC December 1999
Scheme 2
--------
It is not strictly necessary for the original media stream to be
transmitted. In this scheme, only FEC packets are transmitted. This
scheme allows for recovery of all single packet losses and some
consecutive packet losses, but with slightly less overhead than
scheme 1. The packets generated by the sender look like:
f(a,b) f(a,c) f(a,b,c) f(c,d) f(c,e) f(c,d,e) <-- FEC stream
Scheme 3
--------
This scheme requires the receiver to wait an additional four packet
intervals to recover the original media packets. However, it can
recover from one, two or three consecutive packet losses. The packets
generated by the sender look like:
a b c d <-- media stream
f(a,b,c) f(a,c,d) f(a,b,d) <-- FEC stream
5 RTP Media Packet Structure
The formatting of the media packets is unaffected by FEC. If the FEC
is sent as a separate stream, the media packets are sent as if there
was no FEC. If the FEC is being sent as a redundant codec, the media
packets are sent as the main codec as defined in RFC 2198 [5].
This lends to a very efficient encoding. When little (or no) FEC is
used, there are mostly media packets being sent. This means that the
overhead (present in FEC packets only) tracks the amount of FEC in
use.
Rosenberg & Schulzrinne Standards Track [Page 6]
^L
RFC 2733 Generic FEC December 1999
6 FEC Packet Structure
An FEC packet is constructed by placing an FEC header and FEC payload
in the RTP payload, as shown in Figure 1:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FEC Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FEC Payload |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 1: FEC Packet Structure
6.1 RTP Header of FEC Packets
The version field is set to 2. The padding bit is computed via the
protection operation, defined below. The extension bit is also
computed via the protection operation. The SSRC value will generally
be the same as the SSRC value of the media stream it protects. It MAY
be different if the FEC stream is being demultiplexed via the SSRC
value. The CC value is computed via the protection operation. The
CSRC list is never present, independent of the value of the CC field.
The extension is never present, independent of the value of the X
bit. The marker bit is computed via the protection operation.
The sequence number has the standard definition: it MUST be one
higher than the sequence number in the previously transmitted FEC
packet. The timestamp MUST be set to the value of the media RTP clock
at the instant the FEC packet is transmitted. This results in the TS
value in FEC packets to be monotonically increasing, independent of
the FEC scheme.
The payload type for the FEC packet is determined through dynamic,
out of band means. According to RFC 1889 [3], RTP participants which
cannot recognize a payload type must discard it. This provides
backwards compatibility. The FEC mechanisms can then be used in a
multicast group with mixed FEC-capable and FEC-incapable receivers.
6.2 FEC Header
This header is 12 bytes. The format of the header is shown in Figure
2, and consists of an SN base field, length recovery field, E field,
PT recovery field, mask field and TS recovery field.
Rosenberg & Schulzrinne Standards Track [Page 7]
^L
RFC 2733 Generic FEC December 1999
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SN base | length recovery |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|E| PT recovery | mask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TS recovery |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 2: Parity Header Format
The length recovery field is used to determine the length of any
recovered packets. It is computed via the protection operation
applied to the unsigned network-ordered 16 bit representation of the
sums of the lengths (in bytes) of the media payload, CSRC list,
extension and padding of media packets associated with this FEC
packet (in other words, the CSRC list, extension, and padding, if
present, are "counted" as part of the payload). This allows the FEC
procedure to be applied even when the lengths of the media packets
are not identical. For example, assume an FEC packet is being
generated by xor'ing two media packets together. The length of the
two media packets are 3 (0b011) and 5 (0b101) bytes, respectively.
The length recovery field is then encoded as 0b011 xor 0b101 = 0b110.
The E bit indicates a header extension. Implementations conforming to
this version of the specification MUST set this bit to zero.
The PT recovery field is obtained via the protection operation
applied to the payload type values of the media packets associated
with the FEC packet.
The mask field is 24 bits. If bit i in the mask is set to 1, then the
media packet with sequence number N + i is associated with this FEC
packet, where N is the SN Base field in the FEC packet header. The
least significant bit corresponds to i=0, and the most significant to
i=23.
The SN base field MUST be set to the minimum sequence number of those
media packets protected by FEC. This allows for the FEC operation to
extend over any string of at most 24 packets.
The TS recovery field is computed via the protection operation
applied to the timestamps of the media packets associated with this
FEC packet. This allows the timestamp to be completely recovered.
The payload of the FEC packet is the protection operation applied to
the concatenation of the CSRC list, RTP extension, media payload, and
padding of the media packets associated with the FEC packet.
Rosenberg & Schulzrinne Standards Track [Page 8]
^L
RFC 2733 Generic FEC December 1999
Note that it's possible for the FEC packet to be slightly larger than
the media packets it protects (due to the presence of the FEC
header). This could cause difficulties if this results in the FEC
packet exceeding the Maximum Transmission Unit size for the path
along which it is sent.
7 Protection Operation
The protection operation involves concatenating specific fields from
the RTP header of the media packet, appending the payload, padding
with zeroes, and then computing the xor across the resulting bit
strings. The resulting bit string is used to generate the FEC packet.
The following procedure MAY be followed for the protection operation.
Other procedures MAY be followed, but the end result MUST be
identical to the one described here. For each media packet to be
protected, a bit string is generated by concatenating the following
fields together in the order specifed:
o Padding Bit (1 bit)
o Extension Bit (1 bit)
o CC bits (4 bits)
o Marker bit (1 bit)
o Payload Type (7 bits)
o Timestamp (32 bits)
o Unsigned network-ordered 16 bit representation of the sum of
the lengths (in bytes) of the CSRC List, length of the padding,
length of the extension, and length of the media payload (16
bits)
o if CC is nonzero, the CSRC List (variable length)
o if X is 1, the Header Extension (variable length)
o the payload (variable length)
o Padding, if present (variable length)
Note that the Padding Bit (first entry above) forms the most
significant bit of the bit string.
Rosenberg & Schulzrinne Standards Track [Page 9]
^L
RFC 2733 Generic FEC December 1999
If the lengths of the bit strings are not equal, each bit string that
is shorter than the length of the longest, MUST be padded to the
length of the longest. Any value for the pad may be used. The pad
MUST be added at the end of the bit string.
The parity operation is then applied across the bit strings. The
result is the bit string used to build the FEC packet. Call this the
FEC bit string.
The first (most significant) bit in the FEC bit string is written
into the Padding Bit of the FEC packet. The second bit in the FEC bit
string is written into the Extension bit of the FEC packet. The next
four bits of the FEC bit string are written into the CC field of the
FEC packet. The next bit of the FEC bit string is written into the
marker bit of the FEC packet. The next 7 bits of the FEC bit string
are written into the PT recovery field in the FEC packet header. The
next 32 bits of the FEC bit string are written into the TS recovery
field in the packet header. The next 16 bits are written into the
length recovery field in the FEC packet header. The remaining bits
are set to be the payload of the FEC packet.
8 Recovery Procedures
The FEC packets allow end systems to recover from the loss of media
packets. All of the header fields of the missing packets, including
CSRC lists, extensions, padding bits, marker and payload type, are
recoverable. This section describes the procedure for performing
this recovery.
Recovery requires two distinct operations. The first determines which
packets (media and FEC) must be combined in order to recover a
missing packet. Once this is done, the second step is to actually
reconstruct the data. The second step MUST be performed as described
below. The first step MAY be based on any algorithm chosen by the
implementer. Different algorithms result in a tradeoff between
complexity and the ability to recover missing packets if at all
possible.
8.1 Reconstruction
Let T be the list of packets (FEC and media) which can be combined to
recover some media packet xi. The procedure is as follows:
1. For the media packets in T, compute the bit string as
described in the protection operation of the previous
section.
Rosenberg & Schulzrinne Standards Track [Page 10]
^L
RFC 2733 Generic FEC December 1999
2. For the FEC packet in T, compute the bit string in the same
fashion, except use the PT Recovery instead of Payload Type,
TS Recovery instead of Timestamp, and always set the CSRC
list, extension, and padding to null.
3. If any of the bit strings generated from the media packets
are shorter than the bit string generated from the FEC
packet, pad them to be the same length as the bit string
generated from the FEC. The padding MUST be added at the
end of the bit string, and MAY be of any value.
4. Perform the exclusive or (parity) operation across the bit
strings, resulting in a recovery bit string.
5. Create a new packet with the standard 12 byte RTP header
and no payload.
6. Set the version of the new packet to 2.
7. Set the Padding bit in the new packet to the first bit in
the recovery bit string.
8. Set the Extension bit in the new packet to the second bit
in the recovery bit string.
9. Set the CC field to the next four bits in the recovery bit
string.
10. Set the marker bit in the new packet to the next bit in the
recovery bit string.
11. Set the payload type in the new packet to the next 7 bits
in the recovery bit string.
12. Set the SN field in the new packet to xi.
13. Set the TS field in the new packet to the next 32 bits in
the recovery bit string.
14. Take the next 16 bits of the recovery bit string. Whatever
unsigned integer this represents (assuming network-order),
take that many bytes from the recovery bit string and
append them to the new packet. This represents the CSRC
list, extension, payload, and padding.
Rosenberg & Schulzrinne Standards Track [Page 11]
^L
RFC 2733 Generic FEC December 1999
15. Set the SSRC of the new packet to the SSRC of the media
stream it's protecting.
This procedure will completely recover both the header and payload of
an RTP packet.
8.2 Determination of When to Recover
The previous section discussed how to recover a media packet with
sequence number xi when all of the packets needed to recover it were
available. The decision about whether to attempt recovery of some
media packet xi, and how to determine if sufficient data is available
to recover it, is left to the implementer. However, this section
provides a simple algorithm which MAY be used for this purpose.
The algorithm is described below in C code. The code assumes that
several functions exist. recover_packet() takes the sequence number
of a packet, and an FEC packet. Using the FEC packet and data packets
received previously, the data packet with the given sequence number
is recovered. add_fec_to_pending_list() adds the given FEC packet to
a linked list of FEC packets which have not yet been used for
recovery. wait_for_packet() waits for a packet, FEC or data, from the
network. remove_from_pending_list() removes the FEC packet from the
pending list. The structure packet contains a boolean variable fec
which is true when the packet is FEC, false if it's media. When its
an FEC packet, the mask and snbase field contain those values from
the FEC packet header. When it's a media packet, the sn variable
contains the sequence number of the packet. The global array A
indicates which media packets have been received, and which have not.
It is indexed by the sequence number of the packet.
The function fec_recovery implements the algorithm. It waits for
packets, and when it receives an FEC packet, calls recover_with_fec()
to attempt to use it to recover. If no recovery is possible, the FEC
packet is stored for later attempts. If the received packet was a
media packet, its presence is noted, and any old FEC packets are
checked to see if recovery is now possible. Recovered packets are
treated as if they were received, triggering further attempts at
recovery.
A real implementation will need to use a circular buffer instead of
the simple array (A in the code) in order to avoid running off the
end of the buffer. In addition, the code below does not attempt to
free up FEC packets that are old and were never used. Normally, such
discarding is done based on time constraints introduced by the
playout buffer. If an FEC data protects packets whose play time has
elapsed, the FEC is no longer needed.
Rosenberg & Schulzrinne Standards Track [Page 12]
^L
RFC 2733 Generic FEC December 1999
typedef struct packet_s {
BOOLEAN fec; /* FEC or media */
int sn; /* SN of the packet, for media only */
BOOLEAN mask[24]; /* Mask, FEC only */
int snbase; /* SN Base, FEC only */
struct packet_s *next;
} packet;
BOOLEAN A[65535];
packet *pending_list;
packet *recover_with_fec(packet *fec_pkt) {
packet *data_pkt;
int pkts_present, /* number of packets from the mask that are
present */
pkts_needed, /* number of packets needed is the number of ones
in the mask minus 1 */
pkt_to_recover, /* sn of the packet we are recovering */
i;
pkts_present = 0;
/* The number of packets needed is the number of ones in the mask
minus 1. The code below increments pkts_needed by the number
of ones in the mask, so we initialize this to -1 so that the
final count is correct */
pkts_needed = -1;
/* Go through all 24 bits in the mask, and check if we have
all but one of the media packets */
for(i = 0; i < 24; i++) {
/* If the packet is here and in the mask, increment counter */
if(A[i+fec_pkt->snbase] && fec_pkt->mask[i]) pkts_present++;
/* Count the number of packets needed as well */
if(fec_pkt->mask[i]) pkts_needed++;
Rosenberg & Schulzrinne Standards Track [Page 13]
^L
RFC 2733 Generic FEC December 1999
/* The packet to recover is the one with a bit in the
mask that's not here yet */
if(!A[i+fec_pkt->snbase] && fec_pkt->mask[i])
pkt_to_recover = i+fec_pkt->snbase;
}
/* If we can recover, do so. Otherwise, return NULL */
if(pkts_present == pkts_needed) {
data_pkt = recover_packet(pkt_to_recover, fec_pkt);
} else {
data_pkt = NULL;
}
return(data_pkt);
}
void fec_recovery() {
packet *p, /* packet received or regenerated */
*fecp, /* fec packet from pending list */
*pnew; /* new packets recovered */
while(1) {
p = wait_for_packet(); /* get packet from network */
while(p) {
/* if it's an FEC packet, try to recover with it. If we can't,
store it for later potential use. If we can recover, act as
if the recovered packet is received and try to recover some
more. Otherwise, if it's a data packet, mark it as received,
and check if we can now recover a data packet with the list
of pending FEC packets */
if(p->fec == TRUE) {
pnew = recover_with_fec(p);
if(pnew)
A[pnew->sn] = TRUE;
else
add_fec_to_pending_list(p);
/* We assign pnew to p since the while loop will continue
to recover based on p not being NULL */
Rosenberg & Schulzrinne Standards Track [Page 14]
^L
RFC 2733 Generic FEC December 1999
p = pnew;
} else {
/* Mark this data packet as here */
A[p->sn] = TRUE;
free(p);
p = NULL;
/* Go through pending list. Try and recover a packet using
each FEC. If we are successful, add the data packet to
the list of received packets, remove the FEC packet from
the pending list, since we've used it, and then try to
recover some more */
for(fecp = pending_list; fecp != NULL; fecp = fecp->next) {
pnew = recover_with_fec(fecp);
if(pnew) {
/* The packet is now here, as we've recovered it */
A[pnew->sn] = TRUE;
/* One FEC packet can only be used once to recover,
so remove it from the pending list */
remove_fec_from_pending_list(fecp);
p = pnew;
break;
}
} /*for*/
} /*p->fec was false */
} /* while p*/
} /* while 1 */
}
Rosenberg & Schulzrinne Standards Track [Page 15]
^L
RFC 2733 Generic FEC December 1999
9 Example
Consider 2 media packets to be sent, x and y, from SSRC 2. Their
sequence numbers are 8 and 9, respectively, with timestamps of 3 and
5, respectively. Packet x uses payload type 11, and packet y uses
payload type 18. Packet x is has 10 bytes of payload, and packet y
11. Packet y has its marker bit set. The RTP headers for packets x
and y are shown in Figures 3 and 4 respectively.
Media Packet x
0 1 2 3
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 0|0|0|0 0 0 0|0|0 0 0 1 0 1 1|0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version: 2
Padding: 0
Extension: 0
Marker: 0
PTI: 11
SN: 8
TS: 3
SSRC: 2
Figure 3: RTP Header for Media Packet X
An FEC packet is generated from these two. We assume that payload
type 127 is used to indicate an FEC packet. The resulting RTP header
is shown in Figure 5.
The FEC header in the FEC packet is shown in Figure 6.
Rosenberg & Schulzrinne Standards Track [Page 16]
^L
RFC 2733 Generic FEC December 1999
11 Use with Redundant Encodings
One can consider an FEC packet as a "redundant coding" of the media.
Media Packet y
0 1 2 3
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 0|0|0|0 0 0 0|1|0 0 1 0 0 1 0|0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version: 2
Padding: 0
Extension: 0
Marker: 1
PTI: 18
SN: 9
TS: 5
SSRC: 2
Figure 4: RTP Header for Media Packet Y
Because of this, the payload format for encoding of redundant audio
data [5] can be used to carry the FEC data along with the media. The
procedure for this is as follows.
The FEC operation defined above acts on a stream of RTP media
packets. The stream which is operated on is the stream before the
encapsulation defined in RFC 2198 [5]. In other words, the media
stream to be protected is encapsulated in standard RTP media packets.
The FEC operation above is performed (with one minor change),
generating a stream of FEC packets. The change to the procedure above
is that if the RTP packets being protected contain an RTP extension,
padding, or a CSRC list, these MUST be removed from the packets, and
the CC field, Padding Bit, and Extension but MUST be set to zero,
before the FEC operation is applied. These modified packets are used
in the procedure above. Note that the sender MUST still send the
original packets (with the CSRC list, padding, and extension in tact)
as the primary encoding in RFC 2198. The removal of these fields only
applies to the protection operation.
Rosenberg & Schulzrinne Standards Track [Page 17]
^L
RFC 2733 Generic FEC December 1999
Once the FEC packets have been generated, the media payload is
extracted from the media packets. This payload is used as the primary
encoding as defined in RFC 2198. Then, the FEC header and payload of
the FEC packets is extracted, and treated as a redundant encoding.
Additional redundant encodings, besides FEC, MAY be added to the
packet as well. These encodings will not be protected by FEC,
however.
0 1 2 3
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 0|0|0|0 0 0 0|1|1 1 1 1 1 1 1|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version: 2
Padding: 0
Extension: 0
Marker: 1
PTI: 127
SN: 1
TS: 5
SSRC: 2
Figure 5: RTP Header of FEC for Packets X and Y
The redundant encodings header for the primary codec is set as
defined in RFC 2198. The redundant encodings header for the FEC data
is set as follows. The block PT is set to the dynamic PT associated
with the FEC format. The block length is set to the sum of the
lengths of the FEC header and payload. The timestamp offset SHOULD be
set to zero. The secondary coder payload includes the FEC header and
FEC payload.
At the receiver, the primary codec and all secondary codecs are
extracted as separate RTP packets. This is done by copying the
sequence number, SSRC, marker bit, CC field, RTP version, and
extension bit from the RTP header of the redundant encodings packet
to the RTP header of each extracted packet. If the secondary codec
contains FEC, the CC field, Extension Bit, and Padding Bit in the RTP
header of the FEC packet MUST be set to zero instead. The payload
type identifier in the extracted packet is copied from the block PT
of the redundant encodings header. The timestamp of the extracted
packet is the difference between the timestamp in the RTP header and
Rosenberg & Schulzrinne Standards Track [Page 18]
^L
RFC 2733 Generic FEC December 1999
the offset in the block header. The payload of the extracted packet
is the data block. This will result in the FEC stream and media
stream being extracted.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0 0 1 1 0 0 1|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
SN base: 8 [min(8,9)]
len. rec.: 1 [8 xor 9]
E: 0
PTI rec.: 25 [11 xor 18]
mask: 3
TS rec.: 6 [3 xor 5]
The payload length is 11 bytes.
Figure 6: FEC Header of Result
To use the FEC and media packets for recovery, the CSRC list,
extension, and padding MUST be removed from the media packets, if
present, and the CC field, Extension Bit, and Padding Bit MUST be set
to zero. These modified media packets, along with the FEC packets,
are then used to recover based on the procedures in section 8. The
recovered media packets will always have no extension, padding, or
CSRC list. An implementation MAY copy these fields into the recovered
packet from another media packet, if available.
Using the redundant encodings payload format also implies that the
marker bit may not be recovered correctly. Applications MUST set the
marker bit to zero in media packets reconstructed using FEC
encapsulated in RFC 2198 redundancy.
An advantage of this approach is a reduction in the overhead for
sending FEC packets.
Rosenberg & Schulzrinne Standards Track [Page 19]
^L
RFC 2733 Generic FEC December 1999
11 Indicating FEC Usage in SDP
FEC packets contain RTP packets with dynamic payload type values. In
addition, the FEC packets can be sent on separate multicast groups or
separate ports from the media. The FEC can even be carried in packets
containing media, using the redundant encodings payload format [5].
These configuration options must be indicated out of band. This
section describes how this can be accomplished using the Session
Description Protocol (SDP), specified in RFC 2327 [6].
11.1 FEC as a Separate Stream
In the first case, the FEC packets are sent as a separate stream.
This can mean they are sent on a different port and/or multicast
group from the media. When this is done, several pieces of
information must be conveyed:
o The address and port where the FEC is being sent to
o The payload type number for the FEC
o Which media stream the FEC is protecting
The payload type number for the FEC is conveyed in the m line of the
media it is protecting, listed as if it were another valid encoding
for the stream. There is no static payload type assignment for FEC,
so dynamic payload type numbers MUST be used. The binding to the
number is indicated by an rtpmap attribute. The name used in this
binding is "parityfec".
The presence of the payload type number in the m line of the media it
is protecting does not mean the FEC is sent to the same address and
port as the media. Instead, this information is conveyed through an
fmtp attribute line. The presence of the FEC payload type on the m
line of the media serves only to indicate which stream the FEC is
protecting.
The format for the fmtp line for FEC is:
a=fmtp:<number> <port> <network type> <addresss type> <connection
address>
where 'number' is the payload type number present in the m line. Port
is the port number where the FEC is sent to. The remaining three
items - network type, address type, and connection address - have the
same syntax and semantics as the c line from SDP. This allows the
fmtp line to be partially parsed by the same parser used on the c
Rosenberg & Schulzrinne Standards Track [Page 20]
^L
RFC 2733 Generic FEC December 1999
lines. Note that since FEC cannot be hierarchically encoded, the
<number of addresses> parameter MUST NOT appear in the connection
address.
The following is an example SDP for FEC:
v=0
o=hamming 2890844526 2890842807 IN IP4 126.16.64.4
s=FEC Seminar
c=IN IP4 224.2.17.12/127
t=0 0
m=audio 49170 RTP/AVP 0 78
a=rtpmap:78 parityfec/8000
a=fmtp:78 49172 IN IP4 224.2.17.12/127
m=video 51372 RTP/AVP 31 79
a=rtpmap:79 parityfec/8000
a=fmtp:79 51372 IN IP4 224.2.17.13/127
The presence of two m lines in this SDP indicates that there are two
media streams - one audio and one video. The media format of 0
indicates that the audio uses PCM, and is protected by FEC with
payload type number 78. The FEC is sent to the same multicast group
and TTL as the audio, but on a port number two higher (49172). The
video is protected by FEC with payload type number 79. The FEC
appears on the same port as the video (51372), but on a different
multicast address.
11.2 Use with Redundant Encodings
When the FEC stream is being sent as a secondary codec in the
redundant encodings format, this must be signaled through SDP. To do
this, the procedures defined in RFC 2198 are used to signal the use
of redundant encodings. The FEC payload type is indicated in the same
fashion as any other secondary codec. An rtpmap attribute MUST be
used to indicate a dynamic payload type number for the FEC packets.
The FEC MUST protect only the main codec. In this case, the fmtp
attribute for the FEC MUST NOT be present.
For example:
m=audio 12345 RTP/AVP 121 0 5 100
a=rtpmap:121 red/8000/1
a=rtpmap:100 parityfec/8000
a=fmtp:121 0/5/100
Rosenberg & Schulzrinne Standards Track [Page 21]
^L
RFC 2733 Generic FEC December 1999
This SDP indicates that there is a single audio stream, which can
consist of PCM (media format 0) , DVI (media format 5), the redundant
encodings (indicated by media format 121, which is bound to red
through the rtpmap attribute), or FEC (media format 100, which is
bound to parityfec through the rtpmap attribute). Although the FEC
format is specified as a possible coding for this stream, the FEC
MUST NOT be sent by itself for this stream. Its presence in the m
line is required only because non-primary codecs must be listed here
according to RFC 2198. The fmtp attribute indicates that the
redundant encodings format can be used, with DVI as a secondary
coding and FEC as a tertiary encoding.
11.3 Usage with RTSP
RTSP [7] can be used to request FEC packets to be sent as a separate
stream. When SDP is used with RTSP, the Session Description does not
include a connection address and port number for each stream.
Instead, RTSP uses the concept of a "Control URL". Control URLs are
used in SDP in two distinct ways.
1. There is a single control URL for all streams. This is
referred to as "aggregate control". In this case, the fmtp
line for the FEC stream is omitted.
2. There is a Control URL assigned to each stream. This is
referred to as "non-aggregate control". In this case, the
fmtp line specifies the Control URL for the stream of FEC
packets. The URL may be used in a SETUP command by an RTSP
client.
The format for the fmtp line for FEC with RTSP and non-aggregate
control is:
a=fmtp:<number> <control URL>
where 'number' is the payload type number present in the m line.
Control URL is the URL used to control the stream of FEC packets.
Note that the Control URL does not need to be an absolute URL. The
rules for converting a relative Control URL to an absolute URL are
given in RFC 2326, Section C.1.1.
Rosenberg & Schulzrinne Standards Track [Page 22]
^L
RFC 2733 Generic FEC December 1999
12 Security Considerations
The use of FEC has implications on the usage and changing of keys for
encryption. As the FEC packets do consist of a separate stream, there
are a number of permutations on the usage of encryption. In
particular:
o The FEC stream may be encrypted, while the media stream is
not.
o The media stream may be encrypted, while the FEC stream is
not.
o The media stream and FEC stream are both encrypted, but using
different keys.
o The media stream and FEC stream are both encrypted, but using
the same key.
The first three of these would require any application level
signaling protocols to be aware of the usage of FEC, and to thus
exchange keys for it and negotiate its usage on the media and FEC
streams separately. In the final case, no such additional mechanisms
are needed. The first two cases present a layering violation, as FEC
packets should really be treated no differently than other RTP
packets. Encrypting just one may also make certain known-plaintext
attacks possible. For these reasons, applications utilizing
encryption SHOULD encrypt both streams.
However, the changing of keys becomes problematic. For example, if
two packets a and b are sent, and FEC packet f(a,b) is sent, and the
keys used for a and b are different, which key should be used to
decode f(a,b)? In general, old keys will likely need to be cached, so
that when the keys change for the media stream, the old key is kept,
and used, until it is determined that the key has changed on the FEC
packets as well.
Another issue with the use of FEC is its impact on network
congestion. Adding FEC in the face of increasing network losses is a
bad idea, as it can lead to increased congestion and eventual
congestion collapse if done on a widespread basis. As a result,
implementers MUST NOT substantially increase the amount of FEC in use
as network losses increase.
Rosenberg & Schulzrinne Standards Track [Page 23]
^L
RFC 2733 Generic FEC December 1999
13 Acknowledgments
This work is based on an earlier draft on FEC, submitted by Budge and
Mackenzie in 1997. We would also like to thank Steve Casner, Mark
Handley, Orion Hodson and Colin Perkins for their comments. Thanks to
Anders Klemets who wrote the section on usage with RTSP.
14 Authors' Addresses
Jonathan Rosenberg
dynamicsoft
200 Executive Drive
Suite 120
West Orange, NJ 07046
Email: jdrosen@dynamicsoft.com
Henning Schulzrinne
Columbia University
M/S 0401, 1214 Amsterdam Ave.
New York, NY 10027-7003
EMail: schulzrinne@cs.columbia.edu
Rosenberg & Schulzrinne Standards Track [Page 24]
^L
RFC 2733 Generic FEC December 1999
15 Bibliography
[1] J.C. Bolot and A. V. Garcia, "Control mechanisms for packet audio
in the internet," in Proceedings of the Conference on Computer
Communications (IEEE Infocom) , (San Francisco, California), Mar.
1996.
[2] Perkins, C. and O. Hodson, "Options for Repair of Streaming
media", RFC 2354, June 1998.
[3] Schulzrinne, H., Casner, S., Frederick, R. and V. Jacobson, "RTP:
A Transport Protocol for Real-Time Applications", RFC 1889,
January 1996.
[4] Bradner, S., "Key words for use in RFCs to indicate requirement
levels", BCP 14, RFC 2119, March 1997.
[5] Perkins, C., Kouvelas, I., Hodson, O., Hardman, V., Handley, M.,
Bolot, J.C., Vega-Garcia, A. and S. Fosse-Parisis, "RTP Payload
for Redundant Audio Data", RFC 2198, September 1997.
[6] Handley, M. and V. Jacobson, "SDP: Session Description Protocol",
RFC 2327, April 1998.
[7] Schulzrinne, H., Rao, A. and R. Lanphier, "Real Time Streaming
Protocol (RTSP)", RFC 2326, April 1998.
Rosenberg & Schulzrinne Standards Track [Page 25]
^L
RFC 2733 Generic FEC December 1999
16. Full Copyright Statement
Copyright (C) The Internet Society (1999). All Rights Reserved.
This document and translations of it may be copied and furnished to
others, and derivative works that comment on or otherwise explain it
or assist in its implementation may be prepared, copied, published
and distributed, in whole or in part, without restriction of any
kind, provided that the above copyright notice and this paragraph are
included on all such copies and derivative works. However, this
document itself may not be modified in any way, such as by removing
the copyright notice or references to the Internet Society or other
Internet organizations, except as needed for the purpose of
developing Internet standards in which case the procedures for
copyrights defined in the Internet Standards process must be
followed, or as required to translate it into languages other than
English.
The limited permissions granted above are perpetual and will not be
revoked by the Internet Society or its successors or assigns.
This document and the information contained herein is provided on an
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Acknowledgement
Funding for the RFC Editor function is currently provided by the
Internet Society.
Rosenberg & Schulzrinne Standards Track [Page 26]
^L
|