winlin

amf0 utest: null,undefined,object-eof to any

@@ -178,15 +178,15 @@ int SrsBandwidth::do_bandwidth_check() @@ -178,15 +178,15 @@ int SrsBandwidth::do_bandwidth_check()
178 178
179 // send finished msg 179 // send finished msg
180 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_finish(); 180 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_finish();
181 - pkt->data->set("code", new SrsAmf0Number(ERROR_SUCCESS));  
182 - pkt->data->set("start_time", new SrsAmf0Number(start_time));  
183 - pkt->data->set("end_time", new SrsAmf0Number(end_time));  
184 - pkt->data->set("play_kbps", new SrsAmf0Number(play_kbps));  
185 - pkt->data->set("publish_kbps", new SrsAmf0Number(publish_kbps));  
186 - pkt->data->set("play_bytes", new SrsAmf0Number(play_bytes));  
187 - pkt->data->set("play_time", new SrsAmf0Number(play_actual_duration_ms));  
188 - pkt->data->set("publish_bytes", new SrsAmf0Number(publish_bytes));  
189 - pkt->data->set("publish_time", new SrsAmf0Number(publish_actual_duration_ms)); 181 + pkt->data->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  182 + pkt->data->set("start_time", SrsAmf0Any::number(start_time));
  183 + pkt->data->set("end_time", SrsAmf0Any::number(end_time));
  184 + pkt->data->set("play_kbps", SrsAmf0Any::number(play_kbps));
  185 + pkt->data->set("publish_kbps", SrsAmf0Any::number(publish_kbps));
  186 + pkt->data->set("play_bytes", SrsAmf0Any::number(play_bytes));
  187 + pkt->data->set("play_time", SrsAmf0Any::number(play_actual_duration_ms));
  188 + pkt->data->set("publish_bytes", SrsAmf0Any::number(publish_bytes));
  189 + pkt->data->set("publish_time", SrsAmf0Any::number(publish_actual_duration_ms));
190 190
191 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); 191 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
192 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { 192 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@@ -229,8 +229,8 @@ int SrsBandwidth::check_play( @@ -229,8 +229,8 @@ int SrsBandwidth::check_play(
229 // send start play command to client 229 // send start play command to client
230 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_play(); 230 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_play();
231 231
232 - pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms));  
233 - pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); 232 + pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
  233 + pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
234 234
235 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); 235 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
236 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { 236 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@@ -308,10 +308,10 @@ int SrsBandwidth::check_play( @@ -308,10 +308,10 @@ int SrsBandwidth::check_play(
308 if (true) { 308 if (true) {
309 // notify client to stop play 309 // notify client to stop play
310 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play(); 310 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play();
311 - pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms));  
312 - pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms));  
313 - pkt->data->set("duration_delta", new SrsAmf0Number(actual_duration_ms));  
314 - pkt->data->set("bytes_delta", new SrsAmf0Number(play_bytes)); 311 + pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
  312 + pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
  313 + pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms));
  314 + pkt->data->set("bytes_delta", SrsAmf0Any::number(play_bytes));
315 315
316 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); 316 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
317 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { 317 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@@ -353,8 +353,8 @@ int SrsBandwidth::check_publish( @@ -353,8 +353,8 @@ int SrsBandwidth::check_publish(
353 // notify client to start publish 353 // notify client to start publish
354 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_publish(); 354 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_start_publish();
355 355
356 - pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms));  
357 - pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms)); 356 + pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
  357 + pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
358 358
359 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); 359 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
360 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { 360 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@@ -414,10 +414,10 @@ int SrsBandwidth::check_publish( @@ -414,10 +414,10 @@ int SrsBandwidth::check_publish(
414 if (true) { 414 if (true) {
415 // notify client to stop publish 415 // notify client to stop publish
416 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_publish(); 416 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_publish();
417 - pkt->data->set("duration_ms", new SrsAmf0Number(duration_ms));  
418 - pkt->data->set("interval_ms", new SrsAmf0Number(interval_ms));  
419 - pkt->data->set("duration_delta", new SrsAmf0Number(actual_duration_ms));  
420 - pkt->data->set("bytes_delta", new SrsAmf0Number(publish_bytes)); 417 + pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
  418 + pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
  419 + pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms));
  420 + pkt->data->set("bytes_delta", SrsAmf0Any::number(publish_bytes));
421 421
422 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); 422 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
423 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { 423 if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
@@ -1221,29 +1221,29 @@ int SrsHls::on_meta_data(SrsAmf0Object* metadata) @@ -1221,29 +1221,29 @@ int SrsHls::on_meta_data(SrsAmf0Object* metadata)
1221 SrsAmf0Any* prop = NULL; 1221 SrsAmf0Any* prop = NULL;
1222 1222
1223 if ((prop = obj->get_property("duration")) != NULL && prop->is_number()) { 1223 if ((prop = obj->get_property("duration")) != NULL && prop->is_number()) {
1224 - codec->duration = (int)srs_amf0_convert<SrsAmf0Number>(prop)->value; 1224 + codec->duration = (int)prop->to_number();
1225 } 1225 }
1226 if ((prop = obj->get_property("width")) != NULL && prop->is_number()) { 1226 if ((prop = obj->get_property("width")) != NULL && prop->is_number()) {
1227 - codec->width = (int)srs_amf0_convert<SrsAmf0Number>(prop)->value; 1227 + codec->width = (int)prop->to_number();
1228 } 1228 }
1229 if ((prop = obj->get_property("height")) != NULL && prop->is_number()) { 1229 if ((prop = obj->get_property("height")) != NULL && prop->is_number()) {
1230 - codec->height = (int)srs_amf0_convert<SrsAmf0Number>(prop)->value; 1230 + codec->height = (int)prop->to_number();
1231 } 1231 }
1232 if ((prop = obj->get_property("framerate")) != NULL && prop->is_number()) { 1232 if ((prop = obj->get_property("framerate")) != NULL && prop->is_number()) {
1233 - codec->frame_rate = (int)srs_amf0_convert<SrsAmf0Number>(prop)->value; 1233 + codec->frame_rate = (int)prop->to_number();
1234 } 1234 }
1235 if ((prop = obj->get_property("videocodecid")) != NULL && prop->is_number()) { 1235 if ((prop = obj->get_property("videocodecid")) != NULL && prop->is_number()) {
1236 - codec->video_codec_id = (int)srs_amf0_convert<SrsAmf0Number>(prop)->value; 1236 + codec->video_codec_id = (int)prop->to_number();
1237 } 1237 }
1238 if ((prop = obj->get_property("videodatarate")) != NULL && prop->is_number()) { 1238 if ((prop = obj->get_property("videodatarate")) != NULL && prop->is_number()) {
1239 - codec->video_data_rate = (int)(1000 * srs_amf0_convert<SrsAmf0Number>(prop)->value); 1239 + codec->video_data_rate = (int)(1000 * prop->to_number());
1240 } 1240 }
1241 1241
1242 if ((prop = obj->get_property("audiocodecid")) != NULL && prop->is_number()) { 1242 if ((prop = obj->get_property("audiocodecid")) != NULL && prop->is_number()) {
1243 - codec->audio_codec_id = (int)srs_amf0_convert<SrsAmf0Number>(prop)->value; 1243 + codec->audio_codec_id = (int)prop->to_number();
1244 } 1244 }
1245 if ((prop = obj->get_property("audiodatarate")) != NULL && prop->is_number()) { 1245 if ((prop = obj->get_property("audiodatarate")) != NULL && prop->is_number()) {
1246 - codec->audio_data_rate = (int)(1000 * srs_amf0_convert<SrsAmf0Number>(prop)->value); 1246 + codec->audio_data_rate = (int)(1000 * prop->to_number());
1247 } 1247 }
1248 1248
1249 // ignore the following, for each flv/rtmp packet contains them: 1249 // ignore the following, for each flv/rtmp packet contains them:
@@ -645,12 +645,12 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -645,12 +645,12 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
645 SrsAmf0Any* prop = NULL; 645 SrsAmf0Any* prop = NULL;
646 if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) { 646 if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) {
647 if (prop->is_number()) { 647 if (prop->is_number()) {
648 - sample_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value); 648 + sample_rate = (int)prop->to_number();
649 } 649 }
650 } 650 }
651 if ((prop = metadata->metadata->get_property("framerate")) != NULL) { 651 if ((prop = metadata->metadata->get_property("framerate")) != NULL) {
652 if (prop->is_number()) { 652 if (prop->is_number()) {
653 - frame_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value); 653 + frame_rate = (int)prop->to_number();
654 } 654 }
655 } 655 }
656 656
@@ -56,8 +56,8 @@ using namespace std; @@ -56,8 +56,8 @@ using namespace std;
56 // User defined 56 // User defined
57 #define RTMP_AMF0_Invalid 0x3F 57 #define RTMP_AMF0_Invalid 0x3F
58 58
59 -int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*&);  
60 -int srs_amf0_write_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*); 59 +int srs_amf0_read_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF*&);
  60 +int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF*);
