winlin

fix #467, support write log to kafka. 3.0.6

@@ -259,7 +259,7 @@ The `features`, `compare`, `release` and `performance` of SRS. @@ -259,7 +259,7 @@ The `features`, `compare`, `release` and `performance` of SRS.
259 1. Support NGINX-RTMP style EXEC, read [#367][bug #367]. 259 1. Support NGINX-RTMP style EXEC, read [#367][bug #367].
260 1. Support NGINX-RTMP style dvr control module, read [#459][bug #459]. 260 1. Support NGINX-RTMP style dvr control module, read [#459][bug #459].
261 1. Support HTTP Security Raw Api, read [#459][bug #459], [#470][bug #470], [#319][bug #319]. 261 1. Support HTTP Security Raw Api, read [#459][bug #459], [#470][bug #470], [#319][bug #319].
262 -1. [dev]Support Integration with Kafka/Spark Big-Data system, read [#467][bug #467]. 262 +1. Support Integration with Kafka/Spark Big-Data system, read [#467][bug #467].
263 1. [plan]Support Origin Cluster for Load Balance and Fault Tolarence, read [#464][bug #464], [RTMP 302][bug #92]. 263 1. [plan]Support Origin Cluster for Load Balance and Fault Tolarence, read [#464][bug #464], [RTMP 302][bug #92].
264 1. [plan]Support H.265, push RTMP with H.265, delivery in HLS, read [#465][bug #465]. 264 1. [plan]Support H.265, push RTMP with H.265, delivery in HLS, read [#465][bug #465].
265 1. [plan]Support MPEG-DASH, the future streaming protocol, read [#299][bug #299]. 265 1. [plan]Support MPEG-DASH, the future streaming protocol, read [#299][bug #299].
@@ -386,6 +386,7 @@ Remark: @@ -386,6 +386,7 @@ Remark:
386 386
387 ### History 387 ### History
388 388
  389 +* v3.0, 2015-10-23, fix [#467][bug #467], support write log to kafka. 3.0.6
389 * v3.0, 2015-10-20, fix [#502][bug #502], support snapshot with http-callback or transcoder. 3.0.5 390 * v3.0, 2015-10-20, fix [#502][bug #502], support snapshot with http-callback or transcoder. 3.0.5
390 * v3.0, 2015-09-19, support amf0 and json to convert with each other. 391 * v3.0, 2015-09-19, support amf0 and json to convert with each other.
391 * v3.0, 2015-09-19, json objects support dumps to string. 392 * v3.0, 2015-09-19, json objects support dumps to string.
@@ -1279,6 +1280,7 @@ Winlin @@ -1279,6 +1280,7 @@ Winlin
1279 [bug #466]: https://github.com/simple-rtmp-server/srs/issues/466 1280 [bug #466]: https://github.com/simple-rtmp-server/srs/issues/466
1280 [bug #468]: https://github.com/simple-rtmp-server/srs/issues/468 1281 [bug #468]: https://github.com/simple-rtmp-server/srs/issues/468
1281 [bug #502]: https://github.com/simple-rtmp-server/srs/issues/502 1282 [bug #502]: https://github.com/simple-rtmp-server/srs/issues/502
  1283 +[bug #467]: https://github.com/simple-rtmp-server/srs/issues/467
1282 [bug #xxxxxxx]: https://github.com/simple-rtmp-server/srs/issues/xxxxxxx 1284 [bug #xxxxxxx]: https://github.com/simple-rtmp-server/srs/issues/xxxxxxx
1283 1285
1284 [r2.0a2]: https://github.com/simple-rtmp-server/srs/releases/tag/v2.0-a2 1286 [r2.0a2]: https://github.com/simple-rtmp-server/srs/releases/tag/v2.0-a2
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR 3 32 #define VERSION_MAJOR 3
33 #define VERSION_MINOR 0 33 #define VERSION_MINOR 0
34 -#define VERSION_REVISION 5 34 +#define VERSION_REVISION 6
35 35
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "SRS" 37 #define RTMP_SIG_SRS_KEY "SRS"
@@ -39,17 +39,27 @@ ISrsCodec::~ISrsCodec() @@ -39,17 +39,27 @@ ISrsCodec::~ISrsCodec()
39 39
40 SrsBuffer::SrsBuffer() 40 SrsBuffer::SrsBuffer()
41 { 41 {
42 - p = bytes = NULL;  
43 - nb_bytes = 0;  
44 -  
45 - // TODO: support both little and big endian.  
46 - srs_assert(srs_is_little_endian()); 42 + set_value(NULL, 0);
  43 +}
  44 +
  45 +SrsBuffer::SrsBuffer(char* b, int nb_b)
  46 +{
  47 + set_value(b, nb_b);
47 } 48 }
48 49
49 SrsBuffer::~SrsBuffer() 50 SrsBuffer::~SrsBuffer()
50 { 51 {
51 } 52 }
52 53
  54 +void SrsBuffer::set_value(char* b, int nb_b)
  55 +{
  56 + p = bytes = b;
  57 + nb_bytes = nb_b;
  58 +
  59 + // TODO: support both little and big endian.
  60 + srs_assert(srs_is_little_endian());
  61 +}
  62 +
53 int SrsBuffer::initialize(char* b, int nb) 63 int SrsBuffer::initialize(char* b, int nb)
54 { 64 {
55 int ret = ERROR_SUCCESS; 65 int ret = ERROR_SUCCESS;
@@ -98,7 +98,10 @@ private: @@ -98,7 +98,10 @@ private:
98 int nb_bytes; 98 int nb_bytes;
99 public: 99 public:
100 SrsBuffer(); 100 SrsBuffer();
  101 + SrsBuffer(char* b, int nb_b);
101 virtual ~SrsBuffer(); 102 virtual ~SrsBuffer();
  103 +private:
  104 + virtual void set_value(char* b, int nb_b);
102 public: 105 public:
103 /** 106 /**
104 * initialize the stream from bytes. 107 * initialize the stream from bytes.
@@ -2141,7 +2141,7 @@ int SrsTsPayloadPSI::decode(SrsBuffer* stream, SrsTsMessage** /*ppmsg*/) @@ -2141,7 +2141,7 @@ int SrsTsPayloadPSI::decode(SrsBuffer* stream, SrsTsMessage** /*ppmsg*/)
2141 CRC_32 = stream->read_4bytes(); 2141 CRC_32 = stream->read_4bytes();
2142 2142
2143 // verify crc32. 2143 // verify crc32.
2144 - int32_t crc32 = srs_crc32(ppat, stream->pos() - pat_pos - 4); 2144 + int32_t crc32 = srs_crc32_mpegts(ppat, stream->pos() - pat_pos - 4);
2145 if (crc32 != CRC_32) { 2145 if (crc32 != CRC_32) {
2146 ret = ERROR_STREAM_CASTER_TS_CRC32; 2146 ret = ERROR_STREAM_CASTER_TS_CRC32;
2147 srs_error("ts: verify PSI crc32 failed. ret=%d", ret); 2147 srs_error("ts: verify PSI crc32 failed. ret=%d", ret);
@@ -2238,7 +2238,7 @@ int SrsTsPayloadPSI::encode(SrsBuffer* stream) @@ -2238,7 +2238,7 @@ int SrsTsPayloadPSI::encode(SrsBuffer* stream)
2238 srs_error("ts: mux PSI crc32 failed. ret=%d", ret); 2238 srs_error("ts: mux PSI crc32 failed. ret=%d", ret);
2239 return ret; 2239 return ret;
2240 } 2240 }
2241 - CRC_32 = srs_crc32(ppat, stream->pos() - pat_pos); 2241 + CRC_32 = srs_crc32_mpegts(ppat, stream->pos() - pat_pos);
2242 stream->write_4bytes(CRC_32); 2242 stream->write_4bytes(CRC_32);
2243 2243
2244 return ret; 2244 return ret;
@@ -535,85 +535,163 @@ bool srs_aac_startswith_adts(SrsBuffer* stream) @@ -535,85 +535,163 @@ bool srs_aac_startswith_adts(SrsBuffer* stream)
535 return true; 535 return true;
536 } 536 }
537 537
538 -/*  
539 - * MPEG2 transport stream (aka DVB) mux  
540 - * Copyright (c) 2003 Fabrice Bellard.  
541 - *  
542 - * This library is free software; you can redistribute it and/or  
543 - * modify it under the terms of the GNU Lesser General Public  
544 - * License as published by the Free Software Foundation; either  
545 - * version 2 of the License, or (at your option) any later version.  
546 - *  
547 - * This library is distributed in the hope that it will be useful,  
548 - * but WITHOUT ANY WARRANTY; without even the implied warranty of  
549 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  
550 - * Lesser General Public License for more details.  
551 - *  
552 - * You should have received a copy of the GNU Lesser General Public  
553 - * License along with this library; if not, write to the Free Software  
554 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  
555 - */  
556 -static const u_int32_t crc_table[256] = {  
557 - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,  
558 - 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,  
559 - 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,  
560 - 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,  
561 - 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,  
562 - 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,  
563 - 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,  
564 - 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,  
565 - 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,  
566 - 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,  
567 - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,  
568 - 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,  
569 - 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,  
570 - 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,  
571 - 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,  
572 - 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,  
573 - 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,  
574 - 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,  
575 - 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,  
576 - 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,  
577 - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,  
578 - 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,  
579 - 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,  
580 - 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,  
581 - 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,  
582 - 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,  
583 - 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,  
584 - 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,  
585 - 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,  
586 - 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,  
587 - 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,  
588 - 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,  
589 - 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,  
590 - 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,  
591 - 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,  
592 - 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,  
593 - 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,  
594 - 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,  
595 - 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,  
596 - 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,  
597 - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,  
598 - 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,  
599 - 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4  
600 -};  
601 -  
602 // @see http://www.stmc.edu.hk/~vincent/ffmpeg_0.4.9-pre1/libavformat/mpegtsenc.c 538 // @see http://www.stmc.edu.hk/~vincent/ffmpeg_0.4.9-pre1/libavformat/mpegtsenc.c
603 -unsigned int mpegts_crc32(const u_int8_t *data, int len) 539 +unsigned int __mpegts_crc32(const u_int8_t *data, int len)
604 { 540 {
605 - register int i;  
606 - unsigned int crc = 0xffffffff;  
607 -  
608 - for (i=0; i<len; i++)  
609 - crc = (crc << 8) ^ crc_table[((crc >> 24) ^ *data++) & 0xff]; 541 + /*
  542 + * MPEG2 transport stream (aka DVB) mux
  543 + * Copyright (c) 2003 Fabrice Bellard.
  544 + *
  545 + * This library is free software; you can redistribute it and/or
  546 + * modify it under the terms of the GNU Lesser General Public
  547 + * License as published by the Free Software Foundation; either
  548 + * version 2 of the License, or (at your option) any later version.
  549 + *
  550 + * This library is distributed in the hope that it will be useful,
  551 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  552 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  553 + * Lesser General Public License for more details.
  554 + *
  555 + * You should have received a copy of the GNU Lesser General Public
  556 + * License along with this library; if not, write to the Free Software
  557 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  558 + */
  559 + static const u_int32_t table[256] = {
  560 + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
  561 + 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
  562 + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
  563 + 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
  564 + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
  565 + 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
  566 + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
  567 + 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
  568 + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
  569 + 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
  570 + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
  571 + 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
  572 + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
  573 + 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
  574 + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
  575 + 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
  576 + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
  577 + 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
  578 + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
  579 + 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
  580 + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
  581 + 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
  582 + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
  583 + 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
  584 + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
  585 + 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
  586 + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
  587 + 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
  588 + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
  589 + 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
  590 + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
  591 + 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
  592 + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
  593 + 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
  594 + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
  595 + 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
  596 + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
  597 + 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
  598 + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
  599 + 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
  600 + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
  601 + 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
  602 + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
  603 + };
  604 +
  605 + u_int32_t crc = 0xffffffff;
  606 +
  607 + for (int i=0; i<len; i++) {
  608 + crc = (crc << 8) ^ table[((crc >> 24) ^ *data++) & 0xff];
  609 + }
610 610
611 return crc; 611 return crc;
612 } 612 }
613 613
614 -u_int32_t srs_crc32(const void* buf, int size) 614 +// @see https://github.com/ETrun/crc32/blob/master/crc32.c
  615 +u_int32_t __crc32_ieee(u_int32_t init, const u_int8_t* buf, size_t nb_buf)
  616 +{
  617 + /*----------------------------------------------------------------------------*\
  618 + * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29.
  619 + *
  620 + * This program generates the CRC-32 values for the files named in the
  621 + * command-line arguments. These are the same CRC-32 values used by GZIP,
  622 + * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and
  623 + * used independently.
  624 + *
  625 + * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE.
  626 + *
  627 + * Based on the byte-oriented implementation "File Verification Using CRC"
  628 + * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67.
  629 + *
  630 + * v1.0.0: original release.
  631 + * v1.0.1: fixed printf formats.
  632 + * v1.0.2: fixed something else.
  633 + * v1.0.3: replaced CRC constant table by generator function.
  634 + * v1.0.4: reformatted code, made ANSI C. 1994-12-05.
  635 + * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29.
  636 + * v2.1.0: modified by Nico, 2013-04-20
  637 + \*----------------------------------------------------------------------------*/
  638 + static const u_int32_t table[256] = {
  639 + 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,
  640 + 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,
  641 + 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,
  642 + 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,
  643 + 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4,
  644 + 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,
  645 + 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC,
  646 + 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,
  647 + 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,
  648 + 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,
  649 + 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,
  650 + 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,
  651 + 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA,
  652 + 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE,
  653 + 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A,
  654 + 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
  655 + 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,
  656 + 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,
  657 + 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,
  658 + 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,
  659 + 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268,
  660 + 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0,
  661 + 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8,
  662 + 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,
  663 + 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,
  664 + 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,
  665 + 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,
  666 + 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,
  667 + 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,
  668 + 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242,
  669 + 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,
  670 + 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
  671 + 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,
  672 + 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,
  673 + 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,
  674 + 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,
  675 + 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D
  676 + };
  677 +
  678 + u_int32_t crc = init ^ 0xFFFFFFFF;
  679 +
  680 + for (int i = 0; i < nb_buf; i++) {
  681 + crc = table[(crc ^ buf[i]) & 0xff] ^ (crc >> 8);
  682 + }
  683 +
  684 + return crc^0xFFFFFFFF;
  685 +}
  686 +
  687 +u_int32_t srs_crc32_mpegts(const void* buf, int size)
  688 +{
  689 + return __mpegts_crc32((const u_int8_t*)buf, size);
  690 +}
  691 +
  692 +u_int32_t srs_crc32_ieee(const void* buf, int size, u_int32_t previous)
615 { 693 {
616 - return mpegts_crc32((const u_int8_t*)buf, size); 694 + return __crc32_ieee(previous, (const u_int8_t*)buf, size);
617 } 695 }
618 696
619 /* 697 /*
@@ -122,9 +122,14 @@ extern bool srs_avc_startswith_annexb(SrsBuffer* stream, int* pnb_start_code = N @@ -122,9 +122,14 @@ extern bool srs_avc_startswith_annexb(SrsBuffer* stream, int* pnb_start_code = N
122 extern bool srs_aac_startswith_adts(SrsBuffer* stream); 122 extern bool srs_aac_startswith_adts(SrsBuffer* stream);
123 123
124 /** 124 /**
125 -* cacl the crc32 of bytes in buf.  
126 -*/  
127 -extern u_int32_t srs_crc32(const void* buf, int size); 125 +* cacl the crc32 of bytes in buf, for ffmpeg.
  126 + */
  127 +extern u_int32_t srs_crc32_mpegts(const void* buf, int size);
  128 +
  129 +/**
  130 + * calc the crc32 of bytes in buf by IEEE, for zip.
  131 + */
  132 +extern u_int32_t srs_crc32_ieee(const void* buf, int size, u_int32_t previous = 0);
128 133
129 /** 134 /**
130 * Decode a base64-encoded string. 135 * Decode a base64-encoded string.
@@ -158,20 +158,30 @@ int SrsKafkaString::decode(SrsBuffer* buf) @@ -158,20 +158,30 @@ int SrsKafkaString::decode(SrsBuffer* buf)
158 SrsKafkaBytes::SrsKafkaBytes() 158 SrsKafkaBytes::SrsKafkaBytes()
159 { 159 {
160 _size = -1; 160 _size = -1;
161 - data = NULL; 161 + _data = NULL;
162 } 162 }
163 163
164 SrsKafkaBytes::SrsKafkaBytes(const char* v, int nb_v) 164 SrsKafkaBytes::SrsKafkaBytes(const char* v, int nb_v)
165 { 165 {
166 _size = -1; 166 _size = -1;
167 - data = NULL; 167 + _data = NULL;
168 168
169 set_value(v, nb_v); 169 set_value(v, nb_v);
170 } 170 }
171 171
172 SrsKafkaBytes::~SrsKafkaBytes() 172 SrsKafkaBytes::~SrsKafkaBytes()
173 { 173 {
174 - srs_freep(data); 174 + srs_freep(_data);
  175 +}
  176 +
  177 +char* SrsKafkaBytes::data()
  178 +{
  179 + return _data;
  180 +}
  181 +
  182 +int SrsKafkaBytes::size()
  183 +{
  184 + return _size;
175 } 185 }
176 186
177 bool SrsKafkaBytes::null() 187 bool SrsKafkaBytes::null()
@@ -192,14 +202,29 @@ void SrsKafkaBytes::set_value(string v) @@ -192,14 +202,29 @@ void SrsKafkaBytes::set_value(string v)
192 void SrsKafkaBytes::set_value(const char* v, int nb_v) 202 void SrsKafkaBytes::set_value(const char* v, int nb_v)
193 { 203 {
194 // free previous data. 204 // free previous data.
195 - srs_freep(data); 205 + srs_freep(_data);
196 206
197 // copy new value to data. 207 // copy new value to data.
198 _size = (int16_t)nb_v; 208 _size = (int16_t)nb_v;
199 209
200 srs_assert(_size > 0); 210 srs_assert(_size > 0);
201 - data = new char[_size];  
202 - memcpy(data, v, _size); 211 + _data = new char[_size];
  212 + memcpy(_data, v, _size);
  213 +}
  214 +
  215 +u_int32_t SrsKafkaBytes::crc32(u_int32_t previous)
  216 +{
  217 + char bsize[4];
  218 + SrsBuffer(bsize, 4).write_4bytes(_size);
  219 +
  220 + if (_size <= 0) {
  221 + return srs_crc32_ieee(bsize, 4, previous);
  222 + }
  223 +
  224 + u_int32_t crc = srs_crc32_ieee(bsize, 4, previous);
  225 + crc = srs_crc32_ieee(_data, _size, crc);
  226 +
  227 + return crc;
203 } 228 }
204 229
205 int SrsKafkaBytes::nb_bytes() 230 int SrsKafkaBytes::nb_bytes()
@@ -227,7 +252,7 @@ int SrsKafkaBytes::encode(SrsBuffer* buf) @@ -227,7 +252,7 @@ int SrsKafkaBytes::encode(SrsBuffer* buf)
227 srs_error("kafka encode bytes data failed. ret=%d", ret); 252 srs_error("kafka encode bytes data failed. ret=%d", ret);
228 return ret; 253 return ret;
229 } 254 }
230 - buf->write_bytes(data, _size); 255 + buf->write_bytes(_data, _size);
231 256
232 return ret; 257 return ret;
233 } 258 }
@@ -255,9 +280,9 @@ int SrsKafkaBytes::decode(SrsBuffer* buf) @@ -255,9 +280,9 @@ int SrsKafkaBytes::decode(SrsBuffer* buf)
255 return ret; 280 return ret;
256 } 281 }
257 282
258 - srs_freep(data);  
259 - data = new char[_size];  
260 - buf->read_bytes(data, _size); 283 + srs_freep(_data);
  284 + _data = new char[_size];
  285 + buf->read_bytes(_data, _size);
261 286
262 return ret; 287 return ret;
263 } 288 }
@@ -523,8 +548,13 @@ int SrsKafkaRawMessage::create(SrsJsonObject* obj) @@ -523,8 +548,13 @@ int SrsKafkaRawMessage::create(SrsJsonObject* obj)
523 // dumps the json to string. 548 // dumps the json to string.
524 value->set_value(obj->dumps()); 549 value->set_value(obj->dumps());
525 550
526 - // TODO: FIXME: implements it.  
527 - crc = 0; 551 + // crc32 message.
  552 + crc = srs_crc32_ieee(&magic_byte, 1);
  553 + crc = srs_crc32_ieee(&attributes, 1, crc);
  554 + crc = key->crc32(crc);
  555 + crc = value->crc32(crc);
  556 +
  557 + srs_info("crc32 message is %#x", crc);
528 558
529 message_size = raw_message_size(); 559 message_size = raw_message_size();
530 560
@@ -1143,13 +1173,17 @@ SrsKafkaProducerRequest::~SrsKafkaProducerRequest() @@ -1143,13 +1173,17 @@ SrsKafkaProducerRequest::~SrsKafkaProducerRequest()
1143 1173
1144 int SrsKafkaProducerRequest::nb_bytes() 1174 int SrsKafkaProducerRequest::nb_bytes()
1145 { 1175 {
1146 - return 2 + 4 + topics.nb_bytes(); 1176 + return SrsKafkaRequest::nb_bytes() + 2 + 4 + topics.nb_bytes();
1147 } 1177 }
1148 1178
1149 int SrsKafkaProducerRequest::encode(SrsBuffer* buf) 1179 int SrsKafkaProducerRequest::encode(SrsBuffer* buf)
1150 { 1180 {
1151 int ret = ERROR_SUCCESS; 1181 int ret = ERROR_SUCCESS;
1152 1182
  1183 + if ((ret = SrsKafkaRequest::encode(buf)) != ERROR_SUCCESS) {
  1184 + return ret;
  1185 + }
  1186 +
1153 if (!buf->require(2 + 4)) { 1187 if (!buf->require(2 + 4)) {
1154 ret = ERROR_KAFKA_CODEC_PRODUCER; 1188 ret = ERROR_KAFKA_CODEC_PRODUCER;
1155 srs_error("kafka encode producer failed. ret=%d", ret); 1189 srs_error("kafka encode producer failed. ret=%d", ret);
@@ -1169,6 +1203,10 @@ int SrsKafkaProducerRequest::decode(SrsBuffer* buf) @@ -1169,6 +1203,10 @@ int SrsKafkaProducerRequest::decode(SrsBuffer* buf)
1169 { 1203 {
1170 int ret = ERROR_SUCCESS; 1204 int ret = ERROR_SUCCESS;
1171 1205
  1206 + if ((ret = SrsKafkaRequest::decode(buf)) != ERROR_SUCCESS) {
  1207 + return ret;
  1208 + }
  1209 +
1172 if (!buf->require(2 + 4)) { 1210 if (!buf->require(2 + 4)) {
1173 ret = ERROR_KAFKA_CODEC_PRODUCER; 1211 ret = ERROR_KAFKA_CODEC_PRODUCER;
1174 srs_error("kafka decode producer failed. ret=%d", ret); 1212 srs_error("kafka decode producer failed. ret=%d", ret);
@@ -1445,7 +1483,12 @@ int SrsKafkaClient::write_messages(std::string topic, int32_t partition, vector< @@ -1445,7 +1483,12 @@ int SrsKafkaClient::write_messages(std::string topic, int32_t partition, vector<
1445 1483
1446 partitions->message_set_size = partitions->messages.nb_bytes(); 1484 partitions->message_set_size = partitions->messages.nb_bytes();
1447 1485
1448 - // TODO: FIXME: implements it. 1486 + // write to kafka cluster.
  1487 + if ((ret = protocol->send_and_free_message(req)) != ERROR_SUCCESS) {
  1488 + srs_error("kafka write producer message failed. ret=%d", ret);
  1489 + return ret;
  1490 + }
  1491 +
1449 return ret; 1492 return ret;
1450 } 1493 }
1451 1494
@@ -96,16 +96,19 @@ class SrsKafkaBytes : public ISrsCodec @@ -96,16 +96,19 @@ class SrsKafkaBytes : public ISrsCodec
96 { 96 {
97 private: 97 private:
98 int32_t _size; 98 int32_t _size;
99 - char* data; 99 + char* _data;
100 public: 100 public:
101 SrsKafkaBytes(); 101 SrsKafkaBytes();
102 SrsKafkaBytes(const char* v, int nb_v); 102 SrsKafkaBytes(const char* v, int nb_v);
103 virtual ~SrsKafkaBytes(); 103 virtual ~SrsKafkaBytes();
104 public: 104 public:
  105 + virtual char* data();
  106 + virtual int size();
105 virtual bool null(); 107 virtual bool null();
106 virtual bool empty(); 108 virtual bool empty();
107 virtual void set_value(std::string v); 109 virtual void set_value(std::string v);
108 virtual void set_value(const char* v, int nb_v); 110 virtual void set_value(const char* v, int nb_v);
  111 + virtual u_int32_t crc32(u_int32_t previous);
109 // interface ISrsCodec 112 // interface ISrsCodec
110 public: 113 public:
111 virtual int nb_bytes(); 114 virtual int nb_bytes();