正在显示
5 个修改的文件
包含
113 行增加
和
75 行删除
| @@ -105,12 +105,18 @@ bool SrsAmf0Any::is_ecma_array() | @@ -105,12 +105,18 @@ bool SrsAmf0Any::is_ecma_array() | ||
| 105 | return marker == RTMP_AMF0_EcmaArray; | 105 | return marker == RTMP_AMF0_EcmaArray; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | -std::string SrsAmf0Any::to_str() | 108 | +string SrsAmf0Any::to_str() |
| 109 | { | 109 | { |
| 110 | __SrsAmf0String* o = srs_amf0_convert<__SrsAmf0String>(this); | 110 | __SrsAmf0String* o = srs_amf0_convert<__SrsAmf0String>(this); |
| 111 | return o->value; | 111 | return o->value; |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | +bool SrsAmf0Any::to_boolean() | ||
| 115 | +{ | ||
| 116 | + __SrsAmf0Boolean* o = srs_amf0_convert<__SrsAmf0Boolean>(this); | ||
| 117 | + return o->value; | ||
| 118 | +} | ||
| 119 | + | ||
| 114 | bool SrsAmf0Any::is_object_eof() | 120 | bool SrsAmf0Any::is_object_eof() |
| 115 | { | 121 | { |
| 116 | return marker == RTMP_AMF0_ObjectEnd; | 122 | return marker == RTMP_AMF0_ObjectEnd; |
| @@ -121,36 +127,9 @@ SrsAmf0Any* SrsAmf0Any::str(const char* value) | @@ -121,36 +127,9 @@ SrsAmf0Any* SrsAmf0Any::str(const char* value) | ||
| 121 | return new __SrsAmf0String(value); | 127 | return new __SrsAmf0String(value); |
| 122 | } | 128 | } |
| 123 | 129 | ||
| 124 | -__SrsAmf0String::__SrsAmf0String(const char* _value) | ||
| 125 | -{ | ||
| 126 | - marker = RTMP_AMF0_String; | ||
| 127 | - if (_value) { | ||
| 128 | - value = _value; | ||
| 129 | - } | ||
| 130 | -} | ||
| 131 | - | ||
| 132 | -__SrsAmf0String::~__SrsAmf0String() | ||
| 133 | -{ | ||
| 134 | -} | ||
| 135 | - | ||
| 136 | -int __SrsAmf0String::size() | ||
| 137 | -{ | ||
| 138 | - return SrsAmf0Size::str(value); | ||
| 139 | -} | ||
| 140 | - | ||
| 141 | -SrsAmf0Boolean::SrsAmf0Boolean(bool _value) | 130 | +SrsAmf0Any* SrsAmf0Any::boolean(bool value) |
| 142 | { | 131 | { |
| 143 | - marker = RTMP_AMF0_Boolean; | ||
| 144 | - value = _value; | ||
| 145 | -} | ||
| 146 | - | ||
| 147 | -SrsAmf0Boolean::~SrsAmf0Boolean() | ||
| 148 | -{ | ||
| 149 | -} | ||
| 150 | - | ||
| 151 | -int SrsAmf0Boolean::size() | ||
| 152 | -{ | ||
| 153 | - return SrsAmf0Size::boolean(); | 132 | + return new __SrsAmf0Boolean(value); |
| 154 | } | 133 | } |
| 155 | 134 | ||
| 156 | SrsAmf0Number::SrsAmf0Number(double _value) | 135 | SrsAmf0Number::SrsAmf0Number(double _value) |
| @@ -698,6 +677,38 @@ int SrsAmf0Size::any(SrsAmf0Any* o) | @@ -698,6 +677,38 @@ int SrsAmf0Size::any(SrsAmf0Any* o) | ||
| 698 | return o->size(); | 677 | return o->size(); |
| 699 | } | 678 | } |
| 700 | 679 | ||
| 680 | +__SrsAmf0String::__SrsAmf0String(const char* _value) | ||
| 681 | +{ | ||
| 682 | + marker = RTMP_AMF0_String; | ||
| 683 | + if (_value) { | ||
| 684 | + value = _value; | ||
| 685 | + } | ||
| 686 | +} | ||
| 687 | + | ||
| 688 | +__SrsAmf0String::~__SrsAmf0String() | ||
| 689 | +{ | ||
| 690 | +} | ||
| 691 | + | ||
| 692 | +int __SrsAmf0String::size() | ||
| 693 | +{ | ||
| 694 | + return SrsAmf0Size::str(value); | ||
| 695 | +} | ||
| 696 | + | ||
| 697 | +__SrsAmf0Boolean::__SrsAmf0Boolean(bool _value) | ||
| 698 | +{ | ||
| 699 | + marker = RTMP_AMF0_Boolean; | ||
| 700 | + value = _value; | ||
| 701 | +} | ||
| 702 | + | ||
| 703 | +__SrsAmf0Boolean::~__SrsAmf0Boolean() | ||
| 704 | +{ | ||
| 705 | +} | ||
| 706 | + | ||
| 707 | +int __SrsAmf0Boolean::size() | ||
| 708 | +{ | ||
| 709 | + return SrsAmf0Size::boolean(); | ||
| 710 | +} | ||
| 711 | + | ||
| 701 | int srs_amf0_read_utf8(SrsStream* stream, std::string& value) | 712 | int srs_amf0_read_utf8(SrsStream* stream, std::string& value) |
| 702 | { | 713 | { |
| 703 | int ret = ERROR_SUCCESS; | 714 | int ret = ERROR_SUCCESS; |
| @@ -1046,8 +1057,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) | @@ -1046,8 +1057,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) | ||
| 1046 | if ((ret = srs_amf0_read_string(stream, data)) != ERROR_SUCCESS) { | 1057 | if ((ret = srs_amf0_read_string(stream, data)) != ERROR_SUCCESS) { |
| 1047 | return ret; | 1058 | return ret; |
| 1048 | } | 1059 | } |
| 1049 | - value = SrsAmf0Any::str(); | ||
| 1050 | - srs_amf0_convert<__SrsAmf0String>(value)->value = data; | 1060 | + value = SrsAmf0Any::str(data.c_str()); |
| 1051 | return ret; | 1061 | return ret; |
| 1052 | } | 1062 | } |
| 1053 | case RTMP_AMF0_Boolean: { | 1063 | case RTMP_AMF0_Boolean: { |
| @@ -1055,8 +1065,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) | @@ -1055,8 +1065,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) | ||
| 1055 | if ((ret = srs_amf0_read_boolean(stream, data)) != ERROR_SUCCESS) { | 1065 | if ((ret = srs_amf0_read_boolean(stream, data)) != ERROR_SUCCESS) { |
| 1056 | return ret; | 1066 | return ret; |
| 1057 | } | 1067 | } |
| 1058 | - value = new SrsAmf0Boolean(); | ||
| 1059 | - srs_amf0_convert<SrsAmf0Boolean>(value)->value = data; | 1068 | + value = SrsAmf0Any::boolean(data); |
| 1060 | return ret; | 1069 | return ret; |
| 1061 | } | 1070 | } |
| 1062 | case RTMP_AMF0_Number: { | 1071 | case RTMP_AMF0_Number: { |
| @@ -1124,7 +1133,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) | @@ -1124,7 +1133,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) | ||
| 1124 | return srs_amf0_write_string(stream, data); | 1133 | return srs_amf0_write_string(stream, data); |
| 1125 | } | 1134 | } |
| 1126 | case RTMP_AMF0_Boolean: { | 1135 | case RTMP_AMF0_Boolean: { |
| 1127 | - bool data = srs_amf0_convert<SrsAmf0Boolean>(value)->value; | 1136 | + bool data = srs_amf0_convert<__SrsAmf0Boolean>(value)->value; |
| 1128 | return srs_amf0_write_boolean(stream, data); | 1137 | return srs_amf0_write_boolean(stream, data); |
| 1129 | } | 1138 | } |
| 1130 | case RTMP_AMF0_Number: { | 1139 | case RTMP_AMF0_Number: { |
| @@ -65,46 +65,16 @@ public: | @@ -65,46 +65,16 @@ public: | ||
| 65 | * user must ensure the type is a string, or assert failed. | 65 | * user must ensure the type is a string, or assert failed. |
| 66 | */ | 66 | */ |
| 67 | virtual std::string to_str(); | 67 | virtual std::string to_str(); |
| 68 | + /** | ||
| 69 | + * get the boolean of any when is_boolean() indicates true. | ||
| 70 | + * user must ensure the type is a is_boolean, or assert failed. | ||
| 71 | + */ | ||
| 72 | + virtual bool to_boolean(); | ||
| 68 | public: | 73 | public: |
| 69 | virtual int size() = 0; | 74 | virtual int size() = 0; |
| 70 | public: | 75 | public: |
| 71 | static SrsAmf0Any* str(const char* value = NULL); | 76 | static SrsAmf0Any* str(const char* value = NULL); |
| 72 | -}; | ||
| 73 | - | ||
| 74 | -/** | ||
| 75 | -* read amf0 string from stream. | ||
| 76 | -* 2.4 String Type | ||
| 77 | -* string-type = string-marker UTF-8 | ||
| 78 | -* @return default value is empty string. | ||
| 79 | -* @remark: use SrsAmf0Any::str() to create it. | ||
| 80 | -*/ | ||
| 81 | -class __SrsAmf0String : public SrsAmf0Any | ||
| 82 | -{ | ||
| 83 | -public: | ||
| 84 | - std::string value; | ||
| 85 | - | ||
| 86 | - __SrsAmf0String(const char* _value); | ||
| 87 | - virtual ~__SrsAmf0String(); | ||
| 88 | - | ||
| 89 | - virtual int size(); | ||
| 90 | -}; | ||
| 91 | - | ||
| 92 | -/** | ||
| 93 | -* read amf0 boolean from stream. | ||
| 94 | -* 2.4 String Type | ||
| 95 | -* boolean-type = boolean-marker U8 | ||
| 96 | -* 0 is false, <> 0 is true | ||
| 97 | -* @return default value is false. | ||
| 98 | -*/ | ||
| 99 | -class SrsAmf0Boolean : public SrsAmf0Any | ||
| 100 | -{ | ||
| 101 | -public: | ||
| 102 | - bool value; | ||
| 103 | - | ||
| 104 | - SrsAmf0Boolean(bool _value = false); | ||
| 105 | - virtual ~SrsAmf0Boolean(); | ||
| 106 | - | ||
| 107 | - virtual int size(); | 77 | + static SrsAmf0Any* boolean(bool value = false); |
| 108 | }; | 78 | }; |
| 109 | 79 | ||
| 110 | /** | 80 | /** |
| @@ -271,6 +241,42 @@ public: | @@ -271,6 +241,42 @@ public: | ||
| 271 | }; | 241 | }; |
| 272 | 242 | ||
| 273 | /** | 243 | /** |
| 244 | +* read amf0 string from stream. | ||
| 245 | +* 2.4 String Type | ||
| 246 | +* string-type = string-marker UTF-8 | ||
| 247 | +* @return default value is empty string. | ||
| 248 | +* @remark: use SrsAmf0Any::str() to create it. | ||
| 249 | +*/ | ||
| 250 | +class __SrsAmf0String : public SrsAmf0Any | ||
| 251 | +{ | ||
| 252 | +public: | ||
| 253 | + std::string value; | ||
| 254 | + | ||
| 255 | + __SrsAmf0String(const char* _value); | ||
| 256 | + virtual ~__SrsAmf0String(); | ||
| 257 | + | ||
| 258 | + virtual int size(); | ||
| 259 | +}; | ||
| 260 | + | ||
| 261 | +/** | ||
| 262 | +* read amf0 boolean from stream. | ||
| 263 | +* 2.4 String Type | ||
| 264 | +* boolean-type = boolean-marker U8 | ||
| 265 | +* 0 is false, <> 0 is true | ||
| 266 | +* @return default value is false. | ||
| 267 | +*/ | ||
| 268 | +class __SrsAmf0Boolean : public SrsAmf0Any | ||
| 269 | +{ | ||
| 270 | +public: | ||
| 271 | + bool value; | ||
| 272 | + | ||
| 273 | + __SrsAmf0Boolean(bool _value); | ||
| 274 | + virtual ~__SrsAmf0Boolean(); | ||
| 275 | + | ||
| 276 | + virtual int size(); | ||
| 277 | +}; | ||
| 278 | + | ||
| 279 | +/** | ||
| 274 | * read amf0 utf8 string from stream. | 280 | * read amf0 utf8 string from stream. |
| 275 | * 1.3.1 Strings and UTF-8 | 281 | * 1.3.1 Strings and UTF-8 |
| 276 | * UTF-8 = U16 *(UTF8-char) | 282 | * UTF-8 = U16 *(UTF8-char) |
| @@ -283,7 +283,7 @@ int SrsRtmpClient::connect_app(string app, string tc_url) | @@ -283,7 +283,7 @@ int SrsRtmpClient::connect_app(string app, string tc_url) | ||
| 283 | pkt->command_object->set("app", SrsAmf0Any::str(app.c_str())); | 283 | pkt->command_object->set("app", SrsAmf0Any::str(app.c_str())); |
| 284 | pkt->command_object->set("swfUrl", SrsAmf0Any::str()); | 284 | pkt->command_object->set("swfUrl", SrsAmf0Any::str()); |
| 285 | pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str())); | 285 | pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str())); |
| 286 | - pkt->command_object->set("fpad", new SrsAmf0Boolean(false)); | 286 | + pkt->command_object->set("fpad", SrsAmf0Any::boolean(false)); |
| 287 | pkt->command_object->set("capabilities", new SrsAmf0Number(239)); | 287 | pkt->command_object->set("capabilities", new SrsAmf0Number(239)); |
| 288 | pkt->command_object->set("audioCodecs", new SrsAmf0Number(3575)); | 288 | pkt->command_object->set("audioCodecs", new SrsAmf0Number(3575)); |
| 289 | pkt->command_object->set("videoCodecs", new SrsAmf0Number(252)); | 289 | pkt->command_object->set("videoCodecs", new SrsAmf0Number(252)); |
| @@ -2628,7 +2628,7 @@ int SrsPlayPacket::decode(SrsStream* stream) | @@ -2628,7 +2628,7 @@ int SrsPlayPacket::decode(SrsStream* stream) | ||
| 2628 | // An optional Boolean value or number that specifies whether | 2628 | // An optional Boolean value or number that specifies whether |
| 2629 | // to flush any previous playlist | 2629 | // to flush any previous playlist |
| 2630 | if (reset_value->is_boolean()) { | 2630 | if (reset_value->is_boolean()) { |
| 2631 | - reset = srs_amf0_convert<SrsAmf0Boolean>(reset_value)->value; | 2631 | + reset = reset_value->to_boolean(); |
| 2632 | } else if (reset_value->is_number()) { | 2632 | } else if (reset_value->is_number()) { |
| 2633 | reset = (srs_amf0_convert<SrsAmf0Number>(reset_value)->value == 0 ? false : true); | 2633 | reset = (srs_amf0_convert<SrsAmf0Number>(reset_value)->value == 0 ? false : true); |
| 2634 | } else { | 2634 | } else { |
| @@ -90,7 +90,7 @@ VOID TEST(AMF0Test, Size) | @@ -90,7 +90,7 @@ VOID TEST(AMF0Test, Size) | ||
| 90 | SrsAmf0Object o; | 90 | SrsAmf0Object o; |
| 91 | 91 | ||
| 92 | size += SrsAmf0Size::utf8("sex")+SrsAmf0Size::boolean(); | 92 | size += SrsAmf0Size::utf8("sex")+SrsAmf0Size::boolean(); |
| 93 | - o.set("sex", new SrsAmf0Boolean(true)); | 93 | + o.set("sex", SrsAmf0Any::boolean(true)); |
| 94 | 94 | ||
| 95 | EXPECT_EQ(size, SrsAmf0Size::object(&o)); | 95 | EXPECT_EQ(size, SrsAmf0Size::object(&o)); |
| 96 | } | 96 | } |
| @@ -144,7 +144,7 @@ VOID TEST(AMF0Test, Size) | @@ -144,7 +144,7 @@ VOID TEST(AMF0Test, Size) | ||
| 144 | SrsAmf0EcmaArray o; | 144 | SrsAmf0EcmaArray o; |
| 145 | 145 | ||
| 146 | size += SrsAmf0Size::utf8("sex")+SrsAmf0Size::boolean(); | 146 | size += SrsAmf0Size::utf8("sex")+SrsAmf0Size::boolean(); |
| 147 | - o.set("sex", new SrsAmf0Boolean(true)); | 147 | + o.set("sex", SrsAmf0Any::boolean(true)); |
| 148 | 148 | ||
| 149 | EXPECT_EQ(size, SrsAmf0Size::array(&o)); | 149 | EXPECT_EQ(size, SrsAmf0Size::array(&o)); |
| 150 | } | 150 | } |
| @@ -281,4 +281,27 @@ VOID TEST(AMF0Test, AnyElem) | @@ -281,4 +281,27 @@ VOID TEST(AMF0Test, AnyElem) | ||
| 281 | EXPECT_TRUE(o->is_string()); | 281 | EXPECT_TRUE(o->is_string()); |
| 282 | EXPECT_STREQ("winlin", o->to_str().c_str()); | 282 | EXPECT_STREQ("winlin", o->to_str().c_str()); |
| 283 | } | 283 | } |
| 284 | + | ||
| 285 | + // bool | ||
| 286 | + if (true) { | ||
| 287 | + o = SrsAmf0Any::boolean(); | ||
| 288 | + SrsAutoFree(SrsAmf0Any, o, false); | ||
| 289 | + EXPECT_TRUE(NULL != o); | ||
| 290 | + EXPECT_TRUE(o->is_boolean()); | ||
| 291 | + EXPECT_FALSE(o->to_boolean()); | ||
| 292 | + } | ||
| 293 | + if (true) { | ||
| 294 | + o = SrsAmf0Any::boolean(false); | ||
| 295 | + SrsAutoFree(SrsAmf0Any, o, false); | ||
| 296 | + EXPECT_TRUE(NULL != o); | ||
| 297 | + EXPECT_TRUE(o->is_boolean()); | ||
| 298 | + EXPECT_FALSE(o->to_boolean()); | ||
| 299 | + } | ||
| 300 | + if (true) { | ||
| 301 | + o = SrsAmf0Any::boolean(true); | ||
| 302 | + SrsAutoFree(SrsAmf0Any, o, false); | ||
| 303 | + EXPECT_TRUE(NULL != o); | ||
| 304 | + EXPECT_TRUE(o->is_boolean()); | ||
| 305 | + EXPECT_TRUE(o->to_boolean()); | ||
| 306 | + } | ||
| 284 | } | 307 | } |
-
请 注册 或 登录 后发表评论