61 int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value); 61 int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value);
62 int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value); 62 int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value);
63 63
@@ -117,6 +117,12 @@ bool SrsAmf0Any::to_boolean() @@ -117,6 +117,12 @@ bool SrsAmf0Any::to_boolean()
117 return o->value; 117 return o->value;
118 } 118 }
119 119
  120 +double SrsAmf0Any::to_number()
  121 +{
  122 + __SrsAmf0Number* o = srs_amf0_convert<__SrsAmf0Number>(this);
  123 + return o->value;
  124 +}
  125 +
120 bool SrsAmf0Any::is_object_eof() 126 bool SrsAmf0Any::is_object_eof()
121 { 127 {
122 return marker == RTMP_AMF0_ObjectEnd; 128 return marker == RTMP_AMF0_ObjectEnd;
@@ -132,69 +138,26 @@ SrsAmf0Any* SrsAmf0Any::boolean(bool value) @@ -132,69 +138,26 @@ SrsAmf0Any* SrsAmf0Any::boolean(bool value)
132 return new __SrsAmf0Boolean(value); 138 return new __SrsAmf0Boolean(value);
133 } 139 }
134 140
135 -SrsAmf0Number::SrsAmf0Number(double _value)  
136 -{  
137 - marker = RTMP_AMF0_Number;  
138 - value = _value;  
139 -}  
140 -  
141 -SrsAmf0Number::~SrsAmf0Number()  
142 -{  
143 -}  
144 -  
145 -int SrsAmf0Number::size()  
146 -{  
147 - return SrsAmf0Size::number();  
148 -}  
149 -  
150 -SrsAmf0Null::SrsAmf0Null()  
151 -{  
152 - marker = RTMP_AMF0_Null;  
153 -}  
154 -  
155 -SrsAmf0Null::~SrsAmf0Null()  
156 -{  
157 -}  
158 -  
159 -int SrsAmf0Null::size()  
160 -{  
161 - return SrsAmf0Size::null();  
162 -}  
163 -  
164 -SrsAmf0Undefined::SrsAmf0Undefined()  
165 -{  
166 - marker = RTMP_AMF0_Undefined;  
167 -}  
168 -  
169 -SrsAmf0Undefined::~SrsAmf0Undefined()  
170 -{  
171 -}  
172 -  
173 -int SrsAmf0Undefined::size() 141 +SrsAmf0Any* SrsAmf0Any::number(double value)
174 { 142 {
175 - return SrsAmf0Size::undefined(); 143 + return new __SrsAmf0Number(value);
176 } 144 }
177 145
178 -SrsAmf0ObjectEOF::SrsAmf0ObjectEOF() 146 +SrsAmf0Any* SrsAmf0Any::null()
179 { 147 {
180 - marker = RTMP_AMF0_ObjectEnd;  
181 - utf8_empty = 0x00; 148 + return new __SrsAmf0Null();
182 } 149 }
183 150
184 -SrsAmf0ObjectEOF::~SrsAmf0ObjectEOF() 151 +SrsAmf0Any* SrsAmf0Any::undefined()
185 { 152 {
  153 + return new __SrsAmf0Undefined();
186 } 154 }
187 155
188 -int SrsAmf0ObjectEOF::size() 156 +__SrsUnSortedHashtable::__SrsUnSortedHashtable()
189 { 157 {
190 - return SrsAmf0Size::object_eof();  
191 } 158 }
192 159
193 -SrsUnSortedHashtable::SrsUnSortedHashtable()  
194 -{  
195 -}  
196 -  
197 -SrsUnSortedHashtable::~SrsUnSortedHashtable() 160 +__SrsUnSortedHashtable::~__SrsUnSortedHashtable()
198 { 161 {
199 std::vector<SrsObjectPropertyType>::iterator it; 162 std::vector<SrsObjectPropertyType>::iterator it;
200 for (it = properties.begin(); it != properties.end(); ++it) { 163 for (it = properties.begin(); it != properties.end(); ++it) {
@@ -205,31 +168,31 @@ SrsUnSortedHashtable::~SrsUnSortedHashtable() @@ -205,31 +168,31 @@ SrsUnSortedHashtable::~SrsUnSortedHashtable()
205 properties.clear(); 168 properties.clear();
206 } 169 }
207 170
208 -int SrsUnSortedHashtable::size() 171 +int __SrsUnSortedHashtable::size()
209 { 172 {
210 return (int)properties.size(); 173 return (int)properties.size();
211 } 174 }
212 175
213 -void SrsUnSortedHashtable::clear() 176 +void __SrsUnSortedHashtable::clear()
214 { 177 {
215 properties.clear(); 178 properties.clear();
216 } 179 }
217 180
218 -std::string SrsUnSortedHashtable::key_at(int index) 181 +std::string __SrsUnSortedHashtable::key_at(int index)
219 { 182 {
220 srs_assert(index < size()); 183 srs_assert(index < size());
221 SrsObjectPropertyType& elem = properties[index]; 184 SrsObjectPropertyType& elem = properties[index];
222 return elem.first; 185 return elem.first;
223 } 186 }
224 187
225 -SrsAmf0Any* SrsUnSortedHashtable::value_at(int index) 188 +SrsAmf0Any* __SrsUnSortedHashtable::value_at(int index)
226 { 189 {
227 srs_assert(index < size()); 190 srs_assert(index < size());
228 SrsObjectPropertyType& elem = properties[index]; 191 SrsObjectPropertyType& elem = properties[index];
229 return elem.second; 192 return elem.second;
230 } 193 }
231 194
232 -void SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value) 195 +void __SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value)
233 { 196 {
234 std::vector<SrsObjectPropertyType>::iterator it; 197 std::vector<SrsObjectPropertyType>::iterator it;
235 198
@@ -248,7 +211,7 @@ void SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value) @@ -248,7 +211,7 @@ void SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value)
248 properties.push_back(std::make_pair(key, value)); 211 properties.push_back(std::make_pair(key, value));
249 } 212 }
250 213
251 -SrsAmf0Any* SrsUnSortedHashtable::get_property(std::string name) 214 +SrsAmf0Any* __SrsUnSortedHashtable::get_property(std::string name)
252 { 215 {
253 std::vector<SrsObjectPropertyType>::iterator it; 216 std::vector<SrsObjectPropertyType>::iterator it;
254 217
@@ -264,7 +227,7 @@ SrsAmf0Any* SrsUnSortedHashtable::get_property(std::string name) @@ -264,7 +227,7 @@ SrsAmf0Any* SrsUnSortedHashtable::get_property(std::string name)
264 return NULL; 227 return NULL;
265 } 228 }
266 229
267 -SrsAmf0Any* SrsUnSortedHashtable::ensure_property_string(std::string name) 230 +SrsAmf0Any* __SrsUnSortedHashtable::ensure_property_string(std::string name)
268 { 231 {
269 SrsAmf0Any* prop = get_property(name); 232 SrsAmf0Any* prop = get_property(name);
270 233
@@ -279,7 +242,7 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_string(std::string name) @@ -279,7 +242,7 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_string(std::string name)
279 return prop; 242 return prop;
280 } 243 }
281 244
282 -SrsAmf0Any* SrsUnSortedHashtable::ensure_property_number(std::string name) 245 +SrsAmf0Any* __SrsUnSortedHashtable::ensure_property_number(std::string name)
283 { 246 {
284 SrsAmf0Any* prop = get_property(name); 247 SrsAmf0Any* prop = get_property(name);
285 248
@@ -294,6 +257,21 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_number(std::string name) @@ -294,6 +257,21 @@ SrsAmf0Any* SrsUnSortedHashtable::ensure_property_number(std::string name)
294 return prop; 257 return prop;
295 } 258 }
296 259
  260 +__SrsAmf0ObjectEOF::__SrsAmf0ObjectEOF()
  261 +{
  262 + marker = RTMP_AMF0_ObjectEnd;
  263 + utf8_empty = 0x00;
  264 +}
  265 +
  266 +__SrsAmf0ObjectEOF::~__SrsAmf0ObjectEOF()
  267 +{
  268 +}
  269 +
  270 +int __SrsAmf0ObjectEOF::size()
  271 +{
  272 + return SrsAmf0Size::object_eof();
  273 +}
  274 +
