From bfe771bbba6ef16cc94c766fe0ed8bcce24067ce Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 8 Mar 2014 14:38:19 +0800 Subject: [PATCH] amf0 utest: null,undefined,object-eof to any --- trunk/src/app/srs_app_bandwidth.cpp | 42 ++--- trunk/src/app/srs_app_hls.cpp | 16 +- trunk/src/app/srs_app_source.cpp | 4 +- trunk/src/rtmp/srs_protocol_amf0.cpp | 174 ++++++++++++--------- trunk/src/rtmp/srs_protocol_amf0.hpp | 148 +++++++++--------- trunk/src/rtmp/srs_protocol_rtmp.cpp | 20 +-- trunk/src/rtmp/srs_protocol_rtmp_stack.cpp | 28 ++-- trunk/src/rtmp/srs_protocol_rtmp_stack.hpp | 29 ++-- trunk/src/utest/srs_utest_amf0.cpp | 59 +++++-- 9 files changed, 293 insertions(+), 227 deletions(-) diff --git a/trunk/src/app/srs_app_bandwidth.cpp b/trunk/src/app/srs_app_bandwidth.cpp index 05a54b57b..835f5b45c 100644 --- a/trunk/src/app/srs_app_bandwidth.cpp +++ b/trunk/src/app/srs_app_bandwidth.cpp @@ -178,15 +178,15 @@ int SrsBandwidth::do_bandwidth_check() // send finished msg SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_finish(); - pkt->data->set("code", new SrsAmf0Number(ERROR_SUCCESS)); - pkt->data->set("start_time", new SrsAmf0Number(start_time)); - pkt->data->set("end_time", new SrsAmf0Number(end_time)); - pkt->data->set("play_kbps", new SrsAmf0Number(play_kbps)); - pkt->data->set("publish_kbps", new SrsAmf0Number(publish_kbps)); - pkt->data->set("play_bytes", new SrsAmf0Number(play_bytes)); - pkt->data->set("play_time", new SrsAmf0Number(play_actual_duration_ms)); - pkt->data->set("publish_bytes", new SrsAmf0Number(publish_bytes)); - pkt->data->set("publish_time", new SrsAmf0Number(publish_actual_duration_ms)); + pkt->data->set("code", SrsAmf0Any::number(ERROR_SUCCESS)); + pkt->data->set("start_time", SrsAmf0Any::number(start_time)); + pkt->data->set("end_time", SrsAmf0Any::number(end_time)); + pkt->data->set("play_kbps", SrsAmf0Any::number(play_kbps)); + pkt->data->set("publish_kbps", SrsAmf0Any::number(publish_kbps)); + pkt->data->set("play_bytes", SrsAmf0Any::number(play_bytes)); + pkt->data->set("play_time", SrsAmf0Any::number(play_actual_duration_ms)); + pkt->data->set("publish_bytes", SrsAmf0Any::number(publish_bytes)); + pkt->data->set("publish_time", SrsAmf0Any::number(publish_actual_duration_ms)); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { @@ -229,8 +229,8 @@ int SrsBandwidth::check_play( // send start play command to client SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_play(); - pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms)); - pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); + pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms)); + pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms)); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { @@ -308,10 +308,10 @@ int SrsBandwidth::check_play( if (true) { // notify client to stop play SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play(); - pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms)); - pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); - pkt->data->set("duration_delta", new SrsAmf0Number(actual_duration_ms)); - pkt->data->set("bytes_delta", new SrsAmf0Number(play_bytes)); + pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms)); + pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms)); + pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms)); + pkt->data->set("bytes_delta", SrsAmf0Any::number(play_bytes)); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { @@ -353,8 +353,8 @@ int SrsBandwidth::check_publish( // notify client to start publish SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_publish(); - pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms)); - pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); + pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms)); + pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms)); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { @@ -414,10 +414,10 @@ int SrsBandwidth::check_publish( if (true) { // notify client to stop publish SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_publish(); - pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms)); - pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); - pkt->data->set("duration_delta", new SrsAmf0Number(actual_duration_ms)); - pkt->data->set("bytes_delta", new SrsAmf0Number(publish_bytes)); + pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms)); + pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms)); + pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms)); + pkt->data->set("bytes_delta", SrsAmf0Any::number(publish_bytes)); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index db70efc6e..4b11b952a 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -1221,29 +1221,29 @@ int SrsHls::on_meta_data(SrsAmf0Object* metadata) SrsAmf0Any* prop = NULL; if ((prop = obj->get_property("duration")) != NULL && prop->is_number()) { - codec->duration = (int)srs_amf0_convert(prop)->value; + codec->duration = (int)prop->to_number(); } if ((prop = obj->get_property("width")) != NULL && prop->is_number()) { - codec->width = (int)srs_amf0_convert(prop)->value; + codec->width = (int)prop->to_number(); } if ((prop = obj->get_property("height")) != NULL && prop->is_number()) { - codec->height = (int)srs_amf0_convert(prop)->value; + codec->height = (int)prop->to_number(); } if ((prop = obj->get_property("framerate")) != NULL && prop->is_number()) { - codec->frame_rate = (int)srs_amf0_convert(prop)->value; + codec->frame_rate = (int)prop->to_number(); } if ((prop = obj->get_property("videocodecid")) != NULL && prop->is_number()) { - codec->video_codec_id = (int)srs_amf0_convert(prop)->value; + codec->video_codec_id = (int)prop->to_number(); } if ((prop = obj->get_property("videodatarate")) != NULL && prop->is_number()) { - codec->video_data_rate = (int)(1000 * srs_amf0_convert(prop)->value); + codec->video_data_rate = (int)(1000 * prop->to_number()); } if ((prop = obj->get_property("audiocodecid")) != NULL && prop->is_number()) { - codec->audio_codec_id = (int)srs_amf0_convert(prop)->value; + codec->audio_codec_id = (int)prop->to_number(); } if ((prop = obj->get_property("audiodatarate")) != NULL && prop->is_number()) { - codec->audio_data_rate = (int)(1000 * srs_amf0_convert(prop)->value); + codec->audio_data_rate = (int)(1000 * prop->to_number()); } // ignore the following, for each flv/rtmp packet contains them: diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index 2d11deecc..54566e6d2 100644 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -645,12 +645,12 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata SrsAmf0Any* prop = NULL; if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) { if (prop->is_number()) { - sample_rate = (int)(srs_amf0_convert(prop)->value); + sample_rate = (int)prop->to_number(); } } if ((prop = metadata->metadata->get_property("framerate")) != NULL) { if (prop->is_number()) { - frame_rate = (int)(srs_amf0_convert(prop)->value); + frame_rate = (int)prop->to_number(); } } diff --git a/trunk/src/rtmp/srs_protocol_amf0.cpp b/trunk/src/rtmp/srs_protocol_amf0.cpp index 9fd208ad2..f683a5388 100644 --- a/trunk/src/rtmp/srs_protocol_amf0.cpp +++ b/trunk/src/rtmp/srs_protocol_amf0.cpp @@ -56,8 +56,8 @@ using namespace std; // User defined #define RTMP_AMF0_Invalid 0x3F -int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*&); -int srs_amf0_write_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*); +int srs_amf0_read_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF*&); +int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF*); int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value); int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value); @@ -117,6 +117,12 @@ bool SrsAmf0Any::to_boolean() return o->value; } +double SrsAmf0Any::to_number() +{ + __SrsAmf0Number* o = srs_amf0_convert<__SrsAmf0Number>(this); + return o->value; +} + bool SrsAmf0Any::is_object_eof() { return marker == RTMP_AMF0_ObjectEnd; @@ -132,69 +138,26 @@ SrsAmf0Any* SrsAmf0Any::boolean(bool value) return new __SrsAmf0Boolean(value); } -SrsAmf0Number::SrsAmf0Number(double _value) +SrsAmf0Any* SrsAmf0Any::number(double value) { - marker = RTMP_AMF0_Number; - value = _value; + return new __SrsAmf0Number(value); } -SrsAmf0Number::~SrsAmf0Number() +SrsAmf0Any* SrsAmf0Any::null() +{ + return new __SrsAmf0Null(); +} + +SrsAmf0Any* SrsAmf0Any::undefined() +{ + return new __SrsAmf0Undefined(); +} + +__SrsUnSortedHashtable::__SrsUnSortedHashtable() { } -int SrsAmf0Number::size() -{ - return SrsAmf0Size::number(); -} - -SrsAmf0Null::SrsAmf0Null() -{ - marker = RTMP_AMF0_Null; -} - -SrsAmf0Null::~SrsAmf0Null() -{ -} - -int SrsAmf0Null::size() -{ - return SrsAmf0Size::null(); -} - -SrsAmf0Undefined::SrsAmf0Undefined() -{ - marker = RTMP_AMF0_Undefined; -} - -SrsAmf0Undefined::~SrsAmf0Undefined() -{ -} - -int SrsAmf0Undefined::size() -{ - return SrsAmf0Size::undefined(); -} - -SrsAmf0ObjectEOF::SrsAmf0ObjectEOF() -{ - marker = RTMP_AMF0_ObjectEnd; - utf8_empty = 0x00; -} - -SrsAmf0ObjectEOF::~SrsAmf0ObjectEOF() -{ -} - -int SrsAmf0ObjectEOF::size() -{ - return SrsAmf0Size::object_eof(); -} - -SrsUnSortedHashtable::SrsUnSortedHashtable() -{ -} - -SrsUnSortedHashtable::~SrsUnSortedHashtable() +__SrsUnSortedHashtable::~__SrsUnSortedHashtable() { std::vector::iterator it; for (it = properties.begin(); it != properties.end(); ++it) { @@ -205,31 +168,31 @@ SrsUnSortedHashtable::~SrsUnSortedHashtable() properties.clear(); } -int SrsUnSortedHashtable::size() +int __SrsUnSortedHashtable::size() { return (int)properties.size(); } -void SrsUnSortedHashtable::clear() +void __SrsUnSortedHashtable::clear() { properties.clear(); } -std::string SrsUnSortedHashtable::key_at(int index) +std::string __SrsUnSortedHashtable::key_at(int index) { srs_assert(index < size()); SrsObjectPropertyType& elem = properties[index]; return elem.first; } -SrsAmf0Any* SrsUnSortedHashtable::value_at(int index) +SrsAmf0Any* __SrsUnSortedHashtable::value_at(int index) { srs_assert(index < size()); SrsObjectPropertyType& elem = properties[index]; return elem.second; } -void SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value) +void __SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value) { std::vector::iterator it; @@ -248,7 +211,7 @@ void SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value) properties.push_back(std::make_pair(key, value)); } -SrsAmf0Any* SrsUnSortedHashtable::get_property(std::string name) +SrsAmf0Any* __SrsUnSortedHashtable::get_property(std::string name) { std::vector::iterator it; @@ -264,7 +227,7 @@ SrsAmf0Any* SrsUnSortedHashtable::get_property(std::string name) return NULL; } -SrsAmf0Any* SrsUnSortedHashtable::ensure_property_string(std::string name) +SrsAmf0Any* __SrsUnSortedHashtable::ensure_property_string(std::string name) { SrsAmf0Any* prop = get_property(name); @@ -279,7 +242,7 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_string(std::string name) return prop; } -SrsAmf0Any* SrsUnSortedHashtable::ensure_property_number(std::string name) +SrsAmf0Any* __SrsUnSortedHashtable::ensure_property_number(std::string name) { SrsAmf0Any* prop = get_property(name); @@ -294,6 +257,21 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_number(std::string name) return prop; } +__SrsAmf0ObjectEOF::__SrsAmf0ObjectEOF() +{ + marker = RTMP_AMF0_ObjectEnd; + utf8_empty = 0x00; +} + +__SrsAmf0ObjectEOF::~__SrsAmf0ObjectEOF() +{ +} + +int __SrsAmf0ObjectEOF::size() +{ + return SrsAmf0Size::object_eof(); +} + SrsAmf0Object::SrsAmf0Object() { marker = RTMP_AMF0_Object; @@ -709,6 +687,49 @@ int __SrsAmf0Boolean::size() return SrsAmf0Size::boolean(); } +__SrsAmf0Number::__SrsAmf0Number(double _value) +{ + marker = RTMP_AMF0_Number; + value = _value; +} + +__SrsAmf0Number::~__SrsAmf0Number() +{ +} + +int __SrsAmf0Number::size() +{ + return SrsAmf0Size::number(); +} + +__SrsAmf0Null::__SrsAmf0Null() +{ + marker = RTMP_AMF0_Null; +} + +__SrsAmf0Null::~__SrsAmf0Null() +{ +} + +int __SrsAmf0Null::size() +{ + return SrsAmf0Size::null(); +} + +__SrsAmf0Undefined::__SrsAmf0Undefined() +{ + marker = RTMP_AMF0_Undefined; +} + +__SrsAmf0Undefined::~__SrsAmf0Undefined() +{ +} + +int __SrsAmf0Undefined::size() +{ + return SrsAmf0Size::undefined(); +} + int srs_amf0_read_utf8(SrsStream* stream, std::string& value) { int ret = ERROR_SUCCESS; @@ -1073,22 +1094,21 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) if ((ret = srs_amf0_read_number(stream, data)) != ERROR_SUCCESS) { return ret; } - value = new SrsAmf0Number(); - srs_amf0_convert(value)->value = data; + value = SrsAmf0Any::number(data); return ret; } case RTMP_AMF0_Null: { stream->skip(1); - value = new SrsAmf0Null(); + value = new __SrsAmf0Null(); return ret; } case RTMP_AMF0_Undefined: { stream->skip(1); - value = new SrsAmf0Undefined(); + value = new __SrsAmf0Undefined(); return ret; } case RTMP_AMF0_ObjectEnd: { - SrsAmf0ObjectEOF* p = NULL; + __SrsAmf0ObjectEOF* p = NULL; if ((ret = srs_amf0_read_object_eof(stream, p)) != ERROR_SUCCESS) { return ret; } @@ -1137,7 +1157,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) return srs_amf0_write_boolean(stream, data); } case RTMP_AMF0_Number: { - double data = srs_amf0_convert(value)->value; + double data = srs_amf0_convert<__SrsAmf0Number>(value)->value; return srs_amf0_write_number(stream, data); } case RTMP_AMF0_Null: { @@ -1147,7 +1167,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) return srs_amf0_write_undefined(stream); } case RTMP_AMF0_ObjectEnd: { - SrsAmf0ObjectEOF* p = srs_amf0_convert(value); + __SrsAmf0ObjectEOF* p = srs_amf0_convert<__SrsAmf0ObjectEOF>(value); return srs_amf0_write_object_eof(stream, p); } case RTMP_AMF0_Object: { @@ -1169,7 +1189,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) return ret; } -int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value) +int srs_amf0_read_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF*& value) { int ret = ERROR_SUCCESS; @@ -1207,12 +1227,12 @@ int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value) } srs_verbose("amf0 read object eof marker success"); - value = new SrsAmf0ObjectEOF(); + value = new __SrsAmf0ObjectEOF(); srs_verbose("amf0 read object eof success"); return ret; } -int srs_amf0_write_object_eof(SrsStream* stream, SrsAmf0ObjectEOF* value) +int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF* value) { int ret = ERROR_SUCCESS; diff --git a/trunk/src/rtmp/srs_protocol_amf0.hpp b/trunk/src/rtmp/srs_protocol_amf0.hpp index 79dbc337b..ded950c37 100644 --- a/trunk/src/rtmp/srs_protocol_amf0.hpp +++ b/trunk/src/rtmp/srs_protocol_amf0.hpp @@ -67,75 +67,22 @@ public: virtual std::string to_str(); /** * get the boolean of any when is_boolean() indicates true. - * user must ensure the type is a is_boolean, or assert failed. + * user must ensure the type is a boolean, or assert failed. */ virtual bool to_boolean(); + /** + * get the number of any when is_number() indicates true. + * user must ensure the type is a number, or assert failed. + */ + virtual double to_number(); public: virtual int size() = 0; public: static SrsAmf0Any* str(const char* value = NULL); - static SrsAmf0Any* boolean(bool value = false); -}; - -/** -* read amf0 number from stream. -* 2.2 Number Type -* number-type = number-marker DOUBLE -* @return default value is 0. -*/ -class SrsAmf0Number : public SrsAmf0Any -{ -public: - double value; - - SrsAmf0Number(double _value = 0.0); - virtual ~SrsAmf0Number(); - - virtual int size(); -}; - -/** -* read amf0 null from stream. -* 2.7 null Type -* null-type = null-marker -*/ -class SrsAmf0Null : public SrsAmf0Any -{ -public: - SrsAmf0Null(); - virtual ~SrsAmf0Null(); - - virtual int size(); -}; - -/** -* read amf0 undefined from stream. -* 2.8 undefined Type -* undefined-type = undefined-marker -*/ -class SrsAmf0Undefined : public SrsAmf0Any -{ -public: - SrsAmf0Undefined(); - virtual ~SrsAmf0Undefined(); - - virtual int size(); -}; - -/** -* 2.11 Object End Type -* object-end-type = UTF-8-empty object-end-marker -* 0x00 0x00 0x09 -*/ -class SrsAmf0ObjectEOF : public SrsAmf0Any -{ -public: - int16_t utf8_empty; - - SrsAmf0ObjectEOF(); - virtual ~SrsAmf0ObjectEOF(); - - virtual int size(); + static SrsAmf0Any* boolean(bool value = false); + static SrsAmf0Any* number(double value = 0.0); + static SrsAmf0Any* null(); + static SrsAmf0Any* undefined(); }; /** @@ -144,14 +91,14 @@ public: * if ordered in map, the string compare order, the FMLE will creash when * get the response of connect app. */ -class SrsUnSortedHashtable +class __SrsUnSortedHashtable { private: typedef std::pair SrsObjectPropertyType; std::vector properties; public: - SrsUnSortedHashtable(); - virtual ~SrsUnSortedHashtable(); + __SrsUnSortedHashtable(); + virtual ~__SrsUnSortedHashtable(); virtual int size(); virtual void clear(); @@ -164,6 +111,22 @@ public: virtual SrsAmf0Any* ensure_property_number(std::string name); }; +/** +* 2.11 Object End Type +* object-end-type = UTF-8-empty object-end-marker +* 0x00 0x00 0x09 +*/ +class __SrsAmf0ObjectEOF : public SrsAmf0Any +{ +public: + int16_t utf8_empty; + + __SrsAmf0ObjectEOF(); + virtual ~__SrsAmf0ObjectEOF(); + + virtual int size(); +}; + /** * 2.5 Object Type * anonymous-object-type = object-marker *(object-property) @@ -172,9 +135,9 @@ public: class SrsAmf0Object : public SrsAmf0Any { private: - SrsUnSortedHashtable properties; + __SrsUnSortedHashtable properties; public: - SrsAmf0ObjectEOF eof; + __SrsAmf0ObjectEOF eof; SrsAmf0Object(); virtual ~SrsAmf0Object(); @@ -201,10 +164,10 @@ public: class SrsAmf0EcmaArray : public SrsAmf0Any { private: - SrsUnSortedHashtable properties; + __SrsUnSortedHashtable properties; public: int32_t count; - SrsAmf0ObjectEOF eof; + __SrsAmf0ObjectEOF eof; SrsAmf0EcmaArray(); virtual ~SrsAmf0EcmaArray(); @@ -276,6 +239,51 @@ public: virtual int size(); }; +/** +* read amf0 number from stream. +* 2.2 Number Type +* number-type = number-marker DOUBLE +* @return default value is 0. +*/ +class __SrsAmf0Number : public SrsAmf0Any +{ +public: + double value; + + __SrsAmf0Number(double _value); + virtual ~__SrsAmf0Number(); + + virtual int size(); +}; + +/** +* read amf0 null from stream. +* 2.7 null Type +* null-type = null-marker +*/ +class __SrsAmf0Null : public SrsAmf0Any +{ +public: + __SrsAmf0Null(); + virtual ~__SrsAmf0Null(); + + virtual int size(); +}; + +/** +* read amf0 undefined from stream. +* 2.8 undefined Type +* undefined-type = undefined-marker +*/ +class __SrsAmf0Undefined : public SrsAmf0Any +{ +public: + __SrsAmf0Undefined(); + virtual ~__SrsAmf0Undefined(); + + virtual int size(); +}; + /** * read amf0 utf8 string from stream. * 1.3.1 Strings and UTF-8 diff --git a/trunk/src/rtmp/srs_protocol_rtmp.cpp b/trunk/src/rtmp/srs_protocol_rtmp.cpp index 1f0e2c8ba..5c194826e 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp.cpp @@ -284,12 +284,12 @@ int SrsRtmpClient::connect_app(string app, string tc_url) pkt->command_object->set("swfUrl", SrsAmf0Any::str()); pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str())); pkt->command_object->set("fpad", SrsAmf0Any::boolean(false)); - pkt->command_object->set("capabilities", new SrsAmf0Number(239)); - pkt->command_object->set("audioCodecs", new SrsAmf0Number(3575)); - pkt->command_object->set("videoCodecs", new SrsAmf0Number(252)); - pkt->command_object->set("videoFunction", new SrsAmf0Number(1)); + pkt->command_object->set("capabilities", SrsAmf0Any::number(239)); + pkt->command_object->set("audioCodecs", SrsAmf0Any::number(3575)); + pkt->command_object->set("videoCodecs", SrsAmf0Any::number(252)); + pkt->command_object->set("videoFunction", SrsAmf0Any::number(1)); pkt->command_object->set("pageUrl", SrsAmf0Any::str()); - pkt->command_object->set("objectEncoding", new SrsAmf0Number(0)); + pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0)); if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { return ret; @@ -643,7 +643,7 @@ int SrsRtmpServer::connect_app(SrsRequest* req) } if ((prop = pkt->command_object->ensure_property_number("objectEncoding")) != NULL) { - req->objectEncoding = srs_amf0_convert(prop)->value; + req->objectEncoding = prop->to_number(); } srs_info("get connect app message params success."); @@ -699,13 +699,13 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip) SrsConnectAppResPacket* pkt = new SrsConnectAppResPacket(); pkt->props->set("fmsVer", SrsAmf0Any::str("FMS/"RTMP_SIG_FMS_VER)); - pkt->props->set("capabilities", new SrsAmf0Number(127)); - pkt->props->set("mode", new SrsAmf0Number(1)); + pkt->props->set("capabilities", SrsAmf0Any::number(127)); + pkt->props->set("mode", SrsAmf0Any::number(1)); pkt->info->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); pkt->info->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectSuccess)); pkt->info->set(StatusDescription, SrsAmf0Any::str("Connection succeeded")); - pkt->info->set("objectEncoding", new SrsAmf0Number(req->objectEncoding)); + pkt->info->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding)); SrsAmf0EcmaArray* data = new SrsAmf0EcmaArray(); pkt->info->set("data", data); @@ -745,7 +745,7 @@ void SrsRtmpServer::response_connect_reject(SrsRequest *req, const char* desc) pkt->props->set(StatusLevel, SrsAmf0Any::str(StatusLevelError)); pkt->props->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectRejected)); pkt->props->set(StatusDescription, SrsAmf0Any::str(desc)); - //pkt->props->set("objectEncoding", new SrsAmf0Number(req->objectEncoding)); + //pkt->props->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding)); SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { diff --git a/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp b/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp index ffd63d57b..b5a10b3bd 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp @@ -1957,7 +1957,7 @@ SrsCreateStreamPacket::SrsCreateStreamPacket() { command_name = RTMP_AMF0_COMMAND_CREATE_STREAM; transaction_id = 2; - command_object = new SrsAmf0Null(); + command_object = SrsAmf0Any::null(); } SrsCreateStreamPacket::~SrsCreateStreamPacket() @@ -2042,7 +2042,7 @@ SrsCreateStreamResPacket::SrsCreateStreamResPacket(double _transaction_id, doubl { command_name = RTMP_AMF0_COMMAND_RESULT; transaction_id = _transaction_id; - command_object = new SrsAmf0Null(); + command_object = SrsAmf0Any::null(); stream_id = _stream_id; } @@ -2140,7 +2140,7 @@ SrsCloseStreamPacket::SrsCloseStreamPacket() { command_name = RTMP_AMF0_COMMAND_CLOSE_STREAM; transaction_id = 0; - command_object = new SrsAmf0Null(); + command_object = SrsAmf0Any::null(); } SrsCloseStreamPacket::~SrsCloseStreamPacket() @@ -2175,7 +2175,7 @@ SrsFMLEStartPacket::SrsFMLEStartPacket() { command_name = RTMP_AMF0_COMMAND_RELEASE_STREAM; transaction_id = 0; - command_object = new SrsAmf0Null(); + command_object = SrsAmf0Any::null(); } SrsFMLEStartPacket::~SrsFMLEStartPacket() @@ -2298,8 +2298,8 @@ SrsFMLEStartResPacket::SrsFMLEStartResPacket(double _transaction_id) { command_name = RTMP_AMF0_COMMAND_RESULT; transaction_id = _transaction_id; - command_object = new SrsAmf0Null(); - args = new SrsAmf0Undefined(); + command_object = SrsAmf0Any::null(); + args = SrsAmf0Any::undefined(); } SrsFMLEStartResPacket::~SrsFMLEStartResPacket() @@ -2397,7 +2397,7 @@ SrsPublishPacket::SrsPublishPacket() { command_name = RTMP_AMF0_COMMAND_PUBLISH; transaction_id = 0; - command_object = new SrsAmf0Null(); + command_object = SrsAmf0Any::null(); type = "live"; } @@ -2506,7 +2506,7 @@ SrsPausePacket::SrsPausePacket() { command_name = RTMP_AMF0_COMMAND_PAUSE; transaction_id = 0; - command_object = new SrsAmf0Null(); + command_object = SrsAmf0Any::null(); time_ms = 0; is_pause = true; @@ -2561,7 +2561,7 @@ SrsPlayPacket::SrsPlayPacket() { command_name = RTMP_AMF0_COMMAND_PLAY; transaction_id = 0; - command_object = new SrsAmf0Null(); + command_object = SrsAmf0Any::null(); start = -2; duration = -1; @@ -2630,7 +2630,7 @@ int SrsPlayPacket::decode(SrsStream* stream) if (reset_value->is_boolean()) { reset = reset_value->to_boolean(); } else if (reset_value->is_number()) { - reset = (srs_amf0_convert(reset_value)->value == 0 ? false : true); + reset = (reset_value->to_number() == 0 ? false : true); } else { ret = ERROR_RTMP_AMF0_DECODE; srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret); @@ -2715,7 +2715,7 @@ SrsPlayResPacket::SrsPlayResPacket() { command_name = RTMP_AMF0_COMMAND_RESULT; transaction_id = 0; - command_object = new SrsAmf0Null(); + command_object = SrsAmf0Any::null(); desc = new SrsAmf0Object(); } @@ -2779,7 +2779,7 @@ SrsOnBWDonePacket::SrsOnBWDonePacket() { command_name = RTMP_AMF0_COMMAND_ON_BW_DONE; transaction_id = 0; - args = new SrsAmf0Null(); + args = SrsAmf0Any::null(); } SrsOnBWDonePacket::~SrsOnBWDonePacket() @@ -2834,7 +2834,7 @@ SrsOnStatusCallPacket::SrsOnStatusCallPacket() { command_name = RTMP_AMF0_COMMAND_ON_STATUS; transaction_id = 0; - args = new SrsAmf0Null(); + args = SrsAmf0Any::null(); data = new SrsAmf0Object(); } @@ -2897,7 +2897,7 @@ SrsBandwidthPacket::SrsBandwidthPacket() { command_name = RTMP_AMF0_COMMAND_ON_STATUS; transaction_id = 0; - args = new SrsAmf0Null(); + args = SrsAmf0Any::null(); data = new SrsAmf0Object(); } diff --git a/trunk/src/rtmp/srs_protocol_rtmp_stack.hpp b/trunk/src/rtmp/srs_protocol_rtmp_stack.hpp index e299304fb..d56348beb 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp_stack.hpp +++ b/trunk/src/rtmp/srs_protocol_rtmp_stack.hpp @@ -86,8 +86,7 @@ class SrsStream; class SrsCommonMessage; class SrsChunkStream; class SrsAmf0Object; -class SrsAmf0Null; -class SrsAmf0Undefined; +class SrsAmf0Any; class ISrsMessage; // convert class name to string. @@ -600,7 +599,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; + SrsAmf0Any* command_object; // null public: SrsCreateStreamPacket(); virtual ~SrsCreateStreamPacket(); @@ -629,7 +628,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; + SrsAmf0Any* command_object; // null double stream_id; public: SrsCreateStreamResPacket(double _transaction_id, double _stream_id); @@ -659,7 +658,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; + SrsAmf0Any* command_object; // null public: SrsCloseStreamPacket(); virtual ~SrsCloseStreamPacket(); @@ -682,7 +681,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; + SrsAmf0Any* command_object; // null std::string stream_name; public: SrsFMLEStartPacket(); @@ -715,8 +714,8 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; - SrsAmf0Undefined* args; + SrsAmf0Any* command_object; // null + SrsAmf0Any* args; // undefined public: SrsFMLEStartResPacket(double _transaction_id); virtual ~SrsFMLEStartResPacket(); @@ -750,7 +749,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; + SrsAmf0Any* command_object; // null std::string stream_name; // optional, default to live. std::string type; @@ -785,7 +784,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; + SrsAmf0Any* command_object; // null bool is_pause; double time_ms; public: @@ -811,7 +810,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; + SrsAmf0Any* command_object; // null std::string stream_name; double start; double duration; @@ -845,7 +844,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* command_object; + SrsAmf0Any* command_object; // null SrsAmf0Object* desc; public: SrsPlayResPacket(); @@ -874,7 +873,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* args; + SrsAmf0Any* args; // null public: SrsOnBWDonePacket(); virtual ~SrsOnBWDonePacket(); @@ -903,7 +902,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* args; + SrsAmf0Any* args; // null SrsAmf0Object* data; public: SrsOnStatusCallPacket(); @@ -936,7 +935,7 @@ protected: public: std::string command_name; double transaction_id; - SrsAmf0Null* args; + SrsAmf0Any* args; // null SrsAmf0Object* data; public: SrsBandwidthPacket(); diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index 14852ed83..5b414ae97 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -63,7 +63,7 @@ VOID TEST(AMF0Test, Size) SrsAmf0Object o; size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number(); - o.set("age", new SrsAmf0Number(9)); + o.set("age", SrsAmf0Any::number(9)); EXPECT_EQ(size, SrsAmf0Size::object(&o)); } @@ -72,7 +72,7 @@ VOID TEST(AMF0Test, Size) SrsAmf0Object o; size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null(); - o.set("email", new SrsAmf0Null()); + o.set("email", SrsAmf0Any::null()); EXPECT_EQ(size, SrsAmf0Size::object(&o)); } @@ -81,7 +81,7 @@ VOID TEST(AMF0Test, Size) SrsAmf0Object o; size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined(); - o.set("email", new SrsAmf0Undefined()); + o.set("email", SrsAmf0Any::undefined()); EXPECT_EQ(size, SrsAmf0Size::object(&o)); } @@ -117,7 +117,7 @@ VOID TEST(AMF0Test, Size) SrsAmf0EcmaArray o; size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number(); - o.set("age", new SrsAmf0Number(9)); + o.set("age", SrsAmf0Any::number(9)); EXPECT_EQ(size, SrsAmf0Size::array(&o)); } @@ -126,7 +126,7 @@ VOID TEST(AMF0Test, Size) SrsAmf0EcmaArray o; size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null(); - o.set("email", new SrsAmf0Null()); + o.set("email", SrsAmf0Any::null()); EXPECT_EQ(size, SrsAmf0Size::array(&o)); } @@ -135,7 +135,7 @@ VOID TEST(AMF0Test, Size) SrsAmf0EcmaArray o; size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined(); - o.set("email", new SrsAmf0Undefined()); + o.set("email", SrsAmf0Any::undefined()); EXPECT_EQ(size, SrsAmf0Size::array(&o)); } @@ -177,7 +177,7 @@ VOID TEST(AMF0Test, Size) o.set("args", args); SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray(); - params->set("p1", new SrsAmf0Number(10)); + params->set("p1", SrsAmf0Any::number(10)); size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params); o.set("params", params); @@ -212,7 +212,7 @@ VOID TEST(AMF0Test, Size) o.set("args", args); SrsAmf0Object* params = new SrsAmf0Object(); - params->set("p1", new SrsAmf0Number(10)); + params->set("p1", SrsAmf0Any::number(10)); size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params); o.set("params", params); @@ -233,7 +233,7 @@ VOID TEST(AMF0Test, Size) o.set("args", args); SrsAmf0Object* params = new SrsAmf0Object(); - params->set("p1", new SrsAmf0Number(10)); + params->set("p1", SrsAmf0Any::number(10)); size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params); o.set("params", params); @@ -254,7 +254,7 @@ VOID TEST(AMF0Test, Size) o.set("args", args); SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray(); - params->set("p1", new SrsAmf0Number(10)); + params->set("p1", SrsAmf0Any::number(10)); size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params); o.set("params", params); @@ -304,4 +304,43 @@ VOID TEST(AMF0Test, AnyElem) EXPECT_TRUE(o->is_boolean()); EXPECT_TRUE(o->to_boolean()); } + + // number + if (true) { + o = SrsAmf0Any::number(); + SrsAutoFree(SrsAmf0Any, o, false); + EXPECT_TRUE(NULL != o); + EXPECT_TRUE(o->is_number()); + EXPECT_DOUBLE_EQ(0, o->to_number()); + } + if (true) { + o = SrsAmf0Any::number(100); + SrsAutoFree(SrsAmf0Any, o, false); + EXPECT_TRUE(NULL != o); + EXPECT_TRUE(o->is_number()); + EXPECT_DOUBLE_EQ(100, o->to_number()); + } + if (true) { + o = SrsAmf0Any::number(-100); + SrsAutoFree(SrsAmf0Any, o, false); + EXPECT_TRUE(NULL != o); + EXPECT_TRUE(o->is_number()); + EXPECT_DOUBLE_EQ(-100, o->to_number()); + } + + // null + if (true) { + o = SrsAmf0Any::null(); + SrsAutoFree(SrsAmf0Any, o, false); + EXPECT_TRUE(NULL != o); + EXPECT_TRUE(o->is_null()); + } + + // undefined + if (true) { + o = SrsAmf0Any::undefined(); + SrsAutoFree(SrsAmf0Any, o, false); + EXPECT_TRUE(NULL != o); + EXPECT_TRUE(o->is_undefined()); + } }