diff --git a/README.md b/README.md index 5d5ad75d9..ca141c3ea 100755 --- a/README.md +++ b/README.md @@ -209,6 +209,7 @@ Supported operating systems and hardware: * 2013-10-17, Created.
## History +* v1.0, 2014-07-19, fix [#121](https://github.com/winlinvip/simple-rtmp-server/issues/121), srs_info detail log compile failed. 0.9.168. * v1.0, 2014-07-19, fix [#119](https://github.com/winlinvip/simple-rtmp-server/issues/119), use iformat and oformat for ffmpeg transcode. 0.9.163. * v1.0, 2014-07-13, [1.0 mainline6(0.9.160)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline8) released. 50029 lines. * v1.0, 2014-07-13, refine the bandwidth check/test, add as/js library, use srs-librtmp for linux tool. 0.9.159 diff --git a/trunk/src/app/srs_app_http_client.cpp b/trunk/src/app/srs_app_http_client.cpp index f25971ee5..589bc9538 100644 --- a/trunk/src/app/srs_app_http_client.cpp +++ b/trunk/src/app/srs_app_http_client.cpp @@ -141,9 +141,8 @@ int SrsHttpClient::connect(SrsHttpUri* uri) server.c_str(), port, timeout, ret); return ret; } - srs_info("connect to server success. " - "http url=%s, server=%s, ip=%s, port=%d", - uri->get_url(), uri->get_host(), ip.c_str(), uri->get_port()); + srs_info("connect to server success. http url=%s, server=%s, port=%d", + uri->get_url(), uri->get_host(), uri->get_port()); connected = true; diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 57fe7bf1e..6123e3a02 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 "0" #define VERSION_MINOR "9" -#define VERSION_REVISION "167" +#define VERSION_REVISION "168" #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION // server info. #define RTMP_SIG_SRS_KEY "SRS" diff --git a/trunk/src/kernel/srs_kernel_log.hpp b/trunk/src/kernel/srs_kernel_log.hpp index 376b4e112..8b1634818 100644 --- a/trunk/src/kernel/srs_kernel_log.hpp +++ b/trunk/src/kernel/srs_kernel_log.hpp @@ -133,11 +133,11 @@ extern ISrsThreadContext* _srs_context; #define srs_error(msg, ...) _srs_log->error(__PRETTY_FUNCTION__, _srs_context->get_id(), msg, ##__VA_ARGS__) #endif -#if 1 +#if 0 #undef srs_verbose #define srs_verbose(msg, ...) (void)0 #endif -#if 1 +#if 0 #undef srs_info #define srs_info(msg, ...) (void)0 #endif diff --git a/trunk/src/rtmp/srs_protocol_amf0.cpp b/trunk/src/rtmp/srs_protocol_amf0.cpp index 1a835eca8..67ca634a9 100644 --- a/trunk/src/rtmp/srs_protocol_amf0.cpp +++ b/trunk/src/rtmp/srs_protocol_amf0.cpp @@ -1071,7 +1071,7 @@ int SrsAmf0StrictArray::write(SrsStream* stream) return ret; } - srs_verbose("write amf0 property success. name=%s", name.c_str()); + srs_verbose("write amf0 property success."); } srs_verbose("write strict_array object success."); diff --git a/trunk/src/rtmp/srs_protocol_stack.cpp b/trunk/src/rtmp/srs_protocol_stack.cpp index 585fef105..b990912f3 100644 --- a/trunk/src/rtmp/srs_protocol_stack.cpp +++ b/trunk/src/rtmp/srs_protocol_stack.cpp @@ -289,6 +289,128 @@ messages. ***************************************************************************** ****************************************************************************/ +SrsMessageHeader::SrsMessageHeader() +{ + message_type = 0; + payload_length = 0; + timestamp_delta = 0; + stream_id = 0; + + timestamp = 0; + // we always use the connection chunk-id + perfer_cid = RTMP_CID_OverConnection; +} + +SrsMessageHeader::~SrsMessageHeader() +{ +} + +bool SrsMessageHeader::is_audio() +{ + return message_type == RTMP_MSG_AudioMessage; +} + +bool SrsMessageHeader::is_video() +{ + return message_type == RTMP_MSG_VideoMessage; +} + +bool SrsMessageHeader::is_amf0_command() +{ + return message_type == RTMP_MSG_AMF0CommandMessage; +} + +bool SrsMessageHeader::is_amf0_data() +{ + return message_type == RTMP_MSG_AMF0DataMessage; +} + +bool SrsMessageHeader::is_amf3_command() +{ + return message_type == RTMP_MSG_AMF3CommandMessage; +} + +bool SrsMessageHeader::is_amf3_data() +{ + return message_type == RTMP_MSG_AMF3DataMessage; +} + +bool SrsMessageHeader::is_window_ackledgement_size() +{ + return message_type == RTMP_MSG_WindowAcknowledgementSize; +} + +bool SrsMessageHeader::is_ackledgement() +{ + return message_type == RTMP_MSG_Acknowledgement; +} + +bool SrsMessageHeader::is_set_chunk_size() +{ + return message_type == RTMP_MSG_SetChunkSize; +} + +bool SrsMessageHeader::is_user_control_message() +{ + return message_type == RTMP_MSG_UserControlMessage; +} + +bool SrsMessageHeader::is_set_peer_bandwidth() +{ + return message_type == RTMP_MSG_SetPeerBandwidth; +} + +bool SrsMessageHeader::is_aggregate() +{ + return message_type == RTMP_MSG_AggregateMessage; +} + +void SrsMessageHeader::initialize_amf0_script(int size, int stream) +{ + message_type = RTMP_MSG_AMF0DataMessage; + payload_length = (int32_t)size; + timestamp_delta = (int32_t)0; + timestamp = (int64_t)0; + stream_id = (int32_t)stream; + + // amf0 script use connection2 chunk-id + perfer_cid = RTMP_CID_OverConnection2; +} + +void SrsMessageHeader::initialize_audio(int size, u_int32_t time, int stream) +{ + message_type = RTMP_MSG_AudioMessage; + payload_length = (int32_t)size; + timestamp_delta = (int32_t)time; + timestamp = (int64_t)time; + stream_id = (int32_t)stream; + + // audio chunk-id + perfer_cid = RTMP_CID_Audio; +} + +void SrsMessageHeader::initialize_video(int size, u_int32_t time, int stream) +{ + message_type = RTMP_MSG_VideoMessage; + payload_length = (int32_t)size; + timestamp_delta = (int32_t)time; + timestamp = (int64_t)time; + stream_id = (int32_t)stream; + + // video chunk-id + perfer_cid = RTMP_CID_Video; +} + +SrsMessage::SrsMessage() +{ + payload = NULL; + size = 0; +} + +SrsMessage::~SrsMessage() +{ +} + SrsProtocol::AckWindowSize::AckWindowSize() { ack_window_size = acked_size = 0; @@ -1494,118 +1616,6 @@ int SrsProtocol::response_ping_message(int32_t timestamp) return ret; } -SrsMessageHeader::SrsMessageHeader() -{ - message_type = 0; - payload_length = 0; - timestamp_delta = 0; - stream_id = 0; - - timestamp = 0; - // we always use the connection chunk-id - perfer_cid = RTMP_CID_OverConnection; -} - -SrsMessageHeader::~SrsMessageHeader() -{ -} - -bool SrsMessageHeader::is_audio() -{ - return message_type == RTMP_MSG_AudioMessage; -} - -bool SrsMessageHeader::is_video() -{ - return message_type == RTMP_MSG_VideoMessage; -} - -bool SrsMessageHeader::is_amf0_command() -{ - return message_type == RTMP_MSG_AMF0CommandMessage; -} - -bool SrsMessageHeader::is_amf0_data() -{ - return message_type == RTMP_MSG_AMF0DataMessage; -} - -bool SrsMessageHeader::is_amf3_command() -{ - return message_type == RTMP_MSG_AMF3CommandMessage; -} - -bool SrsMessageHeader::is_amf3_data() -{ - return message_type == RTMP_MSG_AMF3DataMessage; -} - -bool SrsMessageHeader::is_window_ackledgement_size() -{ - return message_type == RTMP_MSG_WindowAcknowledgementSize; -} - -bool SrsMessageHeader::is_ackledgement() -{ - return message_type == RTMP_MSG_Acknowledgement; -} - -bool SrsMessageHeader::is_set_chunk_size() -{ - return message_type == RTMP_MSG_SetChunkSize; -} - -bool SrsMessageHeader::is_user_control_message() -{ - return message_type == RTMP_MSG_UserControlMessage; -} - -bool SrsMessageHeader::is_set_peer_bandwidth() -{ - return message_type == RTMP_MSG_SetPeerBandwidth; -} - -bool SrsMessageHeader::is_aggregate() -{ - return message_type == RTMP_MSG_AggregateMessage; -} - -void SrsMessageHeader::initialize_amf0_script(int size, int stream) -{ - message_type = RTMP_MSG_AMF0DataMessage; - payload_length = (int32_t)size; - timestamp_delta = (int32_t)0; - timestamp = (int64_t)0; - stream_id = (int32_t)stream; - - // amf0 script use connection2 chunk-id - perfer_cid = RTMP_CID_OverConnection2; -} - -void SrsMessageHeader::initialize_audio(int size, u_int32_t time, int stream) -{ - message_type = RTMP_MSG_AudioMessage; - payload_length = (int32_t)size; - timestamp_delta = (int32_t)time; - timestamp = (int64_t)time; - stream_id = (int32_t)stream; - - // audio chunk-id - perfer_cid = RTMP_CID_Audio; -} - -void SrsMessageHeader::initialize_video(int size, u_int32_t time, int stream) -{ - message_type = RTMP_MSG_VideoMessage; - payload_length = (int32_t)size; - timestamp_delta = (int32_t)time; - timestamp = (int64_t)time; - stream_id = (int32_t)stream; - - // video chunk-id - perfer_cid = RTMP_CID_Video; -} - SrsChunkStream::SrsChunkStream(int _cid) { fmt = 0; @@ -1620,16 +1630,6 @@ SrsChunkStream::~SrsChunkStream() srs_freep(msg); } -SrsMessage::SrsMessage() -{ - payload = NULL; - size = 0; -} - -SrsMessage::~SrsMessage() -{ -} - SrsCommonMessage::SrsCommonMessage() { } diff --git a/trunk/src/rtmp/srs_protocol_stack.hpp b/trunk/src/rtmp/srs_protocol_stack.hpp index 1edd551f9..28419ce51 100644 --- a/trunk/src/rtmp/srs_protocol_stack.hpp +++ b/trunk/src/rtmp/srs_protocol_stack.hpp @@ -47,6 +47,120 @@ class SrsMessageHeader; class SrsMessage; class SrsChunkStream; +/** +* 4.1. Message Header +*/ +class SrsMessageHeader +{ +public: + /** + * 3bytes. + * Three-byte field that contains a timestamp delta of the message. + * The 4 bytes are packed in the big-endian order. + * @remark, only used for decoding message from chunk stream. + */ + int32_t timestamp_delta; + /** + * 3bytes. + * Three-byte field that represents the size of the payload in bytes. + * It is set in big-endian format. + */ + int32_t payload_length; + /** + * 1byte. + * One byte field to represent the message type. A range of type IDs + * (1-7) are reserved for protocol control messages. + */ + int8_t message_type; + /** + * 4bytes. + * Four-byte field that identifies the stream of the message. These + * bytes are set in big-endian format. + */ + int32_t stream_id; + + /** + * Four-byte field that contains a timestamp of the message. + * The 4 bytes are packed in the big-endian order. + * @remark, used as calc timestamp when decode and encode time. + * @remark, we use 64bits for large time for jitter detect and hls. + */ + int64_t timestamp; +public: + /** + * get the perfered cid(chunk stream id) which sendout over. + * set at decoding, and canbe used for directly send message, + * for example, dispatch to all connections. + */ + int perfer_cid; +public: + SrsMessageHeader(); + virtual ~SrsMessageHeader(); +public: + bool is_audio(); + bool is_video(); + bool is_amf0_command(); + bool is_amf0_data(); + bool is_amf3_command(); + bool is_amf3_data(); + bool is_window_ackledgement_size(); + bool is_ackledgement(); + bool is_set_chunk_size(); + bool is_user_control_message(); + bool is_set_peer_bandwidth(); + bool is_aggregate(); +public: + /** + * create a amf0 script header, set the size and stream_id. + */ + void initialize_amf0_script(int size, int stream); + /** + * create a audio header, set the size, timestamp and stream_id. + */ + void initialize_audio(int size, u_int32_t time, int stream); + /** + * create a video header, set the size, timestamp and stream_id. + */ + void initialize_video(int size, u_int32_t time, int stream); +}; + +/** +* message is raw data RTMP message, bytes oriented, +* protcol always recv RTMP message, and can send RTMP message or RTMP packet. +* the shared-ptr message is a special RTMP message, use ref-count for performance issue. +* +* @remark, never directly new SrsMessage, the constructor is protected, +* for in the SrsMessage, we never know whether we should free the message, +* for SrsCommonMessage, we should free the payload, +* while for SrsSharedPtrMessage, we should use ref-count to free it. +* so, use these two concrete message, SrsCommonMessage or SrsSharedPtrMessage instread. +*/ +class SrsMessage +{ +// 4.1. Message Header +public: + SrsMessageHeader header; +// 4.2. Message Payload +public: + /** + * current message parsed size, + * size <= header.payload_length + * for the payload maybe sent in multiple chunks. + */ + int size; + /** + * the payload of message, the SrsMessage never know about the detail of payload, + * user must use SrsProtocol.decode_message to get concrete packet. + * @remark, not all message payload can be decoded to packet. for example, + * video/audio packet use raw bytes, no video/audio packet. + */ + char* payload; +protected: + SrsMessage(); +public: + virtual ~SrsMessage(); +}; + /** * the protocol provides the rtmp-message-protocol services, * to recv RTMP message from RTMP chunk stream, @@ -277,83 +391,6 @@ private: virtual int response_ping_message(int32_t timestamp); }; -/** -* 4.1. Message Header -*/ -class SrsMessageHeader -{ -public: - /** - * 3bytes. - * Three-byte field that contains a timestamp delta of the message. - * The 4 bytes are packed in the big-endian order. - * @remark, only used for decoding message from chunk stream. - */ - int32_t timestamp_delta; - /** - * 3bytes. - * Three-byte field that represents the size of the payload in bytes. - * It is set in big-endian format. - */ - int32_t payload_length; - /** - * 1byte. - * One byte field to represent the message type. A range of type IDs - * (1-7) are reserved for protocol control messages. - */ - int8_t message_type; - /** - * 4bytes. - * Four-byte field that identifies the stream of the message. These - * bytes are set in big-endian format. - */ - int32_t stream_id; - - /** - * Four-byte field that contains a timestamp of the message. - * The 4 bytes are packed in the big-endian order. - * @remark, used as calc timestamp when decode and encode time. - * @remark, we use 64bits for large time for jitter detect and hls. - */ - int64_t timestamp; -public: - /** - * get the perfered cid(chunk stream id) which sendout over. - * set at decoding, and canbe used for directly send message, - * for example, dispatch to all connections. - */ - int perfer_cid; -public: - SrsMessageHeader(); - virtual ~SrsMessageHeader(); -public: - bool is_audio(); - bool is_video(); - bool is_amf0_command(); - bool is_amf0_data(); - bool is_amf3_command(); - bool is_amf3_data(); - bool is_window_ackledgement_size(); - bool is_ackledgement(); - bool is_set_chunk_size(); - bool is_user_control_message(); - bool is_set_peer_bandwidth(); - bool is_aggregate(); -public: - /** - * create a amf0 script header, set the size and stream_id. - */ - void initialize_amf0_script(int size, int stream); - /** - * create a audio header, set the size, timestamp and stream_id. - */ - void initialize_audio(int size, u_int32_t time, int stream); - /** - * create a video header, set the size, timestamp and stream_id. - */ - void initialize_video(int size, u_int32_t time, int stream); -}; - /** * incoming chunk stream maybe interlaced, * use the chunk stream to cache the input RTMP chunk streams. @@ -392,43 +429,6 @@ public: virtual ~SrsChunkStream(); }; -/** -* message is raw data RTMP message, bytes oriented, -* protcol always recv RTMP message, and can send RTMP message or RTMP packet. -* the shared-ptr message is a special RTMP message, use ref-count for performance issue. -* -* @remark, never directly new SrsMessage, the constructor is protected, -* for in the SrsMessage, we never know whether we should free the message, -* for SrsCommonMessage, we should free the payload, -* while for SrsSharedPtrMessage, we should use ref-count to free it. -* so, use these two concrete message, SrsCommonMessage or SrsSharedPtrMessage instread. -*/ -class SrsMessage -{ -// 4.1. Message Header -public: - SrsMessageHeader header; -// 4.2. Message Payload -public: - /** - * current message parsed size, - * size <= header.payload_length - * for the payload maybe sent in multiple chunks. - */ - int size; - /** - * the payload of message, the SrsMessage never know about the detail of payload, - * user must use SrsProtocol.decode_message to get concrete packet. - * @remark, not all message payload can be decoded to packet. for example, - * video/audio packet use raw bytes, no video/audio packet. - */ - char* payload; -protected: - SrsMessage(); -public: - virtual ~SrsMessage(); -}; - /** * the common message used free the payload in common way. */