From 9a473902530e35b41f6e0acfc4fe364d4d74d2d3 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 23 Oct 2015 14:21:10 +0800 Subject: [PATCH] fix #467, support write log to kafka. 3.0.6 --- README.md | 4 +- trunk/src/core/srs_core.hpp | 2 +- trunk/src/kernel/srs_kernel_buffer.cpp | 20 ++- trunk/src/kernel/srs_kernel_buffer.hpp | 3 + trunk/src/kernel/srs_kernel_ts.cpp | 4 +- trunk/src/kernel/srs_kernel_utility.cpp | 222 ++++++++++++++++-------- trunk/src/kernel/srs_kernel_utility.hpp | 11 +- trunk/src/protocol/srs_kafka_stack.cpp | 71 ++++++-- trunk/src/protocol/srs_kafka_stack.hpp | 5 +- 9 files changed, 243 insertions(+), 99 deletions(-) diff --git a/README.md b/README.md index 86c5306440..c5596ff139 100755 --- a/README.md +++ b/README.md @@ -259,7 +259,7 @@ The `features`, `compare`, `release` and `performance` of SRS. 1. Support NGINX-RTMP style EXEC, read [#367][bug #367]. 1. Support NGINX-RTMP style dvr control module, read [#459][bug #459]. 1. Support HTTP Security Raw Api, read [#459][bug #459], [#470][bug #470], [#319][bug #319]. -1. [dev]Support Integration with Kafka/Spark Big-Data system, read [#467][bug #467]. +1. Support Integration with Kafka/Spark Big-Data system, read [#467][bug #467]. 1. [plan]Support Origin Cluster for Load Balance and Fault Tolarence, read [#464][bug #464], [RTMP 302][bug #92]. 1. [plan]Support H.265, push RTMP with H.265, delivery in HLS, read [#465][bug #465]. 1. [plan]Support MPEG-DASH, the future streaming protocol, read [#299][bug #299]. @@ -386,6 +386,7 @@ Remark: ### History +* v3.0, 2015-10-23, fix [#467][bug #467], support write log to kafka. 3.0.6 * v3.0, 2015-10-20, fix [#502][bug #502], support snapshot with http-callback or transcoder. 3.0.5 * v3.0, 2015-09-19, support amf0 and json to convert with each other. * v3.0, 2015-09-19, json objects support dumps to string. @@ -1279,6 +1280,7 @@ Winlin [bug #466]: https://github.com/simple-rtmp-server/srs/issues/466 [bug #468]: https://github.com/simple-rtmp-server/srs/issues/468 [bug #502]: https://github.com/simple-rtmp-server/srs/issues/502 +[bug #467]: https://github.com/simple-rtmp-server/srs/issues/467 [bug #xxxxxxx]: https://github.com/simple-rtmp-server/srs/issues/xxxxxxx [r2.0a2]: https://github.com/simple-rtmp-server/srs/releases/tag/v2.0-a2 diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 56e43471b5..aa933d0183 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 3 #define VERSION_MINOR 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 // server info. #define RTMP_SIG_SRS_KEY "SRS" diff --git a/trunk/src/kernel/srs_kernel_buffer.cpp b/trunk/src/kernel/srs_kernel_buffer.cpp index a4b58e197e..96a04e8b0a 100644 --- a/trunk/src/kernel/srs_kernel_buffer.cpp +++ b/trunk/src/kernel/srs_kernel_buffer.cpp @@ -39,17 +39,27 @@ ISrsCodec::~ISrsCodec() SrsBuffer::SrsBuffer() { - p = bytes = NULL; - nb_bytes = 0; - - // TODO: support both little and big endian. - srs_assert(srs_is_little_endian()); + set_value(NULL, 0); +} + +SrsBuffer::SrsBuffer(char* b, int nb_b) +{ + set_value(b, nb_b); } SrsBuffer::~SrsBuffer() { } +void SrsBuffer::set_value(char* b, int nb_b) +{ + p = bytes = b; + nb_bytes = nb_b; + + // TODO: support both little and big endian. + srs_assert(srs_is_little_endian()); +} + int SrsBuffer::initialize(char* b, int nb) { int ret = ERROR_SUCCESS; diff --git a/trunk/src/kernel/srs_kernel_buffer.hpp b/trunk/src/kernel/srs_kernel_buffer.hpp index 6b85aa537f..46ce3f012c 100644 --- a/trunk/src/kernel/srs_kernel_buffer.hpp +++ b/trunk/src/kernel/srs_kernel_buffer.hpp @@ -98,7 +98,10 @@ class SrsBuffer int nb_bytes; public: SrsBuffer(); + SrsBuffer(char* b, int nb_b); virtual ~SrsBuffer(); +private: + virtual void set_value(char* b, int nb_b); public: /** * initialize the stream from bytes. diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 1b3f144a1b..a532ae8219 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -2141,7 +2141,7 @@ int SrsTsPayloadPSI::decode(SrsBuffer* stream, SrsTsMessage** /*ppmsg*/) CRC_32 = stream->read_4bytes(); // verify crc32. - int32_t crc32 = srs_crc32(ppat, stream->pos() - pat_pos - 4); + int32_t crc32 = srs_crc32_mpegts(ppat, stream->pos() - pat_pos - 4); if (crc32 != CRC_32) { ret = ERROR_STREAM_CASTER_TS_CRC32; srs_error("ts: verify PSI crc32 failed. ret=%d", ret); @@ -2238,7 +2238,7 @@ int SrsTsPayloadPSI::encode(SrsBuffer* stream) srs_error("ts: mux PSI crc32 failed. ret=%d", ret); return ret; } - CRC_32 = srs_crc32(ppat, stream->pos() - pat_pos); + CRC_32 = srs_crc32_mpegts(ppat, stream->pos() - pat_pos); stream->write_4bytes(CRC_32); return ret; diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 13f8639792..76cb1ff632 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -535,85 +535,163 @@ bool srs_aac_startswith_adts(SrsBuffer* stream) return true; } -/* - * MPEG2 transport stream (aka DVB) mux - * Copyright (c) 2003 Fabrice Bellard. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -static const u_int32_t crc_table[256] = { - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, - 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, - 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, - 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, - 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, - 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, - 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, - 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, - 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, - 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, - 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, - 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, - 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, - 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, - 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, - 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, - 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, - 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, - 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, - 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, - 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, - 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, - 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, - 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, - 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, - 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, - 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, - 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, - 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, - 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, - 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, - 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, - 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, - 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, - 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, - 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, - 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, - 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, - 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, - 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 -}; - // @see http://www.stmc.edu.hk/~vincent/ffmpeg_0.4.9-pre1/libavformat/mpegtsenc.c -unsigned int mpegts_crc32(const u_int8_t *data, int len) +unsigned int __mpegts_crc32(const u_int8_t *data, int len) { - register int i; - unsigned int crc = 0xffffffff; - - for (i=0; i> 24) ^ *data++) & 0xff]; + /* + * MPEG2 transport stream (aka DVB) mux + * Copyright (c) 2003 Fabrice Bellard. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + static const u_int32_t table[256] = { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, + 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, + 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, + 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, + 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, + 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, + 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, + 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, + 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, + 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, + 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, + 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, + 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, + 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, + 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, + 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, + 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, + 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, + 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, + 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, + 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, + 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 + }; + + u_int32_t crc = 0xffffffff; + + for (int i=0; i> 24) ^ *data++) & 0xff]; + } return crc; } -u_int32_t srs_crc32(const void* buf, int size) +// @see https://github.com/ETrun/crc32/blob/master/crc32.c +u_int32_t __crc32_ieee(u_int32_t init, const u_int8_t* buf, size_t nb_buf) +{ + /*----------------------------------------------------------------------------*\ + * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. + * + * This program generates the CRC-32 values for the files named in the + * command-line arguments. These are the same CRC-32 values used by GZIP, + * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and + * used independently. + * + * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. + * + * Based on the byte-oriented implementation "File Verification Using CRC" + * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. + * + * v1.0.0: original release. + * v1.0.1: fixed printf formats. + * v1.0.2: fixed something else. + * v1.0.3: replaced CRC constant table by generator function. + * v1.0.4: reformatted code, made ANSI C. 1994-12-05. + * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. + * v2.1.0: modified by Nico, 2013-04-20 + \*----------------------------------------------------------------------------*/ + static const u_int32_t table[256] = { + 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, + 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, + 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, + 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, + 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, + 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, + 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, + 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, + 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, + 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, + 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, + 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, + 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, + 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, + 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, + 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, + 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, + 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, + 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, + 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, + 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, + 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, + 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, + 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, + 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, + 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, + 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, + 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, + 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, + 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, + 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, + 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, + 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, + 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, + 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, + 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, + 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D + }; + + u_int32_t crc = init ^ 0xFFFFFFFF; + + for (int i = 0; i < nb_buf; i++) { + crc = table[(crc ^ buf[i]) & 0xff] ^ (crc >> 8); + } + + return crc^0xFFFFFFFF; +} + +u_int32_t srs_crc32_mpegts(const void* buf, int size) +{ + return __mpegts_crc32((const u_int8_t*)buf, size); +} + +u_int32_t srs_crc32_ieee(const void* buf, int size, u_int32_t previous) { - return mpegts_crc32((const u_int8_t*)buf, size); + return __crc32_ieee(previous, (const u_int8_t*)buf, size); } /* diff --git a/trunk/src/kernel/srs_kernel_utility.hpp b/trunk/src/kernel/srs_kernel_utility.hpp index 4a5bc5cb48..efaf5e876a 100644 --- a/trunk/src/kernel/srs_kernel_utility.hpp +++ b/trunk/src/kernel/srs_kernel_utility.hpp @@ -122,9 +122,14 @@ extern bool srs_avc_startswith_annexb(SrsBuffer* stream, int* pnb_start_code = N extern bool srs_aac_startswith_adts(SrsBuffer* stream); /** -* cacl the crc32 of bytes in buf. -*/ -extern u_int32_t srs_crc32(const void* buf, int size); +* cacl the crc32 of bytes in buf, for ffmpeg. + */ +extern u_int32_t srs_crc32_mpegts(const void* buf, int size); + +/** + * calc the crc32 of bytes in buf by IEEE, for zip. + */ +extern u_int32_t srs_crc32_ieee(const void* buf, int size, u_int32_t previous = 0); /** * Decode a base64-encoded string. diff --git a/trunk/src/protocol/srs_kafka_stack.cpp b/trunk/src/protocol/srs_kafka_stack.cpp index 6ecda777ab..be5dc365e6 100644 --- a/trunk/src/protocol/srs_kafka_stack.cpp +++ b/trunk/src/protocol/srs_kafka_stack.cpp @@ -158,20 +158,30 @@ int SrsKafkaString::decode(SrsBuffer* buf) SrsKafkaBytes::SrsKafkaBytes() { _size = -1; - data = NULL; + _data = NULL; } SrsKafkaBytes::SrsKafkaBytes(const char* v, int nb_v) { _size = -1; - data = NULL; + _data = NULL; set_value(v, nb_v); } SrsKafkaBytes::~SrsKafkaBytes() { - srs_freep(data); + srs_freep(_data); +} + +char* SrsKafkaBytes::data() +{ + return _data; +} + +int SrsKafkaBytes::size() +{ + return _size; } bool SrsKafkaBytes::null() @@ -192,14 +202,29 @@ void SrsKafkaBytes::set_value(string v) void SrsKafkaBytes::set_value(const char* v, int nb_v) { // free previous data. - srs_freep(data); + srs_freep(_data); // copy new value to data. _size = (int16_t)nb_v; srs_assert(_size > 0); - data = new char[_size]; - memcpy(data, v, _size); + _data = new char[_size]; + memcpy(_data, v, _size); +} + +u_int32_t SrsKafkaBytes::crc32(u_int32_t previous) +{ + char bsize[4]; + SrsBuffer(bsize, 4).write_4bytes(_size); + + if (_size <= 0) { + return srs_crc32_ieee(bsize, 4, previous); + } + + u_int32_t crc = srs_crc32_ieee(bsize, 4, previous); + crc = srs_crc32_ieee(_data, _size, crc); + + return crc; } int SrsKafkaBytes::nb_bytes() @@ -227,7 +252,7 @@ int SrsKafkaBytes::encode(SrsBuffer* buf) srs_error("kafka encode bytes data failed. ret=%d", ret); return ret; } - buf->write_bytes(data, _size); + buf->write_bytes(_data, _size); return ret; } @@ -255,9 +280,9 @@ int SrsKafkaBytes::decode(SrsBuffer* buf) return ret; } - srs_freep(data); - data = new char[_size]; - buf->read_bytes(data, _size); + srs_freep(_data); + _data = new char[_size]; + buf->read_bytes(_data, _size); return ret; } @@ -523,8 +548,13 @@ int SrsKafkaRawMessage::create(SrsJsonObject* obj) // dumps the json to string. value->set_value(obj->dumps()); - // TODO: FIXME: implements it. - crc = 0; + // crc32 message. + crc = srs_crc32_ieee(&magic_byte, 1); + crc = srs_crc32_ieee(&attributes, 1, crc); + crc = key->crc32(crc); + crc = value->crc32(crc); + + srs_info("crc32 message is %#x", crc); message_size = raw_message_size(); @@ -1143,13 +1173,17 @@ SrsKafkaProducerRequest::~SrsKafkaProducerRequest() int SrsKafkaProducerRequest::nb_bytes() { - return 2 + 4 + topics.nb_bytes(); + return SrsKafkaRequest::nb_bytes() + 2 + 4 + topics.nb_bytes(); } int SrsKafkaProducerRequest::encode(SrsBuffer* buf) { int ret = ERROR_SUCCESS; + if ((ret = SrsKafkaRequest::encode(buf)) != ERROR_SUCCESS) { + return ret; + } + if (!buf->require(2 + 4)) { ret = ERROR_KAFKA_CODEC_PRODUCER; srs_error("kafka encode producer failed. ret=%d", ret); @@ -1169,6 +1203,10 @@ int SrsKafkaProducerRequest::decode(SrsBuffer* buf) { int ret = ERROR_SUCCESS; + if ((ret = SrsKafkaRequest::decode(buf)) != ERROR_SUCCESS) { + return ret; + } + if (!buf->require(2 + 4)) { ret = ERROR_KAFKA_CODEC_PRODUCER; srs_error("kafka decode producer failed. ret=%d", ret); @@ -1445,7 +1483,12 @@ int SrsKafkaClient::write_messages(std::string topic, int32_t partition, vector< partitions->message_set_size = partitions->messages.nb_bytes(); - // TODO: FIXME: implements it. + // write to kafka cluster. + if ((ret = protocol->send_and_free_message(req)) != ERROR_SUCCESS) { + srs_error("kafka write producer message failed. ret=%d", ret); + return ret; + } + return ret; } diff --git a/trunk/src/protocol/srs_kafka_stack.hpp b/trunk/src/protocol/srs_kafka_stack.hpp index f08a5450c9..773ac0de0a 100644 --- a/trunk/src/protocol/srs_kafka_stack.hpp +++ b/trunk/src/protocol/srs_kafka_stack.hpp @@ -96,16 +96,19 @@ class SrsKafkaBytes : public ISrsCodec { private: int32_t _size; - char* data; + char* _data; public: SrsKafkaBytes(); SrsKafkaBytes(const char* v, int nb_v); virtual ~SrsKafkaBytes(); public: + virtual char* data(); + virtual int size(); virtual bool null(); virtual bool empty(); virtual void set_value(std::string v); virtual void set_value(const char* v, int nb_v); + virtual u_int32_t crc32(u_int32_t previous); // interface ISrsCodec public: virtual int nb_bytes();