diff --git a/trunk/src/rtmp/srs_protocol_amf0.cpp b/trunk/src/rtmp/srs_protocol_amf0.cpp index 31941f8fb..9fd208ad2 100644 --- a/trunk/src/rtmp/srs_protocol_amf0.cpp +++ b/trunk/src/rtmp/srs_protocol_amf0.cpp @@ -105,12 +105,18 @@ bool SrsAmf0Any::is_ecma_array() return marker == RTMP_AMF0_EcmaArray; } -std::string SrsAmf0Any::to_str() +string SrsAmf0Any::to_str() { __SrsAmf0String* o = srs_amf0_convert<__SrsAmf0String>(this); return o->value; } +bool SrsAmf0Any::to_boolean() +{ + __SrsAmf0Boolean* o = srs_amf0_convert<__SrsAmf0Boolean>(this); + return o->value; +} + bool SrsAmf0Any::is_object_eof() { return marker == RTMP_AMF0_ObjectEnd; @@ -121,36 +127,9 @@ SrsAmf0Any* SrsAmf0Any::str(const char* value) return new __SrsAmf0String(value); } -__SrsAmf0String::__SrsAmf0String(const char* _value) -{ - marker = RTMP_AMF0_String; - if (_value) { - value = _value; - } -} - -__SrsAmf0String::~__SrsAmf0String() -{ -} - -int __SrsAmf0String::size() -{ - return SrsAmf0Size::str(value); -} - -SrsAmf0Boolean::SrsAmf0Boolean(bool _value) +SrsAmf0Any* SrsAmf0Any::boolean(bool value) { - marker = RTMP_AMF0_Boolean; - value = _value; -} - -SrsAmf0Boolean::~SrsAmf0Boolean() -{ -} - -int SrsAmf0Boolean::size() -{ - return SrsAmf0Size::boolean(); + return new __SrsAmf0Boolean(value); } SrsAmf0Number::SrsAmf0Number(double _value) @@ -698,6 +677,38 @@ int SrsAmf0Size::any(SrsAmf0Any* o) return o->size(); } +__SrsAmf0String::__SrsAmf0String(const char* _value) +{ + marker = RTMP_AMF0_String; + if (_value) { + value = _value; + } +} + +__SrsAmf0String::~__SrsAmf0String() +{ +} + +int __SrsAmf0String::size() +{ + return SrsAmf0Size::str(value); +} + +__SrsAmf0Boolean::__SrsAmf0Boolean(bool _value) +{ + marker = RTMP_AMF0_Boolean; + value = _value; +} + +__SrsAmf0Boolean::~__SrsAmf0Boolean() +{ +} + +int __SrsAmf0Boolean::size() +{ + return SrsAmf0Size::boolean(); +} + int srs_amf0_read_utf8(SrsStream* stream, std::string& value) { int ret = ERROR_SUCCESS; @@ -1046,8 +1057,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) if ((ret = srs_amf0_read_string(stream, data)) != ERROR_SUCCESS) { return ret; } - value = SrsAmf0Any::str(); - srs_amf0_convert<__SrsAmf0String>(value)->value = data; + value = SrsAmf0Any::str(data.c_str()); return ret; } case RTMP_AMF0_Boolean: { @@ -1055,8 +1065,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) if ((ret = srs_amf0_read_boolean(stream, data)) != ERROR_SUCCESS) { return ret; } - value = new SrsAmf0Boolean(); - srs_amf0_convert(value)->value = data; + value = SrsAmf0Any::boolean(data); return ret; } case RTMP_AMF0_Number: { @@ -1124,7 +1133,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) return srs_amf0_write_string(stream, data); } case RTMP_AMF0_Boolean: { - bool data = srs_amf0_convert(value)->value; + bool data = srs_amf0_convert<__SrsAmf0Boolean>(value)->value; return srs_amf0_write_boolean(stream, data); } case RTMP_AMF0_Number: { diff --git a/trunk/src/rtmp/srs_protocol_amf0.hpp b/trunk/src/rtmp/srs_protocol_amf0.hpp index 06cceb4c3..79dbc337b 100644 --- a/trunk/src/rtmp/srs_protocol_amf0.hpp +++ b/trunk/src/rtmp/srs_protocol_amf0.hpp @@ -65,46 +65,16 @@ public: * user must ensure the type is a string, or assert failed. */ 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. + */ + virtual bool to_boolean(); public: virtual int size() = 0; public: static SrsAmf0Any* str(const char* value = NULL); -}; - -/** -* read amf0 string from stream. -* 2.4 String Type -* string-type = string-marker UTF-8 -* @return default value is empty string. -* @remark: use SrsAmf0Any::str() to create it. -*/ -class __SrsAmf0String : public SrsAmf0Any -{ -public: - std::string value; - - __SrsAmf0String(const char* _value); - virtual ~__SrsAmf0String(); - - virtual int size(); -}; - -/** -* read amf0 boolean from stream. -* 2.4 String Type -* boolean-type = boolean-marker U8 -* 0 is false, <> 0 is true -* @return default value is false. -*/ -class SrsAmf0Boolean : public SrsAmf0Any -{ -public: - bool value; - - SrsAmf0Boolean(bool _value = false); - virtual ~SrsAmf0Boolean(); - - virtual int size(); + static SrsAmf0Any* boolean(bool value = false); }; /** @@ -270,6 +240,42 @@ public: static int any(SrsAmf0Any* o); }; +/** +* read amf0 string from stream. +* 2.4 String Type +* string-type = string-marker UTF-8 +* @return default value is empty string. +* @remark: use SrsAmf0Any::str() to create it. +*/ +class __SrsAmf0String : public SrsAmf0Any +{ +public: + std::string value; + + __SrsAmf0String(const char* _value); + virtual ~__SrsAmf0String(); + + virtual int size(); +}; + +/** +* read amf0 boolean from stream. +* 2.4 String Type +* boolean-type = boolean-marker U8 +* 0 is false, <> 0 is true +* @return default value is false. +*/ +class __SrsAmf0Boolean : public SrsAmf0Any +{ +public: + bool value; + + __SrsAmf0Boolean(bool _value); + virtual ~__SrsAmf0Boolean(); + + 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 aad6013b0..1f0e2c8ba 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp.cpp @@ -283,7 +283,7 @@ int SrsRtmpClient::connect_app(string app, string tc_url) pkt->command_object->set("app", SrsAmf0Any::str(app.c_str())); pkt->command_object->set("swfUrl", SrsAmf0Any::str()); pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str())); - pkt->command_object->set("fpad", new SrsAmf0Boolean(false)); + 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)); diff --git a/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp b/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp index 7cd0d0dfb..ffd63d57b 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp @@ -2628,7 +2628,7 @@ int SrsPlayPacket::decode(SrsStream* stream) // An optional Boolean value or number that specifies whether // to flush any previous playlist if (reset_value->is_boolean()) { - reset = srs_amf0_convert(reset_value)->value; + reset = reset_value->to_boolean(); } else if (reset_value->is_number()) { reset = (srs_amf0_convert(reset_value)->value == 0 ? false : true); } else { diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index 9df0db4be..14852ed83 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -90,7 +90,7 @@ VOID TEST(AMF0Test, Size) SrsAmf0Object o; size += SrsAmf0Size::utf8("sex")+SrsAmf0Size::boolean(); - o.set("sex", new SrsAmf0Boolean(true)); + o.set("sex", SrsAmf0Any::boolean(true)); EXPECT_EQ(size, SrsAmf0Size::object(&o)); } @@ -144,7 +144,7 @@ VOID TEST(AMF0Test, Size) SrsAmf0EcmaArray o; size += SrsAmf0Size::utf8("sex")+SrsAmf0Size::boolean(); - o.set("sex", new SrsAmf0Boolean(true)); + o.set("sex", SrsAmf0Any::boolean(true)); EXPECT_EQ(size, SrsAmf0Size::array(&o)); } @@ -281,4 +281,27 @@ VOID TEST(AMF0Test, AnyElem) EXPECT_TRUE(o->is_string()); EXPECT_STREQ("winlin", o->to_str().c_str()); } + + // bool + if (true) { + o = SrsAmf0Any::boolean(); + SrsAutoFree(SrsAmf0Any, o, false); + EXPECT_TRUE(NULL != o); + EXPECT_TRUE(o->is_boolean()); + EXPECT_FALSE(o->to_boolean()); + } + if (true) { + o = SrsAmf0Any::boolean(false); + SrsAutoFree(SrsAmf0Any, o, false); + EXPECT_TRUE(NULL != o); + EXPECT_TRUE(o->is_boolean()); + EXPECT_FALSE(o->to_boolean()); + } + if (true) { + o = SrsAmf0Any::boolean(true); + SrsAutoFree(SrsAmf0Any, o, false); + EXPECT_TRUE(NULL != o); + EXPECT_TRUE(o->is_boolean()); + EXPECT_TRUE(o->to_boolean()); + } }