正在显示
6 个修改的文件
包含
514 行增加
和
137 行删除
| @@ -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 |
-
请 注册 或 登录 后发表评论