winlin

amf0 utest: elem read/write refined

@@ -80,10 +80,6 @@ void SrsStream::skip(int size) @@ -80,10 +80,6 @@ void SrsStream::skip(int size)
80 80
81 int SrsStream::pos() 81 int SrsStream::pos()
82 { 82 {
83 - if (empty()) {  
84 - return 0;  
85 - }  
86 -  
87 return p - bytes; 83 return p - bytes;
88 } 84 }
89 85
@@ -56,9 +56,32 @@ using namespace std; @@ -56,9 +56,32 @@ 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*);  
61 -int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value); 59 +/**
  60 +* convert the any to specified object.
  61 +* @return T, the converted object. never NULL.
  62 +* @remark, user must ensure the current object type,
  63 +* or the covert will cause assert failed.
  64 +*/
  65 +template<class T>
  66 +T srs_amf0_convert(SrsAmf0Any* any)
  67 +{
  68 + T p = dynamic_cast<T>(any);
  69 + srs_assert(p != NULL);
  70 + return p;
  71 +}
  72 +
  73 +/**
  74 +* read amf0 utf8 string from stream.
  75 +* 1.3.1 Strings and UTF-8
  76 +* UTF-8 = U16 *(UTF8-char)
  77 +* UTF8-char = UTF8-1 | UTF8-2 | UTF8-3 | UTF8-4
  78 +* UTF8-1 = %x00-7F
  79 +* @remark only support UTF8-1 char.
  80 +*/
  81 +extern int srs_amf0_read_utf8(SrsStream* stream, std::string& value);
  82 +extern int srs_amf0_write_utf8(SrsStream* stream, std::string value);
  83 +
  84 +bool srs_amf0_is_object_eof(SrsStream* stream);
62 int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value); 85 int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value);
63 86
64 SrsAmf0Any::SrsAmf0Any() 87 SrsAmf0Any::SrsAmf0Any()
@@ -107,19 +130,19 @@ bool SrsAmf0Any::is_ecma_array() @@ -107,19 +130,19 @@ bool SrsAmf0Any::is_ecma_array()
107 130
108 string SrsAmf0Any::to_str() 131 string SrsAmf0Any::to_str()
109 { 132 {
110 - __SrsAmf0String* o = srs_amf0_convert<__SrsAmf0String>(this); 133 + __SrsAmf0String* o = srs_amf0_convert<__SrsAmf0String*>(this);
111 return o->value; 134 return o->value;
112 } 135 }
113 136
114 bool SrsAmf0Any::to_boolean() 137 bool SrsAmf0Any::to_boolean()
115 { 138 {
116 - __SrsAmf0Boolean* o = srs_amf0_convert<__SrsAmf0Boolean>(this); 139 + __SrsAmf0Boolean* o = srs_amf0_convert<__SrsAmf0Boolean*>(this);
117 return o->value; 140 return o->value;
118 } 141 }
119 142
120 double SrsAmf0Any::to_number() 143 double SrsAmf0Any::to_number()
121 { 144 {
122 - __SrsAmf0Number* o = srs_amf0_convert<__SrsAmf0Number>(this); 145 + __SrsAmf0Number* o = srs_amf0_convert<__SrsAmf0Number*>(this);
123 return o->value; 146 return o->value;
124 } 147 }
125 148
@@ -153,6 +176,11 @@ SrsAmf0Any* SrsAmf0Any::undefined() @@ -153,6 +176,11 @@ SrsAmf0Any* SrsAmf0Any::undefined()
153 return new __SrsAmf0Undefined(); 176 return new __SrsAmf0Undefined();
154 } 177 }
155 178
  179 +SrsAmf0Any* SrsAmf0Any::object_eof()
  180 +{
  181 + return new __SrsAmf0ObjectEOF();
  182 +}
  183 +
