refine RTMP protocol stack, rename buffer to in_buffer, change field pp/stream t…
…o local variables. 0.9.154
正在显示
3 个修改的文件
包含
44 行增加
和
21 行删除
| @@ -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 "0" | 32 | #define VERSION_MAJOR "0" |
| 33 | #define VERSION_MINOR "9" | 33 | #define VERSION_MINOR "9" |
| 34 | -#define VERSION_REVISION "153" | 34 | +#define VERSION_REVISION "154" |
| 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION | 35 | #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION |
| 36 | // server info. | 36 | // server info. |
| 37 | #define RTMP_SIG_SRS_KEY "SRS" | 37 | #define RTMP_SIG_SRS_KEY "SRS" |
| @@ -297,8 +297,7 @@ SrsProtocol::AckWindowSize::AckWindowSize() | @@ -297,8 +297,7 @@ SrsProtocol::AckWindowSize::AckWindowSize() | ||
| 297 | 297 | ||
| 298 | SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io) | 298 | SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io) |
| 299 | { | 299 | { |
| 300 | - buffer = new SrsBuffer(); | ||
| 301 | - decode_stream = new SrsStream(); | 300 | + in_buffer = new SrsBuffer(); |
| 302 | skt = io; | 301 | skt = io; |
| 303 | 302 | ||
| 304 | in_chunk_size = out_chunk_size = RTMP_DEFAULT_CHUNK_SIZE; | 303 | in_chunk_size = out_chunk_size = RTMP_DEFAULT_CHUNK_SIZE; |
| @@ -317,8 +316,7 @@ SrsProtocol::~SrsProtocol() | @@ -317,8 +316,7 @@ SrsProtocol::~SrsProtocol() | ||
| 317 | chunk_streams.clear(); | 316 | chunk_streams.clear(); |
| 318 | } | 317 | } |
| 319 | 318 | ||
| 320 | - srs_freep(decode_stream); | ||
| 321 | - srs_freep(buffer); | 319 | + srs_freep(in_buffer); |
| 322 | } | 320 | } |
| 323 | 321 | ||
| 324 | void SrsProtocol::set_recv_timeout(int64_t timeout_us) | 322 | void SrsProtocol::set_recv_timeout(int64_t timeout_us) |
| @@ -406,10 +404,12 @@ int SrsProtocol::decode_message(SrsMessage* msg, SrsPacket** ppacket) | @@ -406,10 +404,12 @@ int SrsProtocol::decode_message(SrsMessage* msg, SrsPacket** ppacket) | ||
| 406 | srs_assert(msg != NULL); | 404 | srs_assert(msg != NULL); |
| 407 | srs_assert(msg->payload != NULL); | 405 | srs_assert(msg->payload != NULL); |
| 408 | srs_assert(msg->size > 0); | 406 | srs_assert(msg->size > 0); |
| 407 | + | ||
| 408 | + SrsStream stream; | ||
| 409 | 409 | ||
| 410 | // initialize the decode stream for all message, | 410 | // initialize the decode stream for all message, |
| 411 | // it's ok for the initialize if fast and without memory copy. | 411 | // it's ok for the initialize if fast and without memory copy. |
| 412 | - if ((ret = decode_stream->initialize((char*)(msg->payload), msg->size)) != ERROR_SUCCESS) { | 412 | + if ((ret = stream.initialize((char*)(msg->payload), msg->size)) != ERROR_SUCCESS) { |
| 413 | srs_error("initialize stream failed. ret=%d", ret); | 413 | srs_error("initialize stream failed. ret=%d", ret); |
| 414 | return ret; | 414 | return ret; |
| 415 | } | 415 | } |
| @@ -417,7 +417,7 @@ int SrsProtocol::decode_message(SrsMessage* msg, SrsPacket** ppacket) | @@ -417,7 +417,7 @@ int SrsProtocol::decode_message(SrsMessage* msg, SrsPacket** ppacket) | ||
| 417 | 417 | ||
| 418 | // decode the packet. | 418 | // decode the packet. |
| 419 | SrsPacket* packet = NULL; | 419 | SrsPacket* packet = NULL; |
| 420 | - if ((ret = do_decode_message(msg->header, decode_stream, &packet)) != ERROR_SUCCESS) { | 420 | + if ((ret = do_decode_message(msg->header, &stream, &packet)) != ERROR_SUCCESS) { |
| 421 | srs_freep(packet); | 421 | srs_freep(packet); |
| 422 | return ret; | 422 | return ret; |
| 423 | } | 423 | } |
| @@ -445,6 +445,8 @@ int SrsProtocol::do_send_message(SrsMessage* msg, SrsPacket* packet) | @@ -445,6 +445,8 @@ int SrsProtocol::do_send_message(SrsMessage* msg, SrsPacket* packet) | ||
| 445 | // p set to current write position, | 445 | // p set to current write position, |
| 446 | // it's ok when payload is NULL and size is 0. | 446 | // it's ok when payload is NULL and size is 0. |
| 447 | char* p = (char*)msg->payload; | 447 | char* p = (char*)msg->payload; |
| 448 | + // to directly set the field. | ||
| 449 | + char* pp = NULL; | ||
| 448 | 450 | ||
| 449 | // always write the header event payload is empty. | 451 | // always write the header event payload is empty. |
| 450 | do { | 452 | do { |
| @@ -871,14 +873,14 @@ int SrsProtocol::read_basic_header(char& fmt, int& cid, int& bh_size) | @@ -871,14 +873,14 @@ int SrsProtocol::read_basic_header(char& fmt, int& cid, int& bh_size) | ||
| 871 | int ret = ERROR_SUCCESS; | 873 | int ret = ERROR_SUCCESS; |
| 872 | 874 | ||
| 873 | int required_size = 1; | 875 | int required_size = 1; |
| 874 | - if ((ret = buffer->grow(skt, required_size)) != ERROR_SUCCESS) { | 876 | + if ((ret = in_buffer->grow(skt, required_size)) != ERROR_SUCCESS) { |
| 875 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { | 877 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { |
| 876 | srs_error("read 1bytes basic header failed. required_size=%d, ret=%d", required_size, ret); | 878 | srs_error("read 1bytes basic header failed. required_size=%d, ret=%d", required_size, ret); |
| 877 | } | 879 | } |
| 878 | return ret; | 880 | return ret; |
| 879 | } | 881 | } |
| 880 | 882 | ||
| 881 | - char* p = buffer->bytes(); | 883 | + char* p = in_buffer->bytes(); |
| 882 | 884 | ||
| 883 | fmt = (*p >> 6) & 0x03; | 885 | fmt = (*p >> 6) & 0x03; |
| 884 | cid = *p & 0x3f; | 886 | cid = *p & 0x3f; |
| @@ -891,7 +893,7 @@ int SrsProtocol::read_basic_header(char& fmt, int& cid, int& bh_size) | @@ -891,7 +893,7 @@ int SrsProtocol::read_basic_header(char& fmt, int& cid, int& bh_size) | ||
| 891 | 893 | ||
| 892 | if (cid == 0) { | 894 | if (cid == 0) { |
| 893 | required_size = 2; | 895 | required_size = 2; |
| 894 | - if ((ret = buffer->grow(skt, required_size)) != ERROR_SUCCESS) { | 896 | + if ((ret = in_buffer->grow(skt, required_size)) != ERROR_SUCCESS) { |
| 895 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { | 897 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { |
| 896 | srs_error("read 2bytes basic header failed. required_size=%d, ret=%d", required_size, ret); | 898 | srs_error("read 2bytes basic header failed. required_size=%d, ret=%d", required_size, ret); |
| 897 | } | 899 | } |
| @@ -904,7 +906,7 @@ int SrsProtocol::read_basic_header(char& fmt, int& cid, int& bh_size) | @@ -904,7 +906,7 @@ int SrsProtocol::read_basic_header(char& fmt, int& cid, int& bh_size) | ||
| 904 | srs_verbose("%dbytes basic header parsed. fmt=%d, cid=%d", bh_size, fmt, cid); | 906 | srs_verbose("%dbytes basic header parsed. fmt=%d, cid=%d", bh_size, fmt, cid); |
| 905 | } else if (cid == 1) { | 907 | } else if (cid == 1) { |
| 906 | required_size = 3; | 908 | required_size = 3; |
| 907 | - if ((ret = buffer->grow(skt, 3)) != ERROR_SUCCESS) { | 909 | + if ((ret = in_buffer->grow(skt, 3)) != ERROR_SUCCESS) { |
| 908 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { | 910 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { |
| 909 | srs_error("read 3bytes basic header failed. required_size=%d, ret=%d", required_size, ret); | 911 | srs_error("read 3bytes basic header failed. required_size=%d, ret=%d", required_size, ret); |
| 910 | } | 912 | } |
| @@ -997,13 +999,13 @@ int SrsProtocol::read_message_header(SrsChunkStream* chunk, char fmt, int bh_siz | @@ -997,13 +999,13 @@ int SrsProtocol::read_message_header(SrsChunkStream* chunk, char fmt, int bh_siz | ||
| 997 | srs_verbose("calc chunk message header size. fmt=%d, mh_size=%d", fmt, mh_size); | 999 | srs_verbose("calc chunk message header size. fmt=%d, mh_size=%d", fmt, mh_size); |
| 998 | 1000 | ||
| 999 | int required_size = bh_size + mh_size; | 1001 | int required_size = bh_size + mh_size; |
| 1000 | - if ((ret = buffer->grow(skt, required_size)) != ERROR_SUCCESS) { | 1002 | + if ((ret = in_buffer->grow(skt, required_size)) != ERROR_SUCCESS) { |
| 1001 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { | 1003 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { |
| 1002 | srs_error("read %dbytes message header failed. required_size=%d, ret=%d", mh_size, required_size, ret); | 1004 | srs_error("read %dbytes message header failed. required_size=%d, ret=%d", mh_size, required_size, ret); |
| 1003 | } | 1005 | } |
| 1004 | return ret; | 1006 | return ret; |
| 1005 | } | 1007 | } |
| 1006 | - char* p = buffer->bytes() + bh_size; | 1008 | + char* p = in_buffer->bytes() + bh_size; |
| 1007 | 1009 | ||
| 1008 | /** | 1010 | /** |
| 1009 | * parse the message header. | 1011 | * parse the message header. |
| @@ -1107,7 +1109,7 @@ int SrsProtocol::read_message_header(SrsChunkStream* chunk, char fmt, int bh_siz | @@ -1107,7 +1109,7 @@ int SrsProtocol::read_message_header(SrsChunkStream* chunk, char fmt, int bh_siz | ||
| 1107 | mh_size += 4; | 1109 | mh_size += 4; |
| 1108 | required_size = bh_size + mh_size; | 1110 | required_size = bh_size + mh_size; |
| 1109 | srs_verbose("read header ext time. fmt=%d, ext_time=%d, mh_size=%d", fmt, chunk->extended_timestamp, mh_size); | 1111 | srs_verbose("read header ext time. fmt=%d, ext_time=%d, mh_size=%d", fmt, chunk->extended_timestamp, mh_size); |
| 1110 | - if ((ret = buffer->grow(skt, required_size)) != ERROR_SUCCESS) { | 1112 | + if ((ret = in_buffer->grow(skt, required_size)) != ERROR_SUCCESS) { |
| 1111 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { | 1113 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { |
| 1112 | srs_error("read %dbytes message header failed. required_size=%d, ret=%d", mh_size, required_size, ret); | 1114 | srs_error("read %dbytes message header failed. required_size=%d, ret=%d", mh_size, required_size, ret); |
| 1113 | } | 1115 | } |
| @@ -1210,7 +1212,7 @@ int SrsProtocol::read_message_payload(SrsChunkStream* chunk, int bh_size, int mh | @@ -1210,7 +1212,7 @@ int SrsProtocol::read_message_payload(SrsChunkStream* chunk, int bh_size, int mh | ||
| 1210 | // empty message | 1212 | // empty message |
| 1211 | if (chunk->header.payload_length <= 0) { | 1213 | if (chunk->header.payload_length <= 0) { |
| 1212 | // need erase the header in buffer. | 1214 | // need erase the header in buffer. |
| 1213 | - buffer->erase(bh_size + mh_size); | 1215 | + in_buffer->erase(bh_size + mh_size); |
| 1214 | 1216 | ||
| 1215 | srs_trace("get an empty RTMP " | 1217 | srs_trace("get an empty RTMP " |
| 1216 | "message(type=%d, size=%d, time=%"PRId64", sid=%d)", chunk->header.message_type, | 1218 | "message(type=%d, size=%d, time=%"PRId64", sid=%d)", chunk->header.message_type, |
| @@ -1238,14 +1240,14 @@ int SrsProtocol::read_message_payload(SrsChunkStream* chunk, int bh_size, int mh | @@ -1238,14 +1240,14 @@ int SrsProtocol::read_message_payload(SrsChunkStream* chunk, int bh_size, int mh | ||
| 1238 | 1240 | ||
| 1239 | // read payload to buffer | 1241 | // read payload to buffer |
| 1240 | int required_size = bh_size + mh_size + payload_size; | 1242 | int required_size = bh_size + mh_size + payload_size; |
| 1241 | - if ((ret = buffer->grow(skt, required_size)) != ERROR_SUCCESS) { | 1243 | + if ((ret = in_buffer->grow(skt, required_size)) != ERROR_SUCCESS) { |
| 1242 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { | 1244 | if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) { |
| 1243 | srs_error("read payload failed. required_size=%d, ret=%d", required_size, ret); | 1245 | srs_error("read payload failed. required_size=%d, ret=%d", required_size, ret); |
| 1244 | } | 1246 | } |
| 1245 | return ret; | 1247 | return ret; |
| 1246 | } | 1248 | } |
| 1247 | - memcpy(chunk->msg->payload + chunk->msg->size, buffer->bytes() + bh_size + mh_size, payload_size); | ||
| 1248 | - buffer->erase(bh_size + mh_size + payload_size); | 1249 | + memcpy(chunk->msg->payload + chunk->msg->size, in_buffer->bytes() + bh_size + mh_size, payload_size); |
| 1250 | + in_buffer->erase(bh_size + mh_size + payload_size); | ||
| 1249 | chunk->msg->size += payload_size; | 1251 | chunk->msg->size += payload_size; |
| 1250 | 1252 | ||
| 1251 | srs_verbose("chunk payload read completed. bh_size=%d, mh_size=%d, payload_size=%d", bh_size, mh_size, payload_size); | 1253 | srs_verbose("chunk payload read completed. bh_size=%d, mh_size=%d, payload_size=%d", bh_size, mh_size, payload_size); |
| @@ -97,8 +97,10 @@ private: | @@ -97,8 +97,10 @@ private: | ||
| 97 | }; | 97 | }; |
| 98 | // peer in/out | 98 | // peer in/out |
| 99 | private: | 99 | private: |
| 100 | + /** | ||
| 101 | + * underlayer socket object, send/recv bytes. | ||
| 102 | + */ | ||
| 100 | ISrsProtocolReaderWriter* skt; | 103 | ISrsProtocolReaderWriter* skt; |
| 101 | - char* pp; | ||
| 102 | /** | 104 | /** |
| 103 | * requests sent out, used to build the response. | 105 | * requests sent out, used to build the response. |
| 104 | * key: transactionId | 106 | * key: transactionId |
| @@ -107,14 +109,33 @@ private: | @@ -107,14 +109,33 @@ private: | ||
| 107 | std::map<double, std::string> requests; | 109 | std::map<double, std::string> requests; |
| 108 | // peer in | 110 | // peer in |
| 109 | private: | 111 | private: |
| 112 | + /** | ||
| 113 | + * chunk stream to decode RTMP messages. | ||
| 114 | + */ | ||
| 110 | std::map<int, SrsChunkStream*> chunk_streams; | 115 | std::map<int, SrsChunkStream*> chunk_streams; |
| 111 | - SrsStream* decode_stream; | ||
| 112 | - SrsBuffer* buffer; | 116 | + /** |
| 117 | + * bytes buffer cache, recv from skt, provide services for stream. | ||
| 118 | + */ | ||
| 119 | + SrsBuffer* in_buffer; | ||
| 120 | + /** | ||
| 121 | + * input chunk size, default to 128, set by peer packet. | ||
| 122 | + */ | ||
| 113 | int32_t in_chunk_size; | 123 | int32_t in_chunk_size; |
| 124 | + /** | ||
| 125 | + * input ack size, when to send the acked packet. | ||
| 126 | + */ | ||
| 114 | AckWindowSize in_ack_size; | 127 | AckWindowSize in_ack_size; |
| 115 | // peer out | 128 | // peer out |
| 116 | private: | 129 | private: |
| 130 | + /** | ||
| 131 | + * output header cache. | ||
| 132 | + * used for type0, 11bytes(or 15bytes with extended timestamp) header. | ||
| 133 | + * or for type3, 1bytes(or 5bytes with extended timestamp) header. | ||
| 134 | + */ | ||
| 117 | char out_header_cache[RTMP_MAX_FMT0_HEADER_SIZE]; | 135 | char out_header_cache[RTMP_MAX_FMT0_HEADER_SIZE]; |
| 136 | + /** | ||
| 137 | + * output chunk size, default to 128, set by config. | ||
| 138 | + */ | ||
| 118 | int32_t out_chunk_size; | 139 | int32_t out_chunk_size; |
| 119 | public: | 140 | public: |
| 120 | /** | 141 | /** |
-
请 注册 或 登录 后发表评论