297 SrsAmf0Object::SrsAmf0Object() 275 SrsAmf0Object::SrsAmf0Object()
298 { 276 {
299 marker = RTMP_AMF0_Object; 277 marker = RTMP_AMF0_Object;
@@ -709,6 +687,49 @@ int __SrsAmf0Boolean::size() @@ -709,6 +687,49 @@ int __SrsAmf0Boolean::size()
709 return SrsAmf0Size::boolean(); 687 return SrsAmf0Size::boolean();
710 } 688 }
711 689
  690 +__SrsAmf0Number::__SrsAmf0Number(double _value)
  691 +{
  692 + marker = RTMP_AMF0_Number;
  693 + value = _value;
  694 +}
  695 +
  696 +__SrsAmf0Number::~__SrsAmf0Number()
  697 +{
  698 +}
  699 +
  700 +int __SrsAmf0Number::size()
  701 +{
  702 + return SrsAmf0Size::number();
  703 +}
  704 +
  705 +__SrsAmf0Null::__SrsAmf0Null()
  706 +{
  707 + marker = RTMP_AMF0_Null;
  708 +}
  709 +
  710 +__SrsAmf0Null::~__SrsAmf0Null()
  711 +{
  712 +}
  713 +
  714 +int __SrsAmf0Null::size()
  715 +{
  716 + return SrsAmf0Size::null();
  717 +}
  718 +
  719 +__SrsAmf0Undefined::__SrsAmf0Undefined()
  720 +{
  721 + marker = RTMP_AMF0_Undefined;
  722 +}
  723 +
  724 +__SrsAmf0Undefined::~__SrsAmf0Undefined()
  725 +{
  726 +}
  727 +
  728 +int __SrsAmf0Undefined::size()
  729 +{
  730 + return SrsAmf0Size::undefined();
  731 +}
  732 +