156 __SrsUnSortedHashtable::__SrsUnSortedHashtable() 184 __SrsUnSortedHashtable::__SrsUnSortedHashtable()
157 { 185 {
158 } 186 }
@@ -194,6 +222,11 @@ SrsAmf0Any* __SrsUnSortedHashtable::value_at(int index) @@ -194,6 +222,11 @@ SrsAmf0Any* __SrsUnSortedHashtable::value_at(int index)
194 222
195 void __SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value) 223 void __SrsUnSortedHashtable::set(std::string key, SrsAmf0Any* value)
196 { 224 {
  225 + if (!value) {
  226 + srs_warn("add a NULL propertity %s", key.c_str());
  227 + return;
  228 + }
  229 +
197 std::vector<SrsObjectPropertyType>::iterator it; 230 std::vector<SrsObjectPropertyType>::iterator it;
198 231
199 for (it = properties.begin(); it != properties.end(); ++it) { 232 for (it = properties.begin(); it != properties.end(); ++it) {
@@ -272,6 +305,71 @@ int __SrsAmf0ObjectEOF::size() @@ -272,6 +305,71 @@ int __SrsAmf0ObjectEOF::size()
272 return SrsAmf0Size::object_eof(); 305 return SrsAmf0Size::object_eof();
273 } 306 }
274 307
  308 +int __SrsAmf0ObjectEOF::read(SrsStream* stream)
  309 +{
  310 + int ret = ERROR_SUCCESS;
  311 +
  312 + // value
  313 + if (!stream->require(2)) {
  314 + ret = ERROR_RTMP_AMF0_DECODE;
  315 + srs_error("amf0 read object eof value failed. ret=%d", ret);
  316 + return ret;
  317 + }
  318 + int16_t temp = stream->read_2bytes();
  319 + if (temp != 0x00) {
  320 + ret = ERROR_RTMP_AMF0_DECODE;
  321 + srs_error("amf0 read object eof value check failed. "
  322 + "must be 0x00, actual is %#x, ret=%d", temp, ret);
  323 + return ret;
  324 + }
  325 +
  326 + // marker
  327 + if (!stream->require(1)) {
  328 + ret = ERROR_RTMP_AMF0_DECODE;
  329 + srs_error("amf0 read object eof marker failed. ret=%d", ret);
  330 + return ret;
  331 + }
  332 +
  333 + char marker = stream->read_1bytes();
  334 + if (marker != RTMP_AMF0_ObjectEnd) {
  335 + ret = ERROR_RTMP_AMF0_DECODE;
  336 + srs_error("amf0 check object eof marker failed. "
  337 + "marker=%#x, required=%#x, ret=%d", marker, RTMP_AMF0_ObjectEnd, ret);
  338 + return ret;
  339 + }
  340 + srs_verbose("amf0 read object eof marker success");
  341 +
  342 + srs_verbose("amf0 read object eof success");
  343 +
  344 + return ret;
  345 +}
  346 +int __SrsAmf0ObjectEOF::write(SrsStream* stream)
  347 +{
  348 + int ret = ERROR_SUCCESS;
  349 +
  350 + // value
  351 + if (!stream->require(2)) {
  352 + ret = ERROR_RTMP_AMF0_ENCODE;
  353 + srs_error("amf0 write object eof value failed. ret=%d", ret);
  354 + return ret;
  355 + }
  356 + stream->write_2bytes(0x00);
  357 + srs_verbose("amf0 write object eof value success");
  358 +
  359 + // marker
  360 + if (!stream->require(1)) {
  361 + ret = ERROR_RTMP_AMF0_ENCODE;
  362 + srs_error("amf0 write object eof marker failed. ret=%d", ret);
  363 + return ret;
  364 + }
  365 +
  366 + stream->write_1bytes(RTMP_AMF0_ObjectEnd);
  367 +
  368 + srs_verbose("amf0 read object eof success");
  369 +
  370 + return ret;
  371 +}
  372 +
275 SrsAmf0Object::SrsAmf0Object() 373 SrsAmf0Object::SrsAmf0Object()
276 { 374 {
277 marker = RTMP_AMF0_Object; 375 marker = RTMP_AMF0_Object;
@@ -303,6 +401,17 @@ int SrsAmf0Object::read(SrsStream* stream) @@ -303,6 +401,17 @@ int SrsAmf0Object::read(SrsStream* stream)
303 401
304 // value 402 // value
305 while (!stream->empty()) { 403 while (!stream->empty()) {
  404 + // detect whether is eof.
  405 + if (srs_amf0_is_object_eof(stream)) {
  406 + __SrsAmf0ObjectEOF eof;
  407 + if ((ret = eof.read(stream)) != ERROR_SUCCESS) {
  408 + srs_error("amf0 object read eof failed. ret=%d", ret);
  409 + return ret;
  410 + }
  411 + srs_info("amf0 read object EOF.");
  412 + break;
  413 + }
  414 +
306 // property-name: utf8 string 415 // property-name: utf8 string
307 std::string property_name; 416 std::string property_name;
308 if ((ret =srs_amf0_read_utf8(stream, property_name)) != ERROR_SUCCESS) { 417 if ((ret =srs_amf0_read_utf8(stream, property_name)) != ERROR_SUCCESS) {
@@ -311,21 +420,13 @@ int SrsAmf0Object::read(SrsStream* stream) @@ -311,21 +420,13 @@ int SrsAmf0Object::read(SrsStream* stream)
311 } 420 }
312 // property-value: any 421 // property-value: any
313 SrsAmf0Any* property_value = NULL; 422 SrsAmf0Any* property_value = NULL;
314 - if ((ret = srs_amf0_read_any(stream, property_value)) != ERROR_SUCCESS) { 423 + if ((ret = srs_amf0_read_any(stream, &property_value)) != ERROR_SUCCESS) {
315 srs_error("amf0 object read property_value failed. " 424 srs_error("amf0 object read property_value failed. "
316 "name=%s, ret=%d", property_name.c_str(), ret); 425 "name=%s, ret=%d", property_name.c_str(), ret);
  426 + srs_freep(property_value);
317 return ret; 427 return ret;
318 } 428 }
319 429
320 - // AMF0 Object EOF.  
321 - if (property_name.empty() || !property_value || property_value->is_object_eof()) {  
322 - if (property_value) {  
323 - srs_freep(property_value);  
324 - }  
325 - srs_info("amf0 read object EOF.");  
326 - break;  
327 - }  
328 -  
329 // add property 430 // add property
330 this->set(property_name, property_value); 431 this->set(property_name, property_value);
331 } 432 }
@@ -365,7 +466,7 @@ int SrsAmf0Object::write(SrsStream* stream) @@ -365,7 +466,7 @@ int SrsAmf0Object::write(SrsStream* stream)
365 srs_verbose("write amf0 property success. name=%s", name.c_str()); 466 srs_verbose("write amf0 property success. name=%s", name.c_str());
366 } 467 }
367 468
368 - if ((ret = srs_amf0_write_object_eof(stream, &this->eof)) != ERROR_SUCCESS) { 469 + if ((ret = eof.write(stream)) != ERROR_SUCCESS) {
369 srs_error("write object eof failed. ret=%d", ret); 470 srs_error("write object eof failed. ret=%d", ret);
370 return ret; 471 return ret;
371 } 472 }
@@ -465,6 +566,17 @@ int SrsAmf0EcmaArray::read(SrsStream* stream) @@ -465,6 +566,17 @@ int SrsAmf0EcmaArray::read(SrsStream* stream)
465 this->count = count; 566 this->count = count;
466 567
467 while (!stream->empty()) { 568 while (!stream->empty()) {
  569 + // detect whether is eof.
  570 + if (srs_amf0_is_object_eof(stream)) {
  571 + __SrsAmf0ObjectEOF eof;
  572 + if ((ret = eof.read(stream)) != ERROR_SUCCESS) {
  573 + srs_error("amf0 ecma_array read eof failed. ret=%d", ret);
  574 + return ret;
  575 + }
  576 + srs_info("amf0 read ecma_array EOF.");
  577 + break;
  578 + }
  579 +
468 // property-name: utf8 string 580 // property-name: utf8 string
469 std::string property_name; 581 std::string property_name;
470 if ((ret =srs_amf0_read_utf8(stream, property_name)) != ERROR_SUCCESS) { 582 if ((ret =srs_amf0_read_utf8(stream, property_name)) != ERROR_SUCCESS) {
@@ -473,21 +585,12 @@ int SrsAmf0EcmaArray::read(SrsStream* stream) @@ -473,21 +585,12 @@ int SrsAmf0EcmaArray::read(SrsStream* stream)
473 } 585 }
474 // property-value: any 586 // property-value: any
475 SrsAmf0Any* property_value = NULL; 587 SrsAmf0Any* property_value = NULL;
476 - if ((ret = srs_amf0_read_any(stream, property_value)) != ERROR_SUCCESS) { 588 + if ((ret = srs_amf0_read_any(stream, &property_value)) != ERROR_SUCCESS) {
477 srs_error("amf0 ecma_array read property_value failed. " 589 srs_error("amf0 ecma_array read property_value failed. "
478 "name=%s, ret=%d", property_name.c_str(), ret); 590 "name=%s, ret=%d", property_name.c_str(), ret);
479 return ret; 591 return ret;
480 } 592 }
481 593
482 - // AMF0 Object EOF.  
483 - if (property_name.empty() || !property_value || property_value->is_object_eof()) {  
484 - if (property_value) {  
485 - srs_freep(property_value);  
486 - }  
487 - srs_info("amf0 read ecma_array EOF.");  
488 - break;  
489 - }  
490 -  
491 // add property 594 // add property
492 this->set(property_name, property_value); 595 this->set(property_name, property_value);
493 } 596 }
@@ -536,7 +639,7 @@ int SrsAmf0EcmaArray::write(SrsStream* stream) @@ -536,7 +639,7 @@ int SrsAmf0EcmaArray::write(SrsStream* stream)
536 srs_verbose("write amf0 property success. name=%s", name.c_str()); 639 srs_verbose("write amf0 property success. name=%s", name.c_str());
537 } 640 }
538 641
539 - if ((ret = srs_amf0_write_object_eof(stream, &this->eof)) != ERROR_SUCCESS) { 642 + if ((ret = eof.write(stream)) != ERROR_SUCCESS) {
540 srs_error("write ecma_array eof failed. ret=%d", ret); 643 srs_error("write ecma_array eof failed. ret=%d", ret);
541 return ret; 644 return ret;
542 } 645 }
@@ -672,6 +775,16 @@ int __SrsAmf0String::size() @@ -672,6 +775,16 @@ int __SrsAmf0String::size()
672 return SrsAmf0Size::str(value); 775 return SrsAmf0Size::str(value);
673 } 776 }
674 777
  778 +int __SrsAmf0String::read(SrsStream* stream)
  779 +{
  780 + return srs_amf0_read_string(stream, value);
  781 +}
  782 +
  783 +int __SrsAmf0String::write(SrsStream* stream)
  784 +{
  785 + return srs_amf0_write_string(stream, value);
  786 +}
  787 +
