📄 rfc2035.txt
字号:
RFC 2035 RTP Payload Format for JPEG Video October 1996 Decoders can, however, treat types 4/5 as types 2/3, simply reassembling the entire frame and then decoding.5. Security Considerations Security issues are not discussed in this memo.6. Authors' Addresses Lance M. Berc Systems Research Center Digital Equipment Corporation 130 Lytton Ave Palo Alto CA 94301 Phone: +1 415 853 2100 EMail: berc@pa.dec.com William C. Fenner Xerox PARC 3333 Coyote Hill Road Palo Alto, CA 94304 Phone: +1 415 812 4816 EMail: fenner@cmf.nrl.navy.mil Ron Frederick Xerox PARC 3333 Coyote Hill Road Palo Alto, CA 94304 Phone: +1 415 812 4459 EMail: frederick@parc.xerox.com Steven McCanne Lawrence Berkeley Laboratory M/S 46A-1123 One Cyclotron Road Berkeley, CA 94720 Phone: +1 510 486 7520 EMail: mccanne@ee.lbl.govBerc, et. al. Standards Track [Page 9]RFC 2035 RTP Payload Format for JPEG Video October 19967. References[1] ISO DIS 10918-1. Digital Compression and Coding of Continuous-tone Still Images (JPEG), CCITT Recommendation T.81.[2] William B. Pennebaker, Joan L. Mitchell, JPEG: Still Image Data Compression Standard, Van Nostrand Reinhold, 1993.[3] Gregory K. Wallace, The JPEG Sill Picture Compression Standard, Communications of the ACM, April 1991, Vol 34, No. 1, pp. 31-44.[4] The JPEG File Interchange Format. Maintained by C-Cube Microsys- tems, Inc., and available in ftp://ftp.uu.net/graphics/jpeg/jfif.ps.gz.[5] Tom Lane et. al., The Independent JPEG Group software JPEG codec. Source code available in ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v5.tar.gz.Berc, et. al. Standards Track [Page 10]RFC 2035 RTP Payload Format for JPEG Video October 1996Appendix A The following code can be used to create a quantization table from a Q factor:/* * Table K.1 from JPEG spec. */static const int jpeg_luma_quantizer[64] = { 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99};/* * Table K.2 from JPEG spec. */static const int jpeg_chroma_quantizer[64] = { 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99};/* * Call MakeTables with the Q factor and two int[64] return arrays */voidMakeTables(int q, u_char *lum_q, u_char *chr_q){ int i; int factor = q; if (q < 1) factor = 1; if (q > 99) factor = 99; if (q < 50) q = 5000 / factor; else q = 200 - factor*2;Berc, et. al. Standards Track [Page 11]RFC 2035 RTP Payload Format for JPEG Video October 1996 for (i=0; i < 64; i++) { int lq = ( jpeg_luma_quantizer[i] * q + 50) / 100; int cq = ( jpeg_chroma_quantizer[i] * q + 50) / 100; /* Limit the quantizers to 1 <= q <= 255 */ if ( lq < 1) lq = 1; else if ( lq > 255) lq = 255; lum_q[i] = lq; if ( cq < 1) cq = 1; else if ( cq > 255) cq = 255; chr_q[i] = cq; }}Appendix B The following routines can be used to create the JPEG marker segments corresponding to the table-specification data that is absent from the RTP/JPEG body.u_char lum_dc_codelens[] = { 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,};u_char lum_dc_symbols[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,};u_char lum_ac_codelens[] = { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d,};u_char lum_ac_symbols[] = { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,Berc, et. al. Standards Track [Page 12]RFC 2035 RTP Payload Format for JPEG Video October 1996 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,};u_char chm_dc_codelens[] = { 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,};u_char chm_dc_symbols[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,};u_char chm_ac_codelens[] = { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77,};u_char chm_ac_symbols[] = { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,};u_char *MakeQuantHeader(u_char *p, u_char *qt, int tableNo){Berc, et. al. Standards Track [Page 13]RFC 2035 RTP Payload Format for JPEG Video October 1996 *p++ = 0xff; *p++ = 0xdb; /* DQT */ *p++ = 0; /* length msb */ *p++ = 67; /* length lsb */ *p++ = tableNo; memcpy(p, qt, 64); return (p + 64);}u_char *MakeHuffmanHeader(u_char *p, u_char *codelens, int ncodes, u_char *symbols, int nsymbols, int tableNo, int tableClass){ *p++ = 0xff; *p++ = 0xc4; /* DHT */ *p++ = 0; /* length msb */ *p++ = 3 + ncodes + nsymbols; /* length lsb */ *p++ = tableClass << 4 | tableNo; memcpy(p, codelens, ncodes); p += ncodes; memcpy(p, symbols, nsymbols); p += nsymbols; return (p);}/* * Given an RTP/JPEG type code, q factor, width, and height, * generate a frame and scan headers that can be prepended * to the RTP/JPEG data payload to produce a JPEG compressed * image in interchange format (except for possible trailing * garbage and absence of an EOI marker to terminate the scan). */int MakeHeaders(u_char *p, int type, int q, int w, int h){ u_char *start = p; u_char lqt[64]; u_char cqt[64]; /* convert from blocks to pixels */ w <<= 3; h <<= 3; MakeTables(q, lqt, cqt); *p++ = 0xff; *p++ = 0xd8; /* SOI */ p = MakeQuantHeader(p, lqt, 0);Berc, et. al. Standards Track [Page 14]RFC 2035 RTP Payload Format for JPEG Video October 1996 p = MakeQuantHeader(p, cqt, 1); p = MakeHuffmanHeader(p, lum_dc_codelens, sizeof(lum_dc_codelens), lum_dc_symbols, sizeof(lum_dc_symbols), 0, 0); p = MakeHuffmanHeader(p, lum_ac_codelens, sizeof(lum_ac_codelens), lum_ac_symbols, sizeof(lum_ac_symbols), 0, 1); p = MakeHuffmanHeader(p, chm_dc_codelens, sizeof(chm_dc_codelens), chm_dc_symbols, sizeof(chm_dc_symbols), 1, 0); p = MakeHuffmanHeader(p, chm_ac_codelens, sizeof(chm_ac_codelens), chm_ac_symbols, sizeof(chm_ac_symbols), 1, 1); *p++ = 0xff; *p++ = 0xc0; /* SOF */ *p++ = 0; /* length msb */ *p++ = 17; /* length lsb */ *p++ = 8; /* 8-bit precision */ *p++ = h >> 8; /* height msb */ *p++ = h; /* height lsb */ *p++ = w >> 8; /* width msb */ *p++ = w; /* wudth lsb */ *p++ = 3; /* number of components */ *p++ = 0; /* comp 0 */ if (type == 0) *p++ = 0x21; /* hsamp = 2, vsamp = 1 */ else *p++ = 0x22; /* hsamp = 2, vsamp = 2 */ *p++ = 0; /* quant table 0 */ *p++ = 1; /* comp 1 */ *p++ = 0x11; /* hsamp = 1, vsamp = 1 */ *p++ = 1; /* quant table 1 */ *p++ = 2; /* comp 2 */ *p++ = 0x11; /* hsamp = 1, vsamp = 1 */ *p++ = 1; /* quant table 1 */ *p++ = 0xff; *p++ = 0xda; /* SOS */ *p++ = 0; /* length msb */ *p++ = 12; /* length lsb */ *p++ = 3; /* 3 components */ *p++ = 0; /* comp 0 */Berc, et. al. Standards Track [Page 15]RFC 2035 RTP Payload Format for JPEG Video October 1996 *p++ = 0; /* huffman table 0 */ *p++ = 1; /* comp 1 */ *p++ = 0x11; /* huffman table 1 */ *p++ = 2; /* comp 2 */ *p++ = 0x11; /* huffman table 1 */ *p++ = 0; /* first DCT coeff */ *p++ = 63; /* last DCT coeff */ *p++ = 0; /* sucessive approx. */ return (p - start);};Berc, et. al. Standards Track [Page 16]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -