winlin

amf0 utest: boolean to any

@@ -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 }