675 __SrsAmf0Boolean::__SrsAmf0Boolean(bool _value) 788 __SrsAmf0Boolean::__SrsAmf0Boolean(bool _value)
676 { 789 {
677 marker = RTMP_AMF0_Boolean; 790 marker = RTMP_AMF0_Boolean;
@@ -687,6 +800,16 @@ int __SrsAmf0Boolean::size() @@ -687,6 +800,16 @@ int __SrsAmf0Boolean::size()
687 return SrsAmf0Size::boolean(); 800 return SrsAmf0Size::boolean();
688 } 801 }
689 802
  803 +int __SrsAmf0Boolean::read(SrsStream* stream)
  804 +{
  805 + return srs_amf0_read_boolean(stream, value);
  806 +}
  807 +
  808 +int __SrsAmf0Boolean::write(SrsStream* stream)
  809 +{
  810 + return srs_amf0_write_boolean(stream, value);
  811 +}
  812 +
690 __SrsAmf0Number::__SrsAmf0Number(double _value) 813 __SrsAmf0Number::__SrsAmf0Number(double _value)
691 { 814 {
692 marker = RTMP_AMF0_Number; 815 marker = RTMP_AMF0_Number;
@@ -702,6 +825,16 @@ int __SrsAmf0Number::size() @@ -702,6 +825,16 @@ int __SrsAmf0Number::size()
702 return SrsAmf0Size::number(); 825 return SrsAmf0Size::number();
703 } 826 }
704 827
  828 +int __SrsAmf0Number::read(SrsStream* stream)
  829 +{
  830 + return srs_amf0_read_number(stream, value);
  831 +}
  832 +
  833 +int __SrsAmf0Number::write(SrsStream* stream)
  834 +{
  835 + return srs_amf0_write_number(stream, value);
  836 +}
  837 +
705 __SrsAmf0Null::__SrsAmf0Null() 838 __SrsAmf0Null::__SrsAmf0Null()
706 { 839 {
707 marker = RTMP_AMF0_Null; 840 marker = RTMP_AMF0_Null;
@@ -716,6 +849,16 @@ int __SrsAmf0Null::size() @@ -716,6 +849,16 @@ int __SrsAmf0Null::size()
716 return SrsAmf0Size::null(); 849 return SrsAmf0Size::null();
717 } 850 }
718 851
  852 +int __SrsAmf0Null::read(SrsStream* stream)
  853 +{
  854 + return srs_amf0_read_null(stream);
  855 +}
  856 +
  857 +int __SrsAmf0Null::write(SrsStream* stream)
  858 +{
  859 + return srs_amf0_write_null(stream);
  860 +}
  861 +
719 __SrsAmf0Undefined::__SrsAmf0Undefined() 862 __SrsAmf0Undefined::__SrsAmf0Undefined()
720 { 863 {
721 marker = RTMP_AMF0_Undefined; 864 marker = RTMP_AMF0_Undefined;
@@ -730,6 +873,16 @@ int __SrsAmf0Undefined::size() @@ -730,6 +873,16 @@ int __SrsAmf0Undefined::size()
730 return SrsAmf0Size::undefined(); 873 return SrsAmf0Size::undefined();
731 } 874 }
732 875
  876 +int __SrsAmf0Undefined::read(SrsStream* stream)
  877 +{
  878 + return srs_amf0_read_undefined(stream);
  879 +}
  880 +
  881 +int __SrsAmf0Undefined::write(SrsStream* stream)
  882 +{
  883 + return srs_amf0_write_undefined(stream);
  884 +}
  885 +
733 int srs_amf0_read_utf8(SrsStream* stream, std::string& value) 886 int srs_amf0_read_utf8(SrsStream* stream, std::string& value)
734 { 887 {
735 int ret = ERROR_SUCCESS; 888 int ret = ERROR_SUCCESS;
@@ -1055,10 +1208,33 @@ int srs_amf0_write_undefined(SrsStream* stream) @@ -1055,10 +1208,33 @@ int srs_amf0_write_undefined(SrsStream* stream)
1055 return ret; 1208 return ret;
1056 } 1209 }
1057 1210
1058 -int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) 1211 +bool srs_amf0_is_object_eof(SrsStream* stream)
  1212 +{
  1213 + // detect the object-eof specially
  1214 + if (stream->require(3)) {
  1215 + int32_t flag = stream->read_3bytes();
  1216 + stream->skip(-3);
  1217 +
  1218 + return 0x09 == flag;
  1219 + }
  1220 +
  1221 + return false;
  1222 +}
  1223 +
  1224 +int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue)
1059 { 1225 {
1060 int ret = ERROR_SUCCESS; 1226 int ret = ERROR_SUCCESS;
1061 1227
  1228 + // detect the object-eof specially
  1229 + if (srs_amf0_is_object_eof(stream)) {
  1230 + *ppvalue = new __SrsAmf0ObjectEOF();
  1231 + if ((ret = (*ppvalue)->read(stream)) != ERROR_SUCCESS) {
  1232 + srs_freep(*ppvalue);
  1233 + return ret;
  1234 + }
  1235 + return ret;
  1236 + }
  1237 +
1062 // marker 1238 // marker
1063 if (!stream->require(1)) { 1239 if (!stream->require(1)) {
1064 ret = ERROR_RTMP_AMF0_DECODE; 1240 ret = ERROR_RTMP_AMF0_DECODE;
@@ -1078,7 +1254,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) @@ -1078,7 +1254,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
1078 if ((ret = srs_amf0_read_string(stream, data)) != ERROR_SUCCESS) { 1254 if ((ret = srs_amf0_read_string(stream, data)) != ERROR_SUCCESS) {
1079 return ret; 1255 return ret;
1080 } 1256 }
1081 - value = SrsAmf0Any::str(data.c_str()); 1257 + *ppvalue = SrsAmf0Any::str(data.c_str());
1082 return ret; 1258 return ret;
1083 } 1259 }
1084 case RTMP_AMF0_Boolean: { 1260 case RTMP_AMF0_Boolean: {
@@ -1086,7 +1262,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) @@ -1086,7 +1262,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
1086 if ((ret = srs_amf0_read_boolean(stream, data)) != ERROR_SUCCESS) { 1262 if ((ret = srs_amf0_read_boolean(stream, data)) != ERROR_SUCCESS) {
1087 return ret; 1263 return ret;
1088 } 1264 }
1089 - value = SrsAmf0Any::boolean(data); 1265 + *ppvalue = SrsAmf0Any::boolean(data);
1090 return ret; 1266 return ret;
1091 } 1267 }
1092 case RTMP_AMF0_Number: { 1268 case RTMP_AMF0_Number: {
@@ -1094,25 +1270,17 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) @@ -1094,25 +1270,17 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
1094 if ((ret = srs_amf0_read_number(stream, data)) != ERROR_SUCCESS) { 1270 if ((ret = srs_amf0_read_number(stream, data)) != ERROR_SUCCESS) {
1095 return ret; 1271 return ret;
1096 } 1272 }
1097 - value = SrsAmf0Any::number(data); 1273 + *ppvalue = SrsAmf0Any::number(data);
1098 return ret; 1274 return ret;
1099 } 1275 }
1100 case RTMP_AMF0_Null: { 1276 case RTMP_AMF0_Null: {
1101 stream->skip(1); 1277 stream->skip(1);
1102 - value = new __SrsAmf0Null(); 1278 + *ppvalue = new __SrsAmf0Null();
1103 return ret; 1279 return ret;
1104 } 1280 }
1105 case RTMP_AMF0_Undefined: { 1281 case RTMP_AMF0_Undefined: {
1106 stream->skip(1); 1282 stream->skip(1);
1107 - value = new __SrsAmf0Undefined();  
1108 - return ret;  
1109 - }  
1110 - case RTMP_AMF0_ObjectEnd: {  
1111 - __SrsAmf0ObjectEOF* p = NULL;  
1112 - if ((ret = srs_amf0_read_object_eof(stream, p)) != ERROR_SUCCESS) {  
1113 - return ret;  
1114 - }  
1115 - value = p; 1283 + *ppvalue = new __SrsAmf0Undefined();
1116 return ret; 1284 return ret;
1117 } 1285 }
1118 case RTMP_AMF0_Object: { 1286 case RTMP_AMF0_Object: {
@@ -1120,7 +1288,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) @@ -1120,7 +1288,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
1120 if ((ret = srs_amf0_read_object(stream, p)) != ERROR_SUCCESS) { 1288 if ((ret = srs_amf0_read_object(stream, p)) != ERROR_SUCCESS) {
1121 return ret; 1289 return ret;
1122 } 1290 }
1123 - value = p; 1291 + *ppvalue = p;
1124 return ret; 1292 return ret;
1125 } 1293 }
1126 case RTMP_AMF0_EcmaArray: { 1294 case RTMP_AMF0_EcmaArray: {
@@ -1128,7 +1296,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) @@ -1128,7 +1296,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
1128 if ((ret = srs_amf0_read_ecma_array(stream, p)) != ERROR_SUCCESS) { 1296 if ((ret = srs_amf0_read_ecma_array(stream, p)) != ERROR_SUCCESS) {
1129 return ret; 1297 return ret;
1130 } 1298 }
1131 - value = p; 1299 + *ppvalue = p;
1132 return ret; 1300 return ret;
1133 } 1301 }
1134 case RTMP_AMF0_Invalid: 1302 case RTMP_AMF0_Invalid:
@@ -1149,15 +1317,15 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) @@ -1149,15 +1317,15 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
1149 1317
1150 switch (value->marker) { 1318 switch (value->marker) {
1151 case RTMP_AMF0_String: { 1319 case RTMP_AMF0_String: {
1152 - std::string data = srs_amf0_convert<__SrsAmf0String>(value)->value; 1320 + std::string data = srs_amf0_convert<__SrsAmf0String*>(value)->value;
1153 return srs_amf0_write_string(stream, data); 1321 return srs_amf0_write_string(stream, data);
1154 } 1322 }
1155 case RTMP_AMF0_Boolean: { 1323 case RTMP_AMF0_Boolean: {
1156 - bool data = srs_amf0_convert<__SrsAmf0Boolean>(value)->value; 1324 + bool data = srs_amf0_convert<__SrsAmf0Boolean*>(value)->value;
1157 return srs_amf0_write_boolean(stream, data); 1325 return srs_amf0_write_boolean(stream, data);
1158 } 1326 }
1159 case RTMP_AMF0_Number: { 1327 case RTMP_AMF0_Number: {
1160 - double data = srs_amf0_convert<__SrsAmf0Number>(value)->value; 1328 + double data = srs_amf0_convert<__SrsAmf0Number*>(value)->value;
1161 return srs_amf0_write_number(stream, data); 1329 return srs_amf0_write_number(stream, data);
1162 } 1330 }
1163 case RTMP_AMF0_Null: { 1331 case RTMP_AMF0_Null: {
@@ -1167,15 +1335,15 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) @@ -1167,15 +1335,15 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
1167 return srs_amf0_write_undefined(stream); 1335 return srs_amf0_write_undefined(stream);
1168 } 1336 }
1169 case RTMP_AMF0_ObjectEnd: { 1337 case RTMP_AMF0_ObjectEnd: {
1170 - __SrsAmf0ObjectEOF* p = srs_amf0_convert<__SrsAmf0ObjectEOF>(value);  
1171 - return srs_amf0_write_object_eof(stream, p); 1338 + __SrsAmf0ObjectEOF* p = srs_amf0_convert<__SrsAmf0ObjectEOF*>(value);
  1339 + return p->write(stream);
1172 } 1340 }
1173 case RTMP_AMF0_Object: { 1341 case RTMP_AMF0_Object: {
1174 - SrsAmf0Object* p = srs_amf0_convert<SrsAmf0Object>(value); 1342 + SrsAmf0Object* p = srs_amf0_convert<SrsAmf0Object*>(value);
1175 return srs_amf0_write_object(stream, p); 1343 return srs_amf0_write_object(stream, p);
1176 } 1344 }
1177 case RTMP_AMF0_EcmaArray: { 1345 case RTMP_AMF0_EcmaArray: {
1178 - SrsAmf0EcmaArray* p = srs_amf0_convert<SrsAmf0EcmaArray>(value); 1346 + SrsAmf0EcmaArray* p = srs_amf0_convert<SrsAmf0EcmaArray*>(value);
1179 return srs_amf0_write_ecma_array(stream, p); 1347 return srs_amf0_write_ecma_array(stream, p);
1180 } 1348 }
1181 case RTMP_AMF0_Invalid: 1349 case RTMP_AMF0_Invalid:
@@ -1189,49 +1357,6 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) @@ -1189,49 +1357,6 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
1189 return ret; 1357 return ret;
1190 } 1358 }
1191 1359
1192 -int srs_amf0_read_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF*& value)  
1193 -{  
1194 - int ret = ERROR_SUCCESS;  
1195 -  
1196 - // auto skip -2 to read the object eof.  
1197 - srs_assert(stream->pos() >= 2);  
1198 - stream->skip(-2);  
1199 -  
1200 - // value  
1201 - if (!stream->require(2)) {  
1202 - ret = ERROR_RTMP_AMF0_DECODE;  
1203 - srs_error("amf0 read object eof value failed. ret=%d", ret);  
1204 - return ret;  
1205 - }  
1206 - int16_t temp = stream->read_2bytes();  
1207 - if (temp != 0x00) {  
1208 - ret = ERROR_RTMP_AMF0_DECODE;  
1209 - srs_error("amf0 read object eof value check failed. "  
1210 - "must be 0x00, actual is %#x, ret=%d", temp, ret);  
1211 - return ret;  
1212 - }  
1213 -  
1214 - // marker  
1215 - if (!stream->require(1)) {  
1216 - ret = ERROR_RTMP_AMF0_DECODE;  
1217 - srs_error("amf0 read object eof marker failed. ret=%d", ret);  
1218 - return ret;  
1219 - }  
1220 -  
1221 - char marker = stream->read_1bytes();  
1222 - if (marker != RTMP_AMF0_ObjectEnd) {  
1223 - ret = ERROR_RTMP_AMF0_DECODE;  
1224 - srs_error("amf0 check object eof marker failed. "  
1225 - "marker=%#x, required=%#x, ret=%d", marker, RTMP_AMF0_ObjectEnd, ret);  
1226 - return ret;  
1227 - }  
1228 - srs_verbose("amf0 read object eof marker success");  
1229 -  
1230 - value = new __SrsAmf0ObjectEOF();  
1231 - srs_verbose("amf0 read object eof success");  
1232 -  
1233 - return ret;  
1234 -}  
1235 int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF* value) 1360 int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF* value)
1236 { 1361 {
1237 int ret = ERROR_SUCCESS; 1362 int ret = ERROR_SUCCESS;
@@ -76,13 +76,22 @@ public: @@ -76,13 +76,22 @@ public:
76 */ 76 */
77 virtual double to_number(); 77 virtual double to_number();
78 public: 78 public:
  79 + /**
  80 + * get the size of amf0 any, including the marker size.
  81 + */
79 virtual int size() = 0; 82 virtual int size() = 0;
  83 + /**
  84 + * read elem from stream
  85 + */
  86 + virtual int read(SrsStream* stream) = 0;
  87 + virtual int write(SrsStream* stream) = 0;
80 public: 88 public:
81 static SrsAmf0Any* str(const char* value = NULL); 89 static SrsAmf0Any* str(const char* value = NULL);
82 static SrsAmf0Any* boolean(bool value = false); 90 static SrsAmf0Any* boolean(bool value = false);
83 static SrsAmf0Any* number(double value = 0.0); 91 static SrsAmf0Any* number(double value = 0.0);
84 static SrsAmf0Any* null(); 92 static SrsAmf0Any* null();
85 static SrsAmf0Any* undefined(); 93 static SrsAmf0Any* undefined();
  94 + static SrsAmf0Any* object_eof();
86 }; 95 };
87 96
88 /** 97 /**
@@ -125,6 +134,8 @@ public: @@ -125,6 +134,8 @@ public:
125 virtual ~__SrsAmf0ObjectEOF(); 134 virtual ~__SrsAmf0ObjectEOF();
126 135
127 virtual int size(); 136 virtual int size();
  137 + virtual int read(SrsStream* stream);
  138 + virtual int write(SrsStream* stream);
128 }; 139 };
129 140
130 /** 141 /**
@@ -219,6 +230,8 @@ public: @@ -219,6 +230,8 @@ public:
219 virtual ~__SrsAmf0String(); 230 virtual ~__SrsAmf0String();
220 231
221 virtual int size(); 232 virtual int size();
  233 + virtual int read(SrsStream* stream);
  234 + virtual int write(SrsStream* stream);
222 }; 235 };
223 236
224 /** 237 /**
@@ -237,6 +250,8 @@ public: @@ -237,6 +250,8 @@ public:
237 virtual ~__SrsAmf0Boolean(); 250 virtual ~__SrsAmf0Boolean();
238 251
239 virtual int size(); 252 virtual int size();
  253 + virtual int read(SrsStream* stream);
  254 + virtual int write(SrsStream* stream);
240 }; 255 };
241 256
242 /** 257 /**
@@ -254,6 +269,8 @@ public: @@ -254,6 +269,8 @@ public:
254 virtual ~__SrsAmf0Number(); 269 virtual ~__SrsAmf0Number();
255 270
256 virtual int size(); 271 virtual int size();
  272 + virtual int read(SrsStream* stream);
  273 + virtual int write(SrsStream* stream);
257 }; 274 };
258 275
259 /** 276 /**
@@ -268,6 +285,8 @@ public: @@ -268,6 +285,8 @@ public:
268 virtual ~__SrsAmf0Null(); 285 virtual ~__SrsAmf0Null();
269 286
270 virtual int size(); 287 virtual int size();
  288 + virtual int read(SrsStream* stream);
  289 + virtual int write(SrsStream* stream);
271 }; 290 };
272 291
273 /** 292 /**
@@ -282,20 +301,11 @@ public: @@ -282,20 +301,11 @@ public:
282 virtual ~__SrsAmf0Undefined(); 301 virtual ~__SrsAmf0Undefined();
283 302
284 virtual int size(); 303 virtual int size();
  304 + virtual int read(SrsStream* stream);
  305 + virtual int write(SrsStream* stream);
285 }; 306 };
286 307
287 /** 308 /**
288 -* read amf0 utf8 string from stream.  
289 -* 1.3.1 Strings and UTF-8  
290 -* UTF-8 = U16 *(UTF8-char)  
291 -* UTF8-char = UTF8-1 | UTF8-2 | UTF8-3 | UTF8-4  
292 -* UTF8-1 = %x00-7F  
293 -* @remark only support UTF8-1 char.  
294 -*/  
295 -extern int srs_amf0_read_utf8(SrsStream* stream, std::string& value);  
296 -extern int srs_amf0_write_utf8(SrsStream* stream, std::string value);  
297 -  
298 -/**  
299 * read amf0 string from stream. 309 * read amf0 string from stream.
300 * 2.4 String Type 310 * 2.4 String Type
301 * string-type = string-marker UTF-8 311 * string-type = string-marker UTF-8
@@ -336,7 +346,10 @@ extern int srs_amf0_write_null(SrsStream* stream); @@ -336,7 +346,10 @@ extern int srs_amf0_write_null(SrsStream* stream);
336 extern int srs_amf0_read_undefined(SrsStream* stream); 346 extern int srs_amf0_read_undefined(SrsStream* stream);
337 extern int srs_amf0_write_undefined(SrsStream* stream); 347 extern int srs_amf0_write_undefined(SrsStream* stream);
338 348
339 -extern int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value); 349 +/**
  350 +* read anything from stream.
  351 +*/
  352 +extern int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any** ppvalue);
340 353
341 /** 354 /**
342 * read amf0 object from stream. 355 * read amf0 object from stream.
@@ -357,18 +370,4 @@ extern int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value); @@ -357,18 +370,4 @@ extern int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value);
357 extern int srs_amf0_read_ecma_array(SrsStream* stream, SrsAmf0EcmaArray*& value); 370 extern int srs_amf0_read_ecma_array(SrsStream* stream, SrsAmf0EcmaArray*& value);
358 extern int srs_amf0_write_ecma_array(SrsStream* stream, SrsAmf0EcmaArray* value); 371 extern int srs_amf0_write_ecma_array(SrsStream* stream, SrsAmf0EcmaArray* value);
359 372
360 -/**  
361 -* convert the any to specified object.  
362 -* @return T*, the converted object. never NULL.  
363 -* @remark, user must ensure the current object type,  
364 -* or the covert will cause assert failed.  
365 -*/  
366 -template<class T>  
367 -T* srs_amf0_convert(SrsAmf0Any* any)  
368 -{  
369 - T* p = dynamic_cast<T*>(any);  
370 - srs_assert(p != NULL);  
371 - return p;  
372 -}  
373 -  
374 #endif 373 #endif
@@ -2617,7 +2617,7 @@ int SrsPlayPacket::decode(SrsStream* stream) @@ -2617,7 +2617,7 @@ int SrsPlayPacket::decode(SrsStream* stream)
2617 } 2617 }
2618 2618
2619 SrsAmf0Any* reset_value = NULL; 2619 SrsAmf0Any* reset_value = NULL;
2620 - if ((ret = srs_amf0_read_any(stream, reset_value)) != ERROR_SUCCESS) { 2620 + if ((ret = srs_amf0_read_any(stream, &reset_value)) != ERROR_SUCCESS) {
2621 ret = ERROR_RTMP_AMF0_DECODE; 2621 ret = ERROR_RTMP_AMF0_DECODE;
2622 srs_error("amf0 read play reset marker failed. ret=%d", ret); 2622 srs_error("amf0 read play reset marker failed. ret=%d", ret);
2623 return ret; 2623 return ret;
@@ -3183,14 +3183,14 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) @@ -3183,14 +3183,14 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream)
3183 3183
3184 // the metadata maybe object or ecma array 3184 // the metadata maybe object or ecma array
3185 SrsAmf0Any* any = NULL; 3185 SrsAmf0Any* any = NULL;
3186 - if ((ret = srs_amf0_read_any(stream, any)) != ERROR_SUCCESS) { 3186 + if ((ret = srs_amf0_read_any(stream, &any)) != ERROR_SUCCESS) {
3187 srs_error("decode metadata metadata failed. ret=%d", ret); 3187 srs_error("decode metadata metadata failed. ret=%d", ret);
3188 return ret; 3188 return ret;
3189 } 3189 }
3190 3190
3191 if (any->is_object()) { 3191 if (any->is_object()) {
3192 srs_freep(metadata); 3192 srs_freep(metadata);
3193 - metadata = srs_amf0_convert<SrsAmf0Object>(any); 3193 + metadata = dynamic_cast<SrsAmf0Object*>(any);
3194 srs_info("decode metadata object success"); 3194 srs_info("decode metadata object success");
3195 return ret; 3195 return ret;
3196 } 3196 }
@@ -23,6 +23,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -23,6 +23,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 #include <srs_utest_amf0.hpp> 23 #include <srs_utest_amf0.hpp>
24 24
25 #include <srs_core_autofree.hpp> 25 #include <srs_core_autofree.hpp>
  26 +#include <srs_kernel_error.hpp>
  27 +#include <srs_kernel_stream.hpp>
26 28
27 VOID TEST(AMF0Test, Size) 29 VOID TEST(AMF0Test, Size)
28 { 30 {
@@ -270,14 +272,14 @@ VOID TEST(AMF0Test, AnyElem) @@ -270,14 +272,14 @@ VOID TEST(AMF0Test, AnyElem)
270 if (true) { 272 if (true) {
271 o = SrsAmf0Any::str(); 273 o = SrsAmf0Any::str();
272 SrsAutoFree(SrsAmf0Any, o, false); 274 SrsAutoFree(SrsAmf0Any, o, false);
273 - EXPECT_TRUE(NULL != o); 275 + ASSERT_TRUE(NULL != o);
274 EXPECT_TRUE(o->is_string()); 276 EXPECT_TRUE(o->is_string());
275 EXPECT_STREQ("", o->to_str().c_str()); 277 EXPECT_STREQ("", o->to_str().c_str());
276 } 278 }
277 if (true) { 279 if (true) {
278 o = SrsAmf0Any::str("winlin"); 280 o = SrsAmf0Any::str("winlin");
279 SrsAutoFree(SrsAmf0Any, o, false); 281 SrsAutoFree(SrsAmf0Any, o, false);
280 - EXPECT_TRUE(NULL != o); 282 + ASSERT_TRUE(NULL != o);
281 EXPECT_TRUE(o->is_string()); 283 EXPECT_TRUE(o->is_string());
282 EXPECT_STREQ("winlin", o->to_str().c_str()); 284 EXPECT_STREQ("winlin", o->to_str().c_str());
283 } 285 }
@@ -286,21 +288,21 @@ VOID TEST(AMF0Test, AnyElem) @@ -286,21 +288,21 @@ VOID TEST(AMF0Test, AnyElem)
286 if (true) { 288 if (true) {
287 o = SrsAmf0Any::boolean(); 289 o = SrsAmf0Any::boolean();
288 SrsAutoFree(SrsAmf0Any, o, false); 290 SrsAutoFree(SrsAmf0Any, o, false);
289 - EXPECT_TRUE(NULL != o); 291 + ASSERT_TRUE(NULL != o);
290 EXPECT_TRUE(o->is_boolean()); 292 EXPECT_TRUE(o->is_boolean());
291 EXPECT_FALSE(o->to_boolean()); 293 EXPECT_FALSE(o->to_boolean());
292 } 294 }
293 if (true) { 295 if (true) {
294 o = SrsAmf0Any::boolean(false); 296 o = SrsAmf0Any::boolean(false);
295 SrsAutoFree(SrsAmf0Any, o, false); 297 SrsAutoFree(SrsAmf0Any, o, false);
296 - EXPECT_TRUE(NULL != o); 298 + ASSERT_TRUE(NULL != o);
297 EXPECT_TRUE(o->is_boolean()); 299 EXPECT_TRUE(o->is_boolean());
298 EXPECT_FALSE(o->to_boolean()); 300 EXPECT_FALSE(o->to_boolean());
299 } 301 }
300 if (true) { 302 if (true) {
301 o = SrsAmf0Any::boolean(true); 303 o = SrsAmf0Any::boolean(true);
302 SrsAutoFree(SrsAmf0Any, o, false); 304 SrsAutoFree(SrsAmf0Any, o, false);
303 - EXPECT_TRUE(NULL != o); 305 + ASSERT_TRUE(NULL != o);
304 EXPECT_TRUE(o->is_boolean()); 306 EXPECT_TRUE(o->is_boolean());
305 EXPECT_TRUE(o->to_boolean()); 307 EXPECT_TRUE(o->to_boolean());
306 } 308 }
@@ -309,21 +311,21 @@ VOID TEST(AMF0Test, AnyElem) @@ -309,21 +311,21 @@ VOID TEST(AMF0Test, AnyElem)
309 if (true) { 311 if (true) {
310 o = SrsAmf0Any::number(); 312 o = SrsAmf0Any::number();
311 SrsAutoFree(SrsAmf0Any, o, false); 313 SrsAutoFree(SrsAmf0Any, o, false);
312 - EXPECT_TRUE(NULL != o); 314 + ASSERT_TRUE(NULL != o);
313 EXPECT_TRUE(o->is_number()); 315 EXPECT_TRUE(o->is_number());
314 EXPECT_DOUBLE_EQ(0, o->to_number()); 316 EXPECT_DOUBLE_EQ(0, o->to_number());
315 } 317 }
316 if (true) { 318 if (true) {
317 o = SrsAmf0Any::number(100); 319 o = SrsAmf0Any::number(100);
318 SrsAutoFree(SrsAmf0Any, o, false); 320 SrsAutoFree(SrsAmf0Any, o, false);
319 - EXPECT_TRUE(NULL != o); 321 + ASSERT_TRUE(NULL != o);
320 EXPECT_TRUE(o->is_number()); 322 EXPECT_TRUE(o->is_number());
321 EXPECT_DOUBLE_EQ(100, o->to_number()); 323 EXPECT_DOUBLE_EQ(100, o->to_number());
322 } 324 }
323 if (true) { 325 if (true) {
324 o = SrsAmf0Any::number(-100); 326 o = SrsAmf0Any::number(-100);
325 SrsAutoFree(SrsAmf0Any, o, false); 327 SrsAutoFree(SrsAmf0Any, o, false);
326 - EXPECT_TRUE(NULL != o); 328 + ASSERT_TRUE(NULL != o);
327 EXPECT_TRUE(o->is_number()); 329 EXPECT_TRUE(o->is_number());
328 EXPECT_DOUBLE_EQ(-100, o->to_number()); 330 EXPECT_DOUBLE_EQ(-100, o->to_number());
329 } 331 }
@@ -332,7 +334,7 @@ VOID TEST(AMF0Test, AnyElem) @@ -332,7 +334,7 @@ VOID TEST(AMF0Test, AnyElem)
332 if (true) { 334 if (true) {
333 o = SrsAmf0Any::null(); 335 o = SrsAmf0Any::null();
334 SrsAutoFree(SrsAmf0Any, o, false); 336 SrsAutoFree(SrsAmf0Any, o, false);
335 - EXPECT_TRUE(NULL != o); 337 + ASSERT_TRUE(NULL != o);
336 EXPECT_TRUE(o->is_null()); 338 EXPECT_TRUE(o->is_null());
337 } 339 }
338 340
@@ -340,7 +342,261 @@ VOID TEST(AMF0Test, AnyElem) @@ -340,7 +342,261 @@ VOID TEST(AMF0Test, AnyElem)
340 if (true) { 342 if (true) {
341 o = SrsAmf0Any::undefined(); 343 o = SrsAmf0Any::undefined();
342 SrsAutoFree(SrsAmf0Any, o, false); 344 SrsAutoFree(SrsAmf0Any, o, false);
343 - EXPECT_TRUE(NULL != o); 345 + ASSERT_TRUE(NULL != o);
344 EXPECT_TRUE(o->is_undefined()); 346 EXPECT_TRUE(o->is_undefined());
345 } 347 }
346 } 348 }
  349 +
  350 +VOID TEST(AMF0Test, AnyIO)
  351 +{
  352 + SrsStream s;
  353 + SrsAmf0Any* o = NULL;
  354 +
  355 + char buf[1024];
  356 + memset(buf, 0, sizeof(buf));
  357 + EXPECT_EQ(ERROR_SUCCESS, s.initialize(buf, sizeof(buf)));
  358 +
  359 + // object eof
  360 + if (true) {
  361 + s.reset();
  362 + s.current()[2] = 0x09;
  363 +
  364 + o = SrsAmf0Any::object_eof();
  365 + SrsAutoFree(SrsAmf0Any, o, false);
  366 +
  367 + EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
  368 + EXPECT_EQ(o->size(), s.pos());
  369 + EXPECT_EQ(3, s.pos());
  370 +
  371 + s.reset();
  372 + s.current()[0] = 0x01;
  373 + EXPECT_NE(ERROR_SUCCESS, o->read(&s));
  374 + }
  375 + if (true) {
  376 + s.reset();
  377 +
  378 + o = SrsAmf0Any::object_eof();
  379 + SrsAutoFree(SrsAmf0Any, o, false);
  380 +
  381 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  382 + EXPECT_EQ(o->size(), s.pos());
  383 + EXPECT_EQ(3, s.pos());
  384 +
  385 + s.skip(-3);
  386 + EXPECT_EQ(0x09, s.read_3bytes());
  387 + }
  388 +
  389 + // string
  390 + if (true) {
  391 + s.reset();
  392 +
  393 + o = SrsAmf0Any::str("winlin");
  394 + SrsAutoFree(SrsAmf0Any, o, false);
  395 +
  396 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  397 + EXPECT_EQ(o->size(), s.pos());
  398 +
  399 + s.reset();
  400 + EXPECT_EQ(2, s.read_1bytes());
  401 + EXPECT_EQ(6, s.read_2bytes());
  402 + EXPECT_EQ('w', s.current()[0]);
  403 + EXPECT_EQ('n', s.current()[5]);
  404 +
  405 + s.reset();
  406 + s.current()[3] = 'x';
  407 + EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
  408 + EXPECT_EQ(o->size(), s.pos());
  409 + EXPECT_STREQ("xinlin", o->to_str().c_str());
  410 + }
  411 +
  412 + // number
  413 + if (true) {
  414 + s.reset();
  415 +
  416 + o = SrsAmf0Any::number(10);
  417 + SrsAutoFree(SrsAmf0Any, o, false);
  418 +
  419 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  420 + EXPECT_EQ(o->size(), s.pos());
  421 +
  422 + s.reset();
  423 + EXPECT_EQ(0, s.read_1bytes());
  424 +
  425 + s.reset();
  426 + EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
  427 + EXPECT_EQ(o->size(), s.pos());
  428 + EXPECT_DOUBLE_EQ(10, o->to_number());
  429 + }
  430 +
  431 + // boolean
  432 + if (true) {
  433 + s.reset();
  434 +
  435 + o = SrsAmf0Any::boolean(true);
  436 + SrsAutoFree(SrsAmf0Any, o, false);
  437 +
  438 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  439 + EXPECT_EQ(o->size(), s.pos());
  440 +
  441 + s.reset();
  442 + EXPECT_EQ(1, s.read_1bytes());
  443 +
  444 + s.reset();
  445 + EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
  446 + EXPECT_EQ(o->size(), s.pos());
  447 + EXPECT_TRUE(o->to_boolean());
  448 + }
  449 + if (true) {
  450 + s.reset();
  451 +
  452 + o = SrsAmf0Any::boolean(false);
  453 + SrsAutoFree(SrsAmf0Any, o, false);
  454 +
  455 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  456 + EXPECT_EQ(o->size(), s.pos());
  457 +
  458 + s.reset();
  459 + EXPECT_EQ(1, s.read_1bytes());
  460 +
  461 + s.reset();
  462 + EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
  463 + EXPECT_EQ(o->size(), s.pos());
  464 + EXPECT_FALSE(o->to_boolean());
  465 + }
  466 +
  467 + // null
  468 + if (true) {
  469 + s.reset();
  470 +
  471 + o = SrsAmf0Any::null();
  472 + SrsAutoFree(SrsAmf0Any, o, false);
  473 +
  474 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  475 + EXPECT_EQ(o->size(), s.pos());
  476 +
  477 + s.reset();
  478 + EXPECT_EQ(5, s.read_1bytes());
  479 +
  480 + s.reset();
  481 + EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
  482 + EXPECT_EQ(o->size(), s.pos());
  483 + EXPECT_TRUE(o->is_null());
  484 + }
  485 +
  486 + // undefined
  487 + if (true) {
  488 + s.reset();
  489 +
  490 + o = SrsAmf0Any::undefined();
  491 + SrsAutoFree(SrsAmf0Any, o, false);
  492 +
  493 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  494 + EXPECT_EQ(o->size(), s.pos());
  495 +
  496 + s.reset();
  497 + EXPECT_EQ(6, s.read_1bytes());
  498 +
  499 + s.reset();
  500 + EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
  501 + EXPECT_EQ(o->size(), s.pos());
  502 + EXPECT_TRUE(o->is_undefined());
  503 + }
  504 +
  505 + // any: string
  506 + if (true) {
  507 + s.reset();
  508 +
  509 + o = SrsAmf0Any::str("winlin");
  510 + SrsAutoFree(SrsAmf0Any, o, false);
  511 +
  512 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  513 + EXPECT_EQ(o->size(), s.pos());
  514 +
  515 + s.reset();
  516 +
  517 + SrsAmf0Any* po = NULL;
  518 + EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
  519 + ASSERT_TRUE(NULL != po);
  520 + SrsAutoFree(SrsAmf0Any, po, false);
  521 + ASSERT_TRUE(po->is_string());
  522 + EXPECT_STREQ("winlin", po->to_str().c_str());
  523 + }
  524 +
  525 + // any: number
  526 + if (true) {
  527 + s.reset();
  528 +
  529 + o = SrsAmf0Any::number(10);
  530 + SrsAutoFree(SrsAmf0Any, o, false);
  531 +
  532 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  533 + EXPECT_EQ(o->size(), s.pos());
  534 +
  535 + s.reset();
  536 +
  537 + SrsAmf0Any* po = NULL;
  538 + EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
  539 + ASSERT_TRUE(NULL != po);
  540 + SrsAutoFree(SrsAmf0Any, po, false);
  541 + ASSERT_TRUE(po->is_number());
  542 + EXPECT_DOUBLE_EQ(10, po->to_number());
  543 + }
  544 +
  545 + // any: boolean
  546 + if (true) {
  547 + s.reset();
  548 +
  549 + o = SrsAmf0Any::boolean(true);
  550 + SrsAutoFree(SrsAmf0Any, o, false);
  551 +
  552 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  553 + EXPECT_EQ(o->size(), s.pos());
  554 +
  555 + s.reset();
  556 +
  557 + SrsAmf0Any* po = NULL;
  558 + EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
  559 + ASSERT_TRUE(NULL != po);
  560 + SrsAutoFree(SrsAmf0Any, po, false);
  561 + ASSERT_TRUE(po->is_boolean());
  562 + EXPECT_TRUE(po->to_boolean());
  563 + }
  564 +
  565 + // any: null
  566 + if (true) {
  567 + s.reset();
  568 +
  569 + o = SrsAmf0Any::null();
  570 + SrsAutoFree(SrsAmf0Any, o, false);
  571 +
  572 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  573 + EXPECT_EQ(o->size(), s.pos());
  574 +
  575 + s.reset();
  576 +
  577 + SrsAmf0Any* po = NULL;
  578 + EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
  579 + ASSERT_TRUE(NULL != po);
  580 + SrsAutoFree(SrsAmf0Any, po, false);
  581 + ASSERT_TRUE(po->is_null());
  582 + }
  583 +
  584 + // any: undefined
  585 + if (true) {
  586 + s.reset();
  587 +
  588 + o = SrsAmf0Any::undefined();
  589 + SrsAutoFree(SrsAmf0Any, o, false);
  590 +
  591 + EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
  592 + EXPECT_EQ(o->size(), s.pos());
  593 +
  594 + s.reset();
  595 +
  596 + SrsAmf0Any* po = NULL;
  597 + EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
  598 + ASSERT_TRUE(NULL != po);
  599 + SrsAutoFree(SrsAmf0Any, po, false);
  600 + ASSERT_TRUE(po->is_undefined());
  601 + }
  602 +}
@@ -28,6 +28,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -28,6 +28,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 #include <srs_utest_amf0.hpp> 28 #include <srs_utest_amf0.hpp>
29 */ 29 */
30 #include <srs_utest.hpp> 30 #include <srs_utest.hpp>
  31 +
31 #include <srs_protocol_amf0.hpp> 32 #include <srs_protocol_amf0.hpp>
32 33
33 #endif 34 #endif