712 int srs_amf0_read_utf8(SrsStream* stream, std::string& value) 733 int srs_amf0_read_utf8(SrsStream* stream, std::string& value)
713 { 734 {
714 int ret = ERROR_SUCCESS; 735 int ret = ERROR_SUCCESS;
@@ -1073,22 +1094,21 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) @@ -1073,22 +1094,21 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
1073 if ((ret = srs_amf0_read_number(stream, data)) != ERROR_SUCCESS) { 1094 if ((ret = srs_amf0_read_number(stream, data)) != ERROR_SUCCESS) {
1074 return ret; 1095 return ret;
1075 } 1096 }
1076 - value = new SrsAmf0Number();  
1077 - srs_amf0_convert<SrsAmf0Number>(value)->value = data; 1097 + value = SrsAmf0Any::number(data);
1078 return ret; 1098 return ret;
1079 } 1099 }
1080 case RTMP_AMF0_Null: { 1100 case RTMP_AMF0_Null: {
1081 stream->skip(1); 1101 stream->skip(1);
1082 - value = new SrsAmf0Null(); 1102 + value = new __SrsAmf0Null();
1083 return ret; 1103 return ret;
1084 } 1104 }
1085 case RTMP_AMF0_Undefined: { 1105 case RTMP_AMF0_Undefined: {
1086 stream->skip(1); 1106 stream->skip(1);
1087 - value = new SrsAmf0Undefined(); 1107 + value = new __SrsAmf0Undefined();
1088 return ret; 1108 return ret;
1089 } 1109 }
1090 case RTMP_AMF0_ObjectEnd: { 1110 case RTMP_AMF0_ObjectEnd: {
1091 - SrsAmf0ObjectEOF* p = NULL; 1111 + __SrsAmf0ObjectEOF* p = NULL;
1092 if ((ret = srs_amf0_read_object_eof(stream, p)) != ERROR_SUCCESS) { 1112 if ((ret = srs_amf0_read_object_eof(stream, p)) != ERROR_SUCCESS) {
1093 return ret; 1113 return ret;
1094 } 1114 }
@@ -1137,7 +1157,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) @@ -1137,7 +1157,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
1137 return srs_amf0_write_boolean(stream, data); 1157 return srs_amf0_write_boolean(stream, data);
1138 } 1158 }
1139 case RTMP_AMF0_Number: { 1159 case RTMP_AMF0_Number: {
1140 - double data = srs_amf0_convert<SrsAmf0Number>(value)->value; 1160 + double data = srs_amf0_convert<__SrsAmf0Number>(value)->value;
1141 return srs_amf0_write_number(stream, data); 1161 return srs_amf0_write_number(stream, data);
1142 } 1162 }
1143 case RTMP_AMF0_Null: { 1163 case RTMP_AMF0_Null: {
@@ -1147,7 +1167,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) @@ -1147,7 +1167,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
1147 return srs_amf0_write_undefined(stream); 1167 return srs_amf0_write_undefined(stream);
1148 } 1168 }
1149 case RTMP_AMF0_ObjectEnd: { 1169 case RTMP_AMF0_ObjectEnd: {
1150 - SrsAmf0ObjectEOF* p = srs_amf0_convert<SrsAmf0ObjectEOF>(value); 1170 + __SrsAmf0ObjectEOF* p = srs_amf0_convert<__SrsAmf0ObjectEOF>(value);
1151 return srs_amf0_write_object_eof(stream, p); 1171 return srs_amf0_write_object_eof(stream, p);
1152 } 1172 }
1153 case RTMP_AMF0_Object: { 1173 case RTMP_AMF0_Object: {
@@ -1169,7 +1189,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) @@ -1169,7 +1189,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
1169 return ret; 1189 return ret;
1170 } 1190 }
1171 1191
1172 -int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value) 1192 +int srs_amf0_read_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF*& value)
1173 { 1193 {
1174 int ret = ERROR_SUCCESS; 1194 int ret = ERROR_SUCCESS;
1175 1195
@@ -1207,12 +1227,12 @@ int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value) @@ -1207,12 +1227,12 @@ int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value)
1207 } 1227 }
1208 srs_verbose("amf0 read object eof marker success"); 1228 srs_verbose("amf0 read object eof marker success");
1209 1229
1210 - value = new SrsAmf0ObjectEOF(); 1230 + value = new __SrsAmf0ObjectEOF();
1211 srs_verbose("amf0 read object eof success"); 1231 srs_verbose("amf0 read object eof success");
1212 1232
1213 return ret; 1233 return ret;
1214 } 1234 }
1215 -int srs_amf0_write_object_eof(SrsStream* stream, SrsAmf0ObjectEOF* value) 1235 +int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF* value)
1216 { 1236 {
1217 int ret = ERROR_SUCCESS; 1237 int ret = ERROR_SUCCESS;
1218 1238
@@ -67,75 +67,22 @@ public: @@ -67,75 +67,22 @@ public:
67 virtual std::string to_str(); 67 virtual std::string to_str();
68 /** 68 /**
69 * get the boolean of any when is_boolean() indicates true. 69 * get the boolean of any when is_boolean() indicates true.
70 - * user must ensure the type is a is_boolean, or assert failed. 70 + * user must ensure the type is a boolean, or assert failed.
71 */ 71 */
72 virtual bool to_boolean(); 72 virtual bool to_boolean();
  73 + /**
  74 + * get the number of any when is_number() indicates true.
  75 + * user must ensure the type is a number, or assert failed.
  76 + */
  77 + virtual double to_number();
73 public: 78 public:
74 virtual int size() = 0; 79 virtual int size() = 0;
75 public: 80 public:
76 static SrsAmf0Any* str(const char* value = NULL); 81 static SrsAmf0Any* str(const char* value = NULL);
77 - static SrsAmf0Any* boolean(bool value = false);  
78 -};  
79 -  
80 -/**  
81 -* read amf0 number from stream.  
82 -* 2.2 Number Type  
83 -* number-type = number-marker DOUBLE  
84 -* @return default value is 0.  
85 -*/  
86 -class SrsAmf0Number : public SrsAmf0Any  
87 -{  
88 -public:  
89 - double value;  
90 -  
91 - SrsAmf0Number(double _value = 0.0);  
92 - virtual ~SrsAmf0Number();  
93 -  
94 - virtual int size();  
95 -};  
96 -  
97 -/**  
98 -* read amf0 null from stream.  
99 -* 2.7 null Type  
100 -* null-type = null-marker  
101 -*/  
102 -class SrsAmf0Null : public SrsAmf0Any  
103 -{  
104 -public:  
105 - SrsAmf0Null();  
106 - virtual ~SrsAmf0Null();  
107 -  
108 - virtual int size();  
109 -};  
110 -  
111 -/**  
112 -* read amf0 undefined from stream.  
113 -* 2.8 undefined Type  
114 -* undefined-type = undefined-marker  
115 -*/  
116 -class SrsAmf0Undefined : public SrsAmf0Any  
117 -{  
118 -public:  
119 - SrsAmf0Undefined();  
120 - virtual ~SrsAmf0Undefined();  
121 -  
122 - virtual int size();  
123 -};  
124 -  
125 -/**  
126 -* 2.11 Object End Type  
127 -* object-end-type = UTF-8-empty object-end-marker  
128 -* 0x00 0x00 0x09  
129 -*/  
130 -class SrsAmf0ObjectEOF : public SrsAmf0Any  
131 -{  
132 -public:  
133 - int16_t utf8_empty;  
134 -  
135 - SrsAmf0ObjectEOF();  
136 - virtual ~SrsAmf0ObjectEOF();  
137 -  
138 - virtual int size(); 82 + static SrsAmf0Any* boolean(bool value = false);
  83 + static SrsAmf0Any* number(double value = 0.0);
  84 + static SrsAmf0Any* null();
  85 + static SrsAmf0Any* undefined();
139 }; 86 };
140 87
141 /** 88 /**
@@ -144,14 +91,14 @@ public: @@ -144,14 +91,14 @@ public:
144 * if ordered in map, the string compare order, the FMLE will creash when 91 * if ordered in map, the string compare order, the FMLE will creash when
145 * get the response of connect app. 92 * get the response of connect app.
146 */ 93 */
147 -class SrsUnSortedHashtable 94 +class __SrsUnSortedHashtable
148 { 95 {
149 private: 96 private:
150 typedef std::pair<std::string, SrsAmf0Any*> SrsObjectPropertyType; 97 typedef std::pair<std::string, SrsAmf0Any*> SrsObjectPropertyType;
151 std::vector<SrsObjectPropertyType> properties; 98 std::vector<SrsObjectPropertyType> properties;
152 public: 99 public:
153 - SrsUnSortedHashtable();  
154 - virtual ~SrsUnSortedHashtable(); 100 + __SrsUnSortedHashtable();
  101 + virtual ~__SrsUnSortedHashtable();
155 102
156 virtual int size(); 103 virtual int size();
157 virtual void clear(); 104 virtual void clear();
@@ -165,6 +112,22 @@ public: @@ -165,6 +112,22 @@ public:
165 }; 112 };
166 113
167 /** 114 /**
  115 +* 2.11 Object End Type
  116 +* object-end-type = UTF-8-empty object-end-marker
  117 +* 0x00 0x00 0x09
  118 +*/
  119 +class __SrsAmf0ObjectEOF : public SrsAmf0Any
  120 +{
  121 +public:
  122 + int16_t utf8_empty;
  123 +
  124 + __SrsAmf0ObjectEOF();
  125 + virtual ~__SrsAmf0ObjectEOF();
  126 +
  127 + virtual int size();
  128 +};
  129 +
  130 +/**
168 * 2.5 Object Type 131 * 2.5 Object Type
169 * anonymous-object-type = object-marker *(object-property) 132 * anonymous-object-type = object-marker *(object-property)
170 * object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker) 133 * object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker)
@@ -172,9 +135,9 @@ public: @@ -172,9 +135,9 @@ public:
172 class SrsAmf0Object : public SrsAmf0Any 135 class SrsAmf0Object : public SrsAmf0Any
173 { 136 {
174 private: 137 private:
175 - SrsUnSortedHashtable properties; 138 + __SrsUnSortedHashtable properties;
176 public: 139 public:
177 - SrsAmf0ObjectEOF eof; 140 + __SrsAmf0ObjectEOF eof;
178 141
179 SrsAmf0Object(); 142 SrsAmf0Object();
180 virtual ~SrsAmf0Object(); 143 virtual ~SrsAmf0Object();
@@ -201,10 +164,10 @@ public: @@ -201,10 +164,10 @@ public:
201 class SrsAmf0EcmaArray : public SrsAmf0Any 164 class SrsAmf0EcmaArray : public SrsAmf0Any
202 { 165 {
203 private: 166 private:
204 - SrsUnSortedHashtable properties; 167 + __SrsUnSortedHashtable properties;
205 public: 168 public:
206 int32_t count; 169 int32_t count;
207 - SrsAmf0ObjectEOF eof; 170 + __SrsAmf0ObjectEOF eof;
208 171
209 SrsAmf0EcmaArray(); 172 SrsAmf0EcmaArray();
210 virtual ~SrsAmf0EcmaArray(); 173 virtual ~SrsAmf0EcmaArray();
@@ -277,6 +240,51 @@ public: @@ -277,6 +240,51 @@ public:
277 }; 240 };
278 241
279 /** 242 /**
  243 +* read amf0 number from stream.
  244 +* 2.2 Number Type
  245 +* number-type = number-marker DOUBLE
  246 +* @return default value is 0.
  247 +*/
  248 +class __SrsAmf0Number : public SrsAmf0Any
  249 +{
  250 +public:
  251 + double value;
  252 +
  253 + __SrsAmf0Number(double _value);
  254 + virtual ~__SrsAmf0Number();
  255 +
  256 + virtual int size();
  257 +};
  258 +
  259 +/**
  260 +* read amf0 null from stream.
  261 +* 2.7 null Type
  262 +* null-type = null-marker
  263 +*/
  264 +class __SrsAmf0Null : public SrsAmf0Any
  265 +{
  266 +public:
  267 + __SrsAmf0Null();
  268 + virtual ~__SrsAmf0Null();
  269 +
  270 + virtual int size();
  271 +};
  272 +
  273 +/**
  274 +* read amf0 undefined from stream.
  275 +* 2.8 undefined Type
  276 +* undefined-type = undefined-marker
  277 +*/
  278 +class __SrsAmf0Undefined : public SrsAmf0Any
  279 +{
  280 +public:
  281 + __SrsAmf0Undefined();
  282 + virtual ~__SrsAmf0Undefined();
  283 +
  284 + virtual int size();
  285 +};
  286 +
  287 +/**
280 * read amf0 utf8 string from stream. 288 * read amf0 utf8 string from stream.
281 * 1.3.1 Strings and UTF-8 289 * 1.3.1 Strings and UTF-8
282 * UTF-8 = U16 *(UTF8-char) 290 * UTF-8 = U16 *(UTF8-char)
@@ -284,12 +284,12 @@ int SrsRtmpClient::connect_app(string app, string tc_url) @@ -284,12 +284,12 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
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", SrsAmf0Any::boolean(false)); 286 pkt->command_object->set("fpad", SrsAmf0Any::boolean(false));
287 - pkt->command_object->set("capabilities", new SrsAmf0Number(239));  
288 - pkt->command_object->set("audioCodecs", new SrsAmf0Number(3575));  
289 - pkt->command_object->set("videoCodecs", new SrsAmf0Number(252));  
290 - pkt->command_object->set("videoFunction", new SrsAmf0Number(1)); 287 + pkt->command_object->set("capabilities", SrsAmf0Any::number(239));
  288 + pkt->command_object->set("audioCodecs", SrsAmf0Any::number(3575));
  289 + pkt->command_object->set("videoCodecs", SrsAmf0Any::number(252));
  290 + pkt->command_object->set("videoFunction", SrsAmf0Any::number(1));
291 pkt->command_object->set("pageUrl", SrsAmf0Any::str()); 291 pkt->command_object->set("pageUrl", SrsAmf0Any::str());
292 - pkt->command_object->set("objectEncoding", new SrsAmf0Number(0)); 292 + pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0));
293 293
294 if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 294 if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
295 return ret; 295 return ret;
@@ -643,7 +643,7 @@ int SrsRtmpServer::connect_app(SrsRequest* req) @@ -643,7 +643,7 @@ int SrsRtmpServer::connect_app(SrsRequest* req)
643 } 643 }
644 644
645 if ((prop = pkt->command_object->ensure_property_number("objectEncoding")) != NULL) { 645 if ((prop = pkt->command_object->ensure_property_number("objectEncoding")) != NULL) {
646 - req->objectEncoding = srs_amf0_convert<SrsAmf0Number>(prop)->value; 646 + req->objectEncoding = prop->to_number();
647 } 647 }
648 648
649 srs_info("get connect app message params success."); 649 srs_info("get connect app message params success.");
@@ -699,13 +699,13 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip) @@ -699,13 +699,13 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip)
699 SrsConnectAppResPacket* pkt = new SrsConnectAppResPacket(); 699 SrsConnectAppResPacket* pkt = new SrsConnectAppResPacket();
700 700
701 pkt->props->set("fmsVer", SrsAmf0Any::str("FMS/"RTMP_SIG_FMS_VER)); 701 pkt->props->set("fmsVer", SrsAmf0Any::str("FMS/"RTMP_SIG_FMS_VER));
702 - pkt->props->set("capabilities", new SrsAmf0Number(127));  
703 - pkt->props->set("mode", new SrsAmf0Number(1)); 702 + pkt->props->set("capabilities", SrsAmf0Any::number(127));
  703 + pkt->props->set("mode", SrsAmf0Any::number(1));
704 704
705 pkt->info->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); 705 pkt->info->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
706 pkt->info->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectSuccess)); 706 pkt->info->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectSuccess));
707 pkt->info->set(StatusDescription, SrsAmf0Any::str("Connection succeeded")); 707 pkt->info->set(StatusDescription, SrsAmf0Any::str("Connection succeeded"));
708 - pkt->info->set("objectEncoding", new SrsAmf0Number(req->objectEncoding)); 708 + pkt->info->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding));
709 SrsAmf0EcmaArray* data = new SrsAmf0EcmaArray(); 709 SrsAmf0EcmaArray* data = new SrsAmf0EcmaArray();
710 pkt->info->set("data", data); 710 pkt->info->set("data", data);
711 711
@@ -745,7 +745,7 @@ void SrsRtmpServer::response_connect_reject(SrsRequest *req, const char* desc) @@ -745,7 +745,7 @@ void SrsRtmpServer::response_connect_reject(SrsRequest *req, const char* desc)
745 pkt->props->set(StatusLevel, SrsAmf0Any::str(StatusLevelError)); 745 pkt->props->set(StatusLevel, SrsAmf0Any::str(StatusLevelError));
746 pkt->props->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectRejected)); 746 pkt->props->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectRejected));
747 pkt->props->set(StatusDescription, SrsAmf0Any::str(desc)); 747 pkt->props->set(StatusDescription, SrsAmf0Any::str(desc));
748 - //pkt->props->set("objectEncoding", new SrsAmf0Number(req->objectEncoding)); 748 + //pkt->props->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding));
749 749
750 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0); 750 SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
751 if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 751 if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
@@ -1957,7 +1957,7 @@ SrsCreateStreamPacket::SrsCreateStreamPacket() @@ -1957,7 +1957,7 @@ SrsCreateStreamPacket::SrsCreateStreamPacket()
1957 { 1957 {
1958 command_name = RTMP_AMF0_COMMAND_CREATE_STREAM; 1958 command_name = RTMP_AMF0_COMMAND_CREATE_STREAM;
1959 transaction_id = 2; 1959 transaction_id = 2;
1960 - command_object = new SrsAmf0Null(); 1960 + command_object = SrsAmf0Any::null();
1961 } 1961 }
1962 1962
1963 SrsCreateStreamPacket::~SrsCreateStreamPacket() 1963 SrsCreateStreamPacket::~SrsCreateStreamPacket()
@@ -2042,7 +2042,7 @@ SrsCreateStreamResPacket::SrsCreateStreamResPacket(double _transaction_id, doubl @@ -2042,7 +2042,7 @@ SrsCreateStreamResPacket::SrsCreateStreamResPacket(double _transaction_id, doubl
2042 { 2042 {
2043 command_name = RTMP_AMF0_COMMAND_RESULT; 2043 command_name = RTMP_AMF0_COMMAND_RESULT;
2044 transaction_id = _transaction_id; 2044 transaction_id = _transaction_id;
2045 - command_object = new SrsAmf0Null(); 2045 + command_object = SrsAmf0Any::null();
2046 stream_id = _stream_id; 2046 stream_id = _stream_id;
2047 } 2047 }
2048 2048
@@ -2140,7 +2140,7 @@ SrsCloseStreamPacket::SrsCloseStreamPacket() @@ -2140,7 +2140,7 @@ SrsCloseStreamPacket::SrsCloseStreamPacket()
2140 { 2140 {
2141 command_name = RTMP_AMF0_COMMAND_CLOSE_STREAM; 2141 command_name = RTMP_AMF0_COMMAND_CLOSE_STREAM;
2142 transaction_id = 0; 2142 transaction_id = 0;
2143 - command_object = new SrsAmf0Null(); 2143 + command_object = SrsAmf0Any::null();
2144 } 2144 }
2145 2145
2146 SrsCloseStreamPacket::~SrsCloseStreamPacket() 2146 SrsCloseStreamPacket::~SrsCloseStreamPacket()
@@ -2175,7 +2175,7 @@ SrsFMLEStartPacket::SrsFMLEStartPacket() @@ -2175,7 +2175,7 @@ SrsFMLEStartPacket::SrsFMLEStartPacket()
2175 { 2175 {
2176 command_name = RTMP_AMF0_COMMAND_RELEASE_STREAM; 2176 command_name = RTMP_AMF0_COMMAND_RELEASE_STREAM;
2177 transaction_id = 0; 2177 transaction_id = 0;
2178 - command_object = new SrsAmf0Null(); 2178 + command_object = SrsAmf0Any::null();
2179 } 2179 }
2180 2180
2181 SrsFMLEStartPacket::~SrsFMLEStartPacket() 2181 SrsFMLEStartPacket::~SrsFMLEStartPacket()
@@ -2298,8 +2298,8 @@ SrsFMLEStartResPacket::SrsFMLEStartResPacket(double _transaction_id) @@ -2298,8 +2298,8 @@ SrsFMLEStartResPacket::SrsFMLEStartResPacket(double _transaction_id)
2298 { 2298 {
2299 command_name = RTMP_AMF0_COMMAND_RESULT; 2299 command_name = RTMP_AMF0_COMMAND_RESULT;
2300 transaction_id = _transaction_id; 2300 transaction_id = _transaction_id;
2301 - command_object = new SrsAmf0Null();  
2302 - args = new SrsAmf0Undefined(); 2301 + command_object = SrsAmf0Any::null();
  2302 + args = SrsAmf0Any::undefined();
2303 } 2303 }
2304 2304
2305 SrsFMLEStartResPacket::~SrsFMLEStartResPacket() 2305 SrsFMLEStartResPacket::~SrsFMLEStartResPacket()
@@ -2397,7 +2397,7 @@ SrsPublishPacket::SrsPublishPacket() @@ -2397,7 +2397,7 @@ SrsPublishPacket::SrsPublishPacket()
2397 { 2397 {
2398 command_name = RTMP_AMF0_COMMAND_PUBLISH; 2398 command_name = RTMP_AMF0_COMMAND_PUBLISH;
2399 transaction_id = 0; 2399 transaction_id = 0;
2400 - command_object = new SrsAmf0Null(); 2400 + command_object = SrsAmf0Any::null();
2401 type = "live"; 2401 type = "live";
2402 } 2402 }
2403 2403
@@ -2506,7 +2506,7 @@ SrsPausePacket::SrsPausePacket() @@ -2506,7 +2506,7 @@ SrsPausePacket::SrsPausePacket()
2506 { 2506 {
2507 command_name = RTMP_AMF0_COMMAND_PAUSE; 2507 command_name = RTMP_AMF0_COMMAND_PAUSE;
2508 transaction_id = 0; 2508 transaction_id = 0;
2509 - command_object = new SrsAmf0Null(); 2509 + command_object = SrsAmf0Any::null();
2510 2510
2511 time_ms = 0; 2511 time_ms = 0;
2512 is_pause = true; 2512 is_pause = true;
@@ -2561,7 +2561,7 @@ SrsPlayPacket::SrsPlayPacket() @@ -2561,7 +2561,7 @@ SrsPlayPacket::SrsPlayPacket()
2561 { 2561 {
2562 command_name = RTMP_AMF0_COMMAND_PLAY; 2562 command_name = RTMP_AMF0_COMMAND_PLAY;
2563 transaction_id = 0; 2563 transaction_id = 0;
2564 - command_object = new SrsAmf0Null(); 2564 + command_object = SrsAmf0Any::null();
2565 2565
2566 start = -2; 2566 start = -2;
2567 duration = -1; 2567 duration = -1;
@@ -2630,7 +2630,7 @@ int SrsPlayPacket::decode(SrsStream* stream) @@ -2630,7 +2630,7 @@ int SrsPlayPacket::decode(SrsStream* stream)
2630 if (reset_value->is_boolean()) { 2630 if (reset_value->is_boolean()) {
2631 reset = reset_value->to_boolean(); 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 = (reset_value->to_number() == 0 ? false : true);
2634 } else { 2634 } else {
2635 ret = ERROR_RTMP_AMF0_DECODE; 2635 ret = ERROR_RTMP_AMF0_DECODE;
2636 srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret); 2636 srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret);
@@ -2715,7 +2715,7 @@ SrsPlayResPacket::SrsPlayResPacket() @@ -2715,7 +2715,7 @@ SrsPlayResPacket::SrsPlayResPacket()
2715 { 2715 {
2716 command_name = RTMP_AMF0_COMMAND_RESULT; 2716 command_name = RTMP_AMF0_COMMAND_RESULT;
2717 transaction_id = 0; 2717 transaction_id = 0;
2718 - command_object = new SrsAmf0Null(); 2718 + command_object = SrsAmf0Any::null();
2719 desc = new SrsAmf0Object(); 2719 desc = new SrsAmf0Object();
2720 } 2720 }
2721 2721
@@ -2779,7 +2779,7 @@ SrsOnBWDonePacket::SrsOnBWDonePacket() @@ -2779,7 +2779,7 @@ SrsOnBWDonePacket::SrsOnBWDonePacket()
2779 { 2779 {
2780 command_name = RTMP_AMF0_COMMAND_ON_BW_DONE; 2780 command_name = RTMP_AMF0_COMMAND_ON_BW_DONE;
2781 transaction_id = 0; 2781 transaction_id = 0;
2782 - args = new SrsAmf0Null(); 2782 + args = SrsAmf0Any::null();
2783 } 2783 }
2784 2784
2785 SrsOnBWDonePacket::~SrsOnBWDonePacket() 2785 SrsOnBWDonePacket::~SrsOnBWDonePacket()
@@ -2834,7 +2834,7 @@ SrsOnStatusCallPacket::SrsOnStatusCallPacket() @@ -2834,7 +2834,7 @@ SrsOnStatusCallPacket::SrsOnStatusCallPacket()
2834 { 2834 {
2835 command_name = RTMP_AMF0_COMMAND_ON_STATUS; 2835 command_name = RTMP_AMF0_COMMAND_ON_STATUS;
2836 transaction_id = 0; 2836 transaction_id = 0;
2837 - args = new SrsAmf0Null(); 2837 + args = SrsAmf0Any::null();
2838 data = new SrsAmf0Object(); 2838 data = new SrsAmf0Object();
2839 } 2839 }
2840 2840
@@ -2897,7 +2897,7 @@ SrsBandwidthPacket::SrsBandwidthPacket() @@ -2897,7 +2897,7 @@ SrsBandwidthPacket::SrsBandwidthPacket()
2897 { 2897 {
2898 command_name = RTMP_AMF0_COMMAND_ON_STATUS; 2898 command_name = RTMP_AMF0_COMMAND_ON_STATUS;
2899 transaction_id = 0; 2899 transaction_id = 0;
2900 - args = new SrsAmf0Null(); 2900 + args = SrsAmf0Any::null();
2901 data = new SrsAmf0Object(); 2901 data = new SrsAmf0Object();
2902 } 2902 }
2903 2903
@@ -86,8 +86,7 @@ class SrsStream; @@ -86,8 +86,7 @@ class SrsStream;
86 class SrsCommonMessage; 86 class SrsCommonMessage;
87 class SrsChunkStream; 87 class SrsChunkStream;
88 class SrsAmf0Object; 88 class SrsAmf0Object;
89 -class SrsAmf0Null;  
90 -class SrsAmf0Undefined; 89 +class SrsAmf0Any;
91 class ISrsMessage; 90 class ISrsMessage;
92 91
93 // convert class name to string. 92 // convert class name to string.
@@ -600,7 +599,7 @@ protected: @@ -600,7 +599,7 @@ protected:
600 public: 599 public:
601 std::string command_name; 600 std::string command_name;
602 double transaction_id; 601 double transaction_id;
603 - SrsAmf0Null* command_object; 602 + SrsAmf0Any* command_object; // null
604 public: 603 public:
605 SrsCreateStreamPacket(); 604 SrsCreateStreamPacket();
606 virtual ~SrsCreateStreamPacket(); 605 virtual ~SrsCreateStreamPacket();
@@ -629,7 +628,7 @@ protected: @@ -629,7 +628,7 @@ protected:
629 public: 628 public:
630 std::string command_name; 629 std::string command_name;
631 double transaction_id; 630 double transaction_id;
632 - SrsAmf0Null* command_object; 631 + SrsAmf0Any* command_object; // null
633 double stream_id; 632 double stream_id;
634 public: 633 public:
635 SrsCreateStreamResPacket(double _transaction_id, double _stream_id); 634 SrsCreateStreamResPacket(double _transaction_id, double _stream_id);
@@ -659,7 +658,7 @@ protected: @@ -659,7 +658,7 @@ protected:
659 public: 658 public:
660 std::string command_name; 659 std::string command_name;
661 double transaction_id; 660 double transaction_id;
662 - SrsAmf0Null* command_object; 661 + SrsAmf0Any* command_object; // null
663 public: 662 public:
664 SrsCloseStreamPacket(); 663 SrsCloseStreamPacket();
665 virtual ~SrsCloseStreamPacket(); 664 virtual ~SrsCloseStreamPacket();
@@ -682,7 +681,7 @@ protected: @@ -682,7 +681,7 @@ protected:
682 public: 681 public:
683 std::string command_name; 682 std::string command_name;
684 double transaction_id; 683 double transaction_id;
685 - SrsAmf0Null* command_object; 684 + SrsAmf0Any* command_object; // null
686 std::string stream_name; 685 std::string stream_name;
687 public: 686 public:
688 SrsFMLEStartPacket(); 687 SrsFMLEStartPacket();
@@ -715,8 +714,8 @@ protected: @@ -715,8 +714,8 @@ protected:
715 public: 714 public:
716 std::string command_name; 715 std::string command_name;
717 double transaction_id; 716 double transaction_id;
718 - SrsAmf0Null* command_object;  
719 - SrsAmf0Undefined* args; 717 + SrsAmf0Any* command_object; // null
  718 + SrsAmf0Any* args; // undefined
720 public: 719 public:
721 SrsFMLEStartResPacket(double _transaction_id); 720 SrsFMLEStartResPacket(double _transaction_id);
722 virtual ~SrsFMLEStartResPacket(); 721 virtual ~SrsFMLEStartResPacket();
@@ -750,7 +749,7 @@ protected: @@ -750,7 +749,7 @@ protected:
750 public: 749 public:
751 std::string command_name; 750 std::string command_name;
752 double transaction_id; 751 double transaction_id;
753 - SrsAmf0Null* command_object; 752 + SrsAmf0Any* command_object; // null
754 std::string stream_name; 753 std::string stream_name;
755 // optional, default to live. 754 // optional, default to live.
756 std::string type; 755 std::string type;
@@ -785,7 +784,7 @@ protected: @@ -785,7 +784,7 @@ protected:
785 public: 784 public:
786 std::string command_name; 785 std::string command_name;
787 double transaction_id; 786 double transaction_id;
788 - SrsAmf0Null* command_object; 787 + SrsAmf0Any* command_object; // null
789 bool is_pause; 788 bool is_pause;
790 double time_ms; 789 double time_ms;
791 public: 790 public:
@@ -811,7 +810,7 @@ protected: @@ -811,7 +810,7 @@ protected:
811 public: 810 public:
812 std::string command_name; 811 std::string command_name;
813 double transaction_id; 812 double transaction_id;
814 - SrsAmf0Null* command_object; 813 + SrsAmf0Any* command_object; // null
815 std::string stream_name; 814 std::string stream_name;
816 double start; 815 double start;
817 double duration; 816 double duration;
@@ -845,7 +844,7 @@ protected: @@ -845,7 +844,7 @@ protected:
845 public: 844 public:
846 std::string command_name; 845 std::string command_name;
847 double transaction_id; 846 double transaction_id;
848 - SrsAmf0Null* command_object; 847 + SrsAmf0Any* command_object; // null
849 SrsAmf0Object* desc; 848 SrsAmf0Object* desc;
850 public: 849 public:
851 SrsPlayResPacket(); 850 SrsPlayResPacket();
@@ -874,7 +873,7 @@ protected: @@ -874,7 +873,7 @@ protected:
874 public: 873 public:
875 std::string command_name; 874 std::string command_name;
876 double transaction_id; 875 double transaction_id;
877 - SrsAmf0Null* args; 876 + SrsAmf0Any* args; // null
878 public: 877 public:
879 SrsOnBWDonePacket(); 878 SrsOnBWDonePacket();
880 virtual ~SrsOnBWDonePacket(); 879 virtual ~SrsOnBWDonePacket();
@@ -903,7 +902,7 @@ protected: @@ -903,7 +902,7 @@ protected:
903 public: 902 public:
904 std::string command_name; 903 std::string command_name;
905 double transaction_id; 904 double transaction_id;
906 - SrsAmf0Null* args; 905 + SrsAmf0Any* args; // null
907 SrsAmf0Object* data; 906 SrsAmf0Object* data;
908 public: 907 public:
909 SrsOnStatusCallPacket(); 908 SrsOnStatusCallPacket();
@@ -936,7 +935,7 @@ protected: @@ -936,7 +935,7 @@ protected:
936 public: 935 public:
937 std::string command_name; 936 std::string command_name;
938 double transaction_id; 937 double transaction_id;
939 - SrsAmf0Null* args; 938 + SrsAmf0Any* args; // null
940 SrsAmf0Object* data; 939 SrsAmf0Object* data;
941 public: 940 public:
942 SrsBandwidthPacket(); 941 SrsBandwidthPacket();
@@ -63,7 +63,7 @@ VOID TEST(AMF0Test, Size) @@ -63,7 +63,7 @@ VOID TEST(AMF0Test, Size)
63 SrsAmf0Object o; 63 SrsAmf0Object o;
64 64
65 size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number(); 65 size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number();
66 - o.set("age", new SrsAmf0Number(9)); 66 + o.set("age", SrsAmf0Any::number(9));
67 67
68 EXPECT_EQ(size, SrsAmf0Size::object(&o)); 68 EXPECT_EQ(size, SrsAmf0Size::object(&o));
69 } 69 }
@@ -72,7 +72,7 @@ VOID TEST(AMF0Test, Size) @@ -72,7 +72,7 @@ VOID TEST(AMF0Test, Size)
72 SrsAmf0Object o; 72 SrsAmf0Object o;
73 73
74 size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null(); 74 size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null();
75 - o.set("email", new SrsAmf0Null()); 75 + o.set("email", SrsAmf0Any::null());
76 76
77 EXPECT_EQ(size, SrsAmf0Size::object(&o)); 77 EXPECT_EQ(size, SrsAmf0Size::object(&o));
78 } 78 }
@@ -81,7 +81,7 @@ VOID TEST(AMF0Test, Size) @@ -81,7 +81,7 @@ VOID TEST(AMF0Test, Size)
81 SrsAmf0Object o; 81 SrsAmf0Object o;
82 82
83 size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined(); 83 size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined();
84 - o.set("email", new SrsAmf0Undefined()); 84 + o.set("email", SrsAmf0Any::undefined());
85 85
86 EXPECT_EQ(size, SrsAmf0Size::object(&o)); 86 EXPECT_EQ(size, SrsAmf0Size::object(&o));
87 } 87 }
@@ -117,7 +117,7 @@ VOID TEST(AMF0Test, Size) @@ -117,7 +117,7 @@ VOID TEST(AMF0Test, Size)
117 SrsAmf0EcmaArray o; 117 SrsAmf0EcmaArray o;
118 118
119 size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number(); 119 size += SrsAmf0Size::utf8("age")+SrsAmf0Size::number();
120 - o.set("age", new SrsAmf0Number(9)); 120 + o.set("age", SrsAmf0Any::number(9));
121 121
122 EXPECT_EQ(size, SrsAmf0Size::array(&o)); 122 EXPECT_EQ(size, SrsAmf0Size::array(&o));
123 } 123 }
@@ -126,7 +126,7 @@ VOID TEST(AMF0Test, Size) @@ -126,7 +126,7 @@ VOID TEST(AMF0Test, Size)
126 SrsAmf0EcmaArray o; 126 SrsAmf0EcmaArray o;
127 127
128 size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null(); 128 size += SrsAmf0Size::utf8("email")+SrsAmf0Size::null();
129 - o.set("email", new SrsAmf0Null()); 129 + o.set("email", SrsAmf0Any::null());
130 130
131 EXPECT_EQ(size, SrsAmf0Size::array(&o)); 131 EXPECT_EQ(size, SrsAmf0Size::array(&o));
132 } 132 }
@@ -135,7 +135,7 @@ VOID TEST(AMF0Test, Size) @@ -135,7 +135,7 @@ VOID TEST(AMF0Test, Size)
135 SrsAmf0EcmaArray o; 135 SrsAmf0EcmaArray o;
136 136
137 size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined(); 137 size += SrsAmf0Size::utf8("email")+SrsAmf0Size::undefined();
138 - o.set("email", new SrsAmf0Undefined()); 138 + o.set("email", SrsAmf0Any::undefined());
139 139
140 EXPECT_EQ(size, SrsAmf0Size::array(&o)); 140 EXPECT_EQ(size, SrsAmf0Size::array(&o));
141 } 141 }
@@ -177,7 +177,7 @@ VOID TEST(AMF0Test, Size) @@ -177,7 +177,7 @@ VOID TEST(AMF0Test, Size)
177 o.set("args", args); 177 o.set("args", args);
178 178
179 SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray(); 179 SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray();
180 - params->set("p1", new SrsAmf0Number(10)); 180 + params->set("p1", SrsAmf0Any::number(10));
181 size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params); 181 size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params);
182 o.set("params", params); 182 o.set("params", params);
183 183
@@ -212,7 +212,7 @@ VOID TEST(AMF0Test, Size) @@ -212,7 +212,7 @@ VOID TEST(AMF0Test, Size)
212 o.set("args", args); 212 o.set("args", args);
213 213
214 SrsAmf0Object* params = new SrsAmf0Object(); 214 SrsAmf0Object* params = new SrsAmf0Object();
215 - params->set("p1", new SrsAmf0Number(10)); 215 + params->set("p1", SrsAmf0Any::number(10));
216 size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params); 216 size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params);
217 o.set("params", params); 217 o.set("params", params);
218 218
@@ -233,7 +233,7 @@ VOID TEST(AMF0Test, Size) @@ -233,7 +233,7 @@ VOID TEST(AMF0Test, Size)
233 o.set("args", args); 233 o.set("args", args);
234 234
235 SrsAmf0Object* params = new SrsAmf0Object(); 235 SrsAmf0Object* params = new SrsAmf0Object();
236 - params->set("p1", new SrsAmf0Number(10)); 236 + params->set("p1", SrsAmf0Any::number(10));
237 size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params); 237 size += SrsAmf0Size::utf8("params")+SrsAmf0Size::object(params);
238 o.set("params", params); 238 o.set("params", params);
239 239
@@ -254,7 +254,7 @@ VOID TEST(AMF0Test, Size) @@ -254,7 +254,7 @@ VOID TEST(AMF0Test, Size)
254 o.set("args", args); 254 o.set("args", args);
255 255
256 SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray(); 256 SrsAmf0EcmaArray* params = new SrsAmf0EcmaArray();
257 - params->set("p1", new SrsAmf0Number(10)); 257 + params->set("p1", SrsAmf0Any::number(10));
258 size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params); 258 size += SrsAmf0Size::utf8("params")+SrsAmf0Size::array(params);
259 o.set("params", params); 259 o.set("params", params);
260 260
@@ -304,4 +304,43 @@ VOID TEST(AMF0Test, AnyElem) @@ -304,4 +304,43 @@ VOID TEST(AMF0Test, AnyElem)
304 EXPECT_TRUE(o->is_boolean()); 304 EXPECT_TRUE(o->is_boolean());
305 EXPECT_TRUE(o->to_boolean()); 305 EXPECT_TRUE(o->to_boolean());
306 } 306 }
  307 +
  308 + // number
  309 + if (true) {
  310 + o = SrsAmf0Any::number();
  311 + SrsAutoFree(SrsAmf0Any, o, false);
  312 + EXPECT_TRUE(NULL != o);
  313 + EXPECT_TRUE(o->is_number());
  314 + EXPECT_DOUBLE_EQ(0, o->to_number());
  315 + }
  316 + if (true) {
  317 + o = SrsAmf0Any::number(100);
  318 + SrsAutoFree(SrsAmf0Any, o, false);
  319 + EXPECT_TRUE(NULL != o);
  320 + EXPECT_TRUE(o->is_number());
  321 + EXPECT_DOUBLE_EQ(100, o->to_number());
  322 + }
  323 + if (true) {
  324 + o = SrsAmf0Any::number(-100);
  325 + SrsAutoFree(SrsAmf0Any, o, false);
  326 + EXPECT_TRUE(NULL != o);
  327 + EXPECT_TRUE(o->is_number());
  328 + EXPECT_DOUBLE_EQ(-100, o->to_number());
  329 + }
  330 +
  331 + // null
  332 + if (true) {
  333 + o = SrsAmf0Any::null();
  334 + SrsAutoFree(SrsAmf0Any, o, false);
  335 + EXPECT_TRUE(NULL != o);
  336 + EXPECT_TRUE(o->is_null());
  337 + }
  338 +
  339 + // undefined
  340 + if (true) {
  341 + o = SrsAmf0Any::undefined();
  342 + SrsAutoFree(SrsAmf0Any, o, false);
  343 + EXPECT_TRUE(NULL != o);
  344 + EXPECT_TRUE(o->is_undefined());
  345 + }
307 } 346 }