winlin

amf0 utest, refine amf0 size and object/array read/write

@@ -335,20 +335,18 @@ LINK_OPTIONS="-ldl${SrsGprofLink}${SrsGperfLink}" @@ -335,20 +335,18 @@ LINK_OPTIONS="-ldl${SrsGprofLink}${SrsGperfLink}"
335 # srs: 335 # srs:
336 # srs(simple rtmp server) over st(state-threads) 336 # srs(simple rtmp server) over st(state-threads)
337 BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . auto/apps.sh 337 BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . auto/apps.sh
338 -# 338 +# bandwidth test tool, to test the bandwidth to server
339 if [ $SRS_BWTC = YES ]; then 339 if [ $SRS_BWTC = YES ]; then
340 - # bandwidth test tool, to test the bandwidth to server  
341 BUILD_KEY="bandwidth" APP_MAIN="srs_main_bandcheck" APP_NAME="bandwidth" . auto/apps.sh 340 BUILD_KEY="bandwidth" APP_MAIN="srs_main_bandcheck" APP_NAME="bandwidth" . auto/apps.sh
342 fi 341 fi
343 -# 342 +# srs librtmp
344 if [ $SRS_LIBRTMP = YES ]; then 343 if [ $SRS_LIBRTMP = YES ]; then
345 - # srs librtmp  
346 MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${LIBS_OBJS[@]}" 344 MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${LIBS_OBJS[@]}"
347 BUILD_KEY="librtmp" LIB_NAME="lib/srs_librtmp" . auto/libs.sh 345 BUILD_KEY="librtmp" LIB_NAME="lib/srs_librtmp" . auto/libs.sh
348 fi 346 fi
349 # 347 #
350 # utest, the unit-test cases of srs, base on gtest1.6 348 # utest, the unit-test cases of srs, base on gtest1.6
351 -MODULE_FILES=("srs_utest") 349 +MODULE_FILES=("srs_utest" "srs_utest_amf0")
352 ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot}) 350 ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot})
353 ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile}) 351 ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile})
354 MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP") 352 MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP")
@@ -24,6 +24,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -24,6 +24,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 #include <srs_protocol_amf0.hpp> 24 #include <srs_protocol_amf0.hpp>
25 25
26 #include <utility> 26 #include <utility>
  27 +using namespace std;
27 28
28 #include <srs_kernel_log.hpp> 29 #include <srs_kernel_log.hpp>
29 #include <srs_kernel_error.hpp> 30 #include <srs_kernel_error.hpp>
@@ -55,8 +56,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -55,8 +56,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
55 // User defined 56 // User defined
56 #define RTMP_AMF0_Invalid 0x3F 57 #define RTMP_AMF0_Invalid 0x3F
57 58
58 -int srs_amf0_get_object_eof_size();  
59 -int srs_amf0_get_any_size(SrsAmf0Any* value);  
60 int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*&); 59 int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*&);
61 int srs_amf0_write_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*); 60 int srs_amf0_write_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*);
62 int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value); 61 int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value);
@@ -123,6 +122,11 @@ SrsAmf0String::~SrsAmf0String() @@ -123,6 +122,11 @@ SrsAmf0String::~SrsAmf0String()
123 { 122 {
124 } 123 }
125 124
  125 +int SrsAmf0String::size()
  126 +{
  127 + return SrsAmf0Size::str(value);
  128 +}
  129 +
126 SrsAmf0Boolean::SrsAmf0Boolean(bool _value) 130 SrsAmf0Boolean::SrsAmf0Boolean(bool _value)
127 { 131 {
128 marker = RTMP_AMF0_Boolean; 132 marker = RTMP_AMF0_Boolean;
@@ -133,6 +137,11 @@ SrsAmf0Boolean::~SrsAmf0Boolean() @@ -133,6 +137,11 @@ SrsAmf0Boolean::~SrsAmf0Boolean()
133 { 137 {
134 } 138 }
135 139
  140 +int SrsAmf0Boolean::size()
  141 +{
  142 + return SrsAmf0Size::boolean();
  143 +}
  144 +
136 SrsAmf0Number::SrsAmf0Number(double _value) 145 SrsAmf0Number::SrsAmf0Number(double _value)
137 { 146 {
138 marker = RTMP_AMF0_Number; 147 marker = RTMP_AMF0_Number;
@@ -143,6 +152,11 @@ SrsAmf0Number::~SrsAmf0Number() @@ -143,6 +152,11 @@ SrsAmf0Number::~SrsAmf0Number()
143 { 152 {
144 } 153 }
145 154
  155 +int SrsAmf0Number::size()
  156 +{
  157 + return SrsAmf0Size::number();
  158 +}
  159 +
146 SrsAmf0Null::SrsAmf0Null() 160 SrsAmf0Null::SrsAmf0Null()
147 { 161 {
148 marker = RTMP_AMF0_Null; 162 marker = RTMP_AMF0_Null;
@@ -152,6 +166,11 @@ SrsAmf0Null::~SrsAmf0Null() @@ -152,6 +166,11 @@ SrsAmf0Null::~SrsAmf0Null()
152 { 166 {
153 } 167 }
154 168
  169 +int SrsAmf0Null::size()
  170 +{
  171 + return SrsAmf0Size::null();
  172 +}
  173 +
155 SrsAmf0Undefined::SrsAmf0Undefined() 174 SrsAmf0Undefined::SrsAmf0Undefined()
156 { 175 {
157 marker = RTMP_AMF0_Undefined; 176 marker = RTMP_AMF0_Undefined;
@@ -161,6 +180,11 @@ SrsAmf0Undefined::~SrsAmf0Undefined() @@ -161,6 +180,11 @@ SrsAmf0Undefined::~SrsAmf0Undefined()
161 { 180 {
162 } 181 }
163 182
  183 +int SrsAmf0Undefined::size()
  184 +{
  185 + return SrsAmf0Size::undefined();
  186 +}
  187 +
164 SrsAmf0ObjectEOF::SrsAmf0ObjectEOF() 188 SrsAmf0ObjectEOF::SrsAmf0ObjectEOF()
165 { 189 {
166 marker = RTMP_AMF0_ObjectEnd; 190 marker = RTMP_AMF0_ObjectEnd;
@@ -171,6 +195,11 @@ SrsAmf0ObjectEOF::~SrsAmf0ObjectEOF() @@ -171,6 +195,11 @@ SrsAmf0ObjectEOF::~SrsAmf0ObjectEOF()
171 { 195 {
172 } 196 }
173 197
  198 +int SrsAmf0ObjectEOF::size()
  199 +{
  200 + return SrsAmf0Size::object_eof();
  201 +}
  202 +
174 SrsUnSortedHashtable::SrsUnSortedHashtable() 203 SrsUnSortedHashtable::SrsUnSortedHashtable()
175 { 204 {
176 } 205 }
@@ -284,9 +313,115 @@ SrsAmf0Object::~SrsAmf0Object() @@ -284,9 +313,115 @@ SrsAmf0Object::~SrsAmf0Object()
284 { 313 {
285 } 314 }
286 315
  316 +int SrsAmf0Object::read(SrsStream* stream)
  317 +{
  318 + int ret = ERROR_SUCCESS;
  319 +
  320 + // marker
  321 + if (!stream->require(1)) {
  322 + ret = ERROR_RTMP_AMF0_DECODE;
  323 + srs_error("amf0 read object marker failed. ret=%d", ret);
  324 + return ret;
  325 + }
  326 +
  327 + char marker = stream->read_1bytes();
  328 + if (marker != RTMP_AMF0_Object) {
  329 + ret = ERROR_RTMP_AMF0_DECODE;
  330 + srs_error("amf0 check object marker failed. "
  331 + "marker=%#x, required=%#x, ret=%d", marker, RTMP_AMF0_Object, ret);
  332 + return ret;
  333 + }
  334 + srs_verbose("amf0 read object marker success");
  335 +
  336 + // value
  337 + while (!stream->empty()) {
  338 + // property-name: utf8 string
  339 + std::string property_name;
  340 + if ((ret =srs_amf0_read_utf8(stream, property_name)) != ERROR_SUCCESS) {
  341 + srs_error("amf0 object read property name failed. ret=%d", ret);
  342 + return ret;
  343 + }
  344 + // property-value: any
  345 + SrsAmf0Any* property_value = NULL;
  346 + if ((ret = srs_amf0_read_any(stream, property_value)) != ERROR_SUCCESS) {
  347 + srs_error("amf0 object read property_value failed. "
  348 + "name=%s, ret=%d", property_name.c_str(), ret);
  349 + return ret;
  350 + }
  351 +
  352 + // AMF0 Object EOF.
  353 + if (property_name.empty() || !property_value || property_value->is_object_eof()) {
  354 + if (property_value) {
  355 + srs_freep(property_value);
  356 + }
  357 + srs_info("amf0 read object EOF.");
  358 + break;
  359 + }
  360 +
  361 + // add property
  362 + this->set(property_name, property_value);
  363 + }
  364 +
  365 + return ret;
  366 +}
  367 +
  368 +int SrsAmf0Object::write(SrsStream* stream)
  369 +{
  370 + int ret = ERROR_SUCCESS;
  371 +
  372 + // marker
  373 + if (!stream->require(1)) {
  374 + ret = ERROR_RTMP_AMF0_ENCODE;
  375 + srs_error("amf0 write object marker failed. ret=%d", ret);
  376 + return ret;
  377 + }
  378 +
  379 + stream->write_1bytes(RTMP_AMF0_Object);
  380 + srs_verbose("amf0 write object marker success");
  381 +
  382 + // value
  383 + for (int i = 0; i < properties.size(); i++) {
  384 + std::string name = this->key_at(i);
  385 + SrsAmf0Any* any = this->value_at(i);
  386 +
  387 + if ((ret = srs_amf0_write_utf8(stream, name)) != ERROR_SUCCESS) {
  388 + srs_error("write object property name failed. ret=%d", ret);
  389 + return ret;
  390 + }
  391 +
  392 + if ((ret = srs_amf0_write_any(stream, any)) != ERROR_SUCCESS) {
  393 + srs_error("write object property value failed. ret=%d", ret);
  394 + return ret;
  395 + }
  396 +
  397 + srs_verbose("write amf0 property success. name=%s", name.c_str());
  398 + }
  399 +
  400 + if ((ret = srs_amf0_write_object_eof(stream, &this->eof)) != ERROR_SUCCESS) {
  401 + srs_error("write object eof failed. ret=%d", ret);
  402 + return ret;
  403 + }
  404 +
  405 + srs_verbose("write amf0 object success.");
  406 +
  407 + return ret;
  408 +}
  409 +
287 int SrsAmf0Object::size() 410 int SrsAmf0Object::size()
288 { 411 {
289 - return properties.size(); 412 + int size = 1;
  413 +
  414 + for (int i = 0; i < properties.size(); i++){
  415 + std::string name = key_at(i);
  416 + SrsAmf0Any* value = value_at(i);
  417 +
  418 + size += SrsAmf0Size::utf8(name);
  419 + size += SrsAmf0Size::any(value);
  420 + }
  421 +
  422 + size += SrsAmf0Size::object_eof();
  423 +
  424 + return size;
290 } 425 }
291 426
292 std::string SrsAmf0Object::key_at(int index) 427 std::string SrsAmf0Object::key_at(int index)
@@ -319,46 +454,173 @@ SrsAmf0Any* SrsAmf0Object::ensure_property_number(std::string name) @@ -319,46 +454,173 @@ SrsAmf0Any* SrsAmf0Object::ensure_property_number(std::string name)
319 return properties.ensure_property_number(name); 454 return properties.ensure_property_number(name);
320 } 455 }
321 456
322 -SrsASrsAmf0EcmaArray::SrsASrsAmf0EcmaArray() 457 +SrsAmf0EcmaArray::SrsAmf0EcmaArray()
323 { 458 {
324 marker = RTMP_AMF0_EcmaArray; 459 marker = RTMP_AMF0_EcmaArray;
325 } 460 }
326 461
327 -SrsASrsAmf0EcmaArray::~SrsASrsAmf0EcmaArray() 462 +SrsAmf0EcmaArray::~SrsAmf0EcmaArray()
  463 +{
  464 +}
  465 +
  466 +int SrsAmf0EcmaArray::read(SrsStream* stream)
328 { 467 {
  468 + int ret = ERROR_SUCCESS;
  469 +
  470 + // marker
  471 + if (!stream->require(1)) {
  472 + ret = ERROR_RTMP_AMF0_DECODE;
  473 + srs_error("amf0 read ecma_array marker failed. ret=%d", ret);
  474 + return ret;
  475 + }
  476 +
  477 + char marker = stream->read_1bytes();
  478 + if (marker != RTMP_AMF0_EcmaArray) {
  479 + ret = ERROR_RTMP_AMF0_DECODE;
  480 + srs_error("amf0 check ecma_array marker failed. "
  481 + "marker=%#x, required=%#x, ret=%d", marker, RTMP_AMF0_Object, ret);
  482 + return ret;
  483 + }
  484 + srs_verbose("amf0 read ecma_array marker success");
  485 +
  486 + // count
  487 + if (!stream->require(4)) {
  488 + ret = ERROR_RTMP_AMF0_DECODE;
  489 + srs_error("amf0 read ecma_array count failed. ret=%d", ret);
  490 + return ret;
  491 + }
  492 +
  493 + int32_t count = stream->read_4bytes();
  494 + srs_verbose("amf0 read ecma_array count success. count=%d", count);
  495 +
  496 + // value
  497 + this->count = count;
  498 +
  499 + while (!stream->empty()) {
  500 + // property-name: utf8 string
  501 + std::string property_name;
  502 + if ((ret =srs_amf0_read_utf8(stream, property_name)) != ERROR_SUCCESS) {
  503 + srs_error("amf0 ecma_array read property name failed. ret=%d", ret);
  504 + return ret;
  505 + }
  506 + // property-value: any
  507 + SrsAmf0Any* property_value = NULL;
  508 + if ((ret = srs_amf0_read_any(stream, property_value)) != ERROR_SUCCESS) {
  509 + srs_error("amf0 ecma_array read property_value failed. "
  510 + "name=%s, ret=%d", property_name.c_str(), ret);
  511 + return ret;
  512 + }
  513 +
  514 + // AMF0 Object EOF.
  515 + if (property_name.empty() || !property_value || property_value->is_object_eof()) {
  516 + if (property_value) {
  517 + srs_freep(property_value);
  518 + }
  519 + srs_info("amf0 read ecma_array EOF.");
  520 + break;
  521 + }
  522 +
  523 + // add property
  524 + this->set(property_name, property_value);
  525 + }
  526 +
  527 + return ret;
329 } 528 }
  529 +int SrsAmf0EcmaArray::write(SrsStream* stream)
  530 +{
  531 + int ret = ERROR_SUCCESS;
  532 +
  533 + // marker
  534 + if (!stream->require(1)) {
  535 + ret = ERROR_RTMP_AMF0_ENCODE;
  536 + srs_error("amf0 write ecma_array marker failed. ret=%d", ret);
  537 + return ret;
  538 + }
  539 +
  540 + stream->write_1bytes(RTMP_AMF0_EcmaArray);
  541 + srs_verbose("amf0 write ecma_array marker success");
330 542
331 -int SrsASrsAmf0EcmaArray::size() 543 + // count
  544 + if (!stream->require(4)) {
  545 + ret = ERROR_RTMP_AMF0_ENCODE;
  546 + srs_error("amf0 write ecma_array count failed. ret=%d", ret);
  547 + return ret;
  548 + }
  549 +
  550 + stream->write_4bytes(this->count);
  551 + srs_verbose("amf0 write ecma_array count success. count=%d", value->count);
  552 +
  553 + // value
  554 + for (int i = 0; i < properties.size(); i++) {
  555 + std::string name = this->key_at(i);
  556 + SrsAmf0Any* any = this->value_at(i);
  557 +
  558 + if ((ret = srs_amf0_write_utf8(stream, name)) != ERROR_SUCCESS) {
  559 + srs_error("write ecma_array property name failed. ret=%d", ret);
  560 + return ret;
  561 + }
  562 +
  563 + if ((ret = srs_amf0_write_any(stream, any)) != ERROR_SUCCESS) {
  564 + srs_error("write ecma_array property value failed. ret=%d", ret);
  565 + return ret;
  566 + }
  567 +
  568 + srs_verbose("write amf0 property success. name=%s", name.c_str());
  569 + }
  570 +
  571 + if ((ret = srs_amf0_write_object_eof(stream, &this->eof)) != ERROR_SUCCESS) {
  572 + srs_error("write ecma_array eof failed. ret=%d", ret);
  573 + return ret;
  574 + }
  575 +
  576 + srs_verbose("write ecma_array object success.");
  577 +
  578 + return ret;
  579 +}
  580 +
  581 +int SrsAmf0EcmaArray::size()
332 { 582 {
333 - return properties.size(); 583 + int size = 1 + 4;
  584 +
  585 + for (int i = 0; i < properties.size(); i++){
  586 + std::string name = key_at(i);
  587 + SrsAmf0Any* value = value_at(i);
  588 +
  589 + size += SrsAmf0Size::utf8(name);
  590 + size += SrsAmf0Size::any(value);
  591 + }
  592 +
  593 + size += SrsAmf0Size::object_eof();
  594 +
  595 + return size;
334 } 596 }
335 597
336 -void SrsASrsAmf0EcmaArray::clear() 598 +void SrsAmf0EcmaArray::clear()
337 { 599 {
338 properties.clear(); 600 properties.clear();
339 } 601 }
340 602
341 -std::string SrsASrsAmf0EcmaArray::key_at(int index) 603 +std::string SrsAmf0EcmaArray::key_at(int index)
342 { 604 {
343 return properties.key_at(index); 605 return properties.key_at(index);
344 } 606 }
345 607
346 -SrsAmf0Any* SrsASrsAmf0EcmaArray::value_at(int index) 608 +SrsAmf0Any* SrsAmf0EcmaArray::value_at(int index)
347 { 609 {
348 return properties.value_at(index); 610 return properties.value_at(index);
349 } 611 }
350 612
351 -void SrsASrsAmf0EcmaArray::set(std::string key, SrsAmf0Any* value) 613 +void SrsAmf0EcmaArray::set(std::string key, SrsAmf0Any* value)
352 { 614 {
353 properties.set(key, value); 615 properties.set(key, value);
354 } 616 }
355 617
356 -SrsAmf0Any* SrsASrsAmf0EcmaArray::get_property(std::string name) 618 +SrsAmf0Any* SrsAmf0EcmaArray::get_property(std::string name)
357 { 619 {
358 return properties.get_property(name); 620 return properties.get_property(name);
359 } 621 }
360 622
361 -SrsAmf0Any* SrsASrsAmf0EcmaArray::ensure_property_string(std::string name) 623 +SrsAmf0Any* SrsAmf0EcmaArray::ensure_property_string(std::string name)
362 { 624 {
363 return properties.ensure_property_string(name); 625 return properties.ensure_property_string(name);
364 } 626 }
@@ -760,7 +1022,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) @@ -760,7 +1022,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
760 return ret; 1022 return ret;
761 } 1023 }
762 case RTMP_AMF0_EcmaArray: { 1024 case RTMP_AMF0_EcmaArray: {
763 - SrsASrsAmf0EcmaArray* p = NULL; 1025 + SrsAmf0EcmaArray* p = NULL;
764 if ((ret = srs_amf0_read_ecma_array(stream, p)) != ERROR_SUCCESS) { 1026 if ((ret = srs_amf0_read_ecma_array(stream, p)) != ERROR_SUCCESS) {
765 return ret; 1027 return ret;
766 } 1028 }
@@ -811,7 +1073,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) @@ -811,7 +1073,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
811 return srs_amf0_write_object(stream, p); 1073 return srs_amf0_write_object(stream, p);
812 } 1074 }
813 case RTMP_AMF0_EcmaArray: { 1075 case RTMP_AMF0_EcmaArray: {
814 - SrsASrsAmf0EcmaArray* p = srs_amf0_convert<SrsASrsAmf0EcmaArray>(value); 1076 + SrsAmf0EcmaArray* p = srs_amf0_convert<SrsAmf0EcmaArray>(value);
815 return srs_amf0_write_ecma_array(stream, p); 1077 return srs_amf0_write_ecma_array(stream, p);
816 } 1078 }
817 case RTMP_AMF0_Invalid: 1079 case RTMP_AMF0_Invalid:
@@ -824,59 +1086,6 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value) @@ -824,59 +1086,6 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
824 1086
825 return ret; 1087 return ret;
826 } 1088 }
827 -int srs_amf0_get_any_size(SrsAmf0Any* value)  
828 -{  
829 - if (!value) {  
830 - return 0;  
831 - }  
832 -  
833 - int size = 0;  
834 -  
835 - switch (value->marker) {  
836 - case RTMP_AMF0_String: {  
837 - SrsAmf0String* p = srs_amf0_convert<SrsAmf0String>(value);  
838 - size += srs_amf0_get_string_size(p->value);  
839 - break;  
840 - }  
841 - case RTMP_AMF0_Boolean: {  
842 - size += srs_amf0_get_boolean_size();  
843 - break;  
844 - }  
845 - case RTMP_AMF0_Number: {  
846 - size += srs_amf0_get_number_size();  
847 - break;  
848 - }  
849 - case RTMP_AMF0_Null: {  
850 - size += srs_amf0_get_null_size();  
851 - break;  
852 - }  
853 - case RTMP_AMF0_Undefined: {  
854 - size += srs_amf0_get_undefined_size();  
855 - break;  
856 - }  
857 - case RTMP_AMF0_ObjectEnd: {  
858 - size += srs_amf0_get_object_eof_size();  
859 - break;  
860 - }  
861 - case RTMP_AMF0_Object: {  
862 - SrsAmf0Object* p = srs_amf0_convert<SrsAmf0Object>(value);  
863 - size += srs_amf0_get_object_size(p);  
864 - break;  
865 - }  
866 - case RTMP_AMF0_EcmaArray: {  
867 - SrsASrsAmf0EcmaArray* p = srs_amf0_convert<SrsASrsAmf0EcmaArray>(value);  
868 - size += srs_amf0_get_ecma_array_size(p);  
869 - break;  
870 - }  
871 - default: {  
872 - // TOOD: other AMF0 types.  
873 - srs_warn("ignore unkown AMF0 type size.");  
874 - break;  
875 - }  
876 - }  
877 -  
878 - return size;  
879 -}  
880 1089
881 int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value) 1090 int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value)
882 { 1091 {
@@ -954,290 +1163,96 @@ int srs_amf0_read_object(SrsStream* stream, SrsAmf0Object*& value) @@ -954,290 +1163,96 @@ int srs_amf0_read_object(SrsStream* stream, SrsAmf0Object*& value)
954 { 1163 {
955 int ret = ERROR_SUCCESS; 1164 int ret = ERROR_SUCCESS;
956 1165
957 - // marker  
958 - if (!stream->require(1)) {  
959 - ret = ERROR_RTMP_AMF0_DECODE;  
960 - srs_error("amf0 read object marker failed. ret=%d", ret);  
961 - return ret;  
962 - } 1166 + value = new SrsAmf0Object();
963 1167
964 - char marker = stream->read_1bytes();  
965 - if (marker != RTMP_AMF0_Object) {  
966 - ret = ERROR_RTMP_AMF0_DECODE;  
967 - srs_error("amf0 check object marker failed. "  
968 - "marker=%#x, required=%#x, ret=%d", marker, RTMP_AMF0_Object, ret); 1168 + if ((ret = value->read(stream)) != ERROR_SUCCESS) {
  1169 + srs_freep(value);
969 return ret; 1170 return ret;
970 } 1171 }
971 - srs_verbose("amf0 read object marker success");  
972 -  
973 - // value  
974 - value = new SrsAmf0Object();  
975 -  
976 - while (!stream->empty()) {  
977 - // property-name: utf8 string  
978 - std::string property_name;  
979 - if ((ret =srs_amf0_read_utf8(stream, property_name)) != ERROR_SUCCESS) {  
980 - srs_error("amf0 object read property name failed. ret=%d", ret);  
981 - return ret;  
982 - }  
983 - // property-value: any  
984 - SrsAmf0Any* property_value = NULL;  
985 - if ((ret = srs_amf0_read_any(stream, property_value)) != ERROR_SUCCESS) {  
986 - srs_error("amf0 object read property_value failed. "  
987 - "name=%s, ret=%d", property_name.c_str(), ret);  
988 - return ret;  
989 - }  
990 -  
991 - // AMF0 Object EOF.  
992 - if (property_name.empty() || !property_value || property_value->is_object_eof()) {  
993 - if (property_value) {  
994 - srs_freep(property_value);  
995 - }  
996 - srs_info("amf0 read object EOF.");  
997 - break;  
998 - }  
999 -  
1000 - // add property  
1001 - value->set(property_name, property_value);  
1002 - }  
1003 1172
1004 return ret; 1173 return ret;
1005 } 1174 }
1006 int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value) 1175 int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value)
1007 { 1176 {
1008 - int ret = ERROR_SUCCESS;  
1009 -  
1010 - srs_assert(value != NULL);  
1011 -  
1012 - // marker  
1013 - if (!stream->require(1)) {  
1014 - ret = ERROR_RTMP_AMF0_ENCODE;  
1015 - srs_error("amf0 write object marker failed. ret=%d", ret);  
1016 - return ret;  
1017 - }  
1018 -  
1019 - stream->write_1bytes(RTMP_AMF0_Object);  
1020 - srs_verbose("amf0 write object marker success");  
1021 -  
1022 - // value  
1023 - for (int i = 0; i < value->size(); i++) {  
1024 - std::string name = value->key_at(i);  
1025 - SrsAmf0Any* any = value->value_at(i);  
1026 -  
1027 - if ((ret = srs_amf0_write_utf8(stream, name)) != ERROR_SUCCESS) {  
1028 - srs_error("write object property name failed. ret=%d", ret);  
1029 - return ret;  
1030 - }  
1031 -  
1032 - if ((ret = srs_amf0_write_any(stream, any)) != ERROR_SUCCESS) {  
1033 - srs_error("write object property value failed. ret=%d", ret);  
1034 - return ret;  
1035 - }  
1036 -  
1037 - srs_verbose("write amf0 property success. name=%s", name.c_str());  
1038 - }  
1039 -  
1040 - if ((ret = srs_amf0_write_object_eof(stream, &value->eof)) != ERROR_SUCCESS) {  
1041 - srs_error("write object eof failed. ret=%d", ret);  
1042 - return ret;  
1043 - }  
1044 -  
1045 - srs_verbose("write amf0 object success.");  
1046 -  
1047 - return ret; 1177 + return value->write(stream);
1048 } 1178 }
1049 1179
1050 -int srs_amf0_read_ecma_array(SrsStream* stream, SrsASrsAmf0EcmaArray*& value) 1180 +int srs_amf0_read_ecma_array(SrsStream* stream, SrsAmf0EcmaArray*& value)
1051 { 1181 {
1052 int ret = ERROR_SUCCESS; 1182 int ret = ERROR_SUCCESS;
1053 1183
1054 - // marker  
1055 - if (!stream->require(1)) {  
1056 - ret = ERROR_RTMP_AMF0_DECODE;  
1057 - srs_error("amf0 read ecma_array marker failed. ret=%d", ret);  
1058 - return ret;  
1059 - } 1184 + value = new SrsAmf0EcmaArray();
1060 1185
1061 - char marker = stream->read_1bytes();  
1062 - if (marker != RTMP_AMF0_EcmaArray) {  
1063 - ret = ERROR_RTMP_AMF0_DECODE;  
1064 - srs_error("amf0 check ecma_array marker failed. "  
1065 - "marker=%#x, required=%#x, ret=%d", marker, RTMP_AMF0_Object, ret); 1186 + if ((ret = value->read(stream)) != ERROR_SUCCESS) {
  1187 + srs_freep(value);
1066 return ret; 1188 return ret;
1067 } 1189 }
1068 - srs_verbose("amf0 read ecma_array marker success");  
1069 -  
1070 - // count  
1071 - if (!stream->require(4)) {  
1072 - ret = ERROR_RTMP_AMF0_DECODE;  
1073 - srs_error("amf0 read ecma_array count failed. ret=%d", ret);  
1074 - return ret;  
1075 - }  
1076 -  
1077 - int32_t count = stream->read_4bytes();  
1078 - srs_verbose("amf0 read ecma_array count success. count=%d", count);  
1079 -  
1080 - // value  
1081 - value = new SrsASrsAmf0EcmaArray();  
1082 - value->count = count;  
1083 -  
1084 - while (!stream->empty()) {  
1085 - // property-name: utf8 string  
1086 - std::string property_name;  
1087 - if ((ret =srs_amf0_read_utf8(stream, property_name)) != ERROR_SUCCESS) {  
1088 - srs_error("amf0 ecma_array read property name failed. ret=%d", ret);  
1089 - return ret;  
1090 - }  
1091 - // property-value: any  
1092 - SrsAmf0Any* property_value = NULL;  
1093 - if ((ret = srs_amf0_read_any(stream, property_value)) != ERROR_SUCCESS) {  
1094 - srs_error("amf0 ecma_array read property_value failed. "  
1095 - "name=%s, ret=%d", property_name.c_str(), ret);  
1096 - return ret;  
1097 - }  
1098 -  
1099 - // AMF0 Object EOF.  
1100 - if (property_name.empty() || !property_value || property_value->is_object_eof()) {  
1101 - if (property_value) {  
1102 - srs_freep(property_value);  
1103 - }  
1104 - srs_info("amf0 read ecma_array EOF.");  
1105 - break;  
1106 - }  
1107 -  
1108 - // add property  
1109 - value->set(property_name, property_value);  
1110 - }  
1111 1190
1112 return ret; 1191 return ret;
1113 } 1192 }
1114 -int srs_amf0_write_ecma_array(SrsStream* stream, SrsASrsAmf0EcmaArray* value) 1193 +int srs_amf0_write_ecma_array(SrsStream* stream, SrsAmf0EcmaArray* value)
1115 { 1194 {
1116 - int ret = ERROR_SUCCESS;  
1117 -  
1118 - srs_assert(value != NULL);  
1119 -  
1120 - // marker  
1121 - if (!stream->require(1)) {  
1122 - ret = ERROR_RTMP_AMF0_ENCODE;  
1123 - srs_error("amf0 write ecma_array marker failed. ret=%d", ret);  
1124 - return ret;  
1125 - }  
1126 -  
1127 - stream->write_1bytes(RTMP_AMF0_EcmaArray);  
1128 - srs_verbose("amf0 write ecma_array marker success");  
1129 -  
1130 - // count  
1131 - if (!stream->require(4)) {  
1132 - ret = ERROR_RTMP_AMF0_ENCODE;  
1133 - srs_error("amf0 write ecma_array count failed. ret=%d", ret);  
1134 - return ret;  
1135 - }  
1136 -  
1137 - stream->write_4bytes(value->count);  
1138 - srs_verbose("amf0 write ecma_array count success. count=%d", value->count);  
1139 -  
1140 - // value  
1141 - for (int i = 0; i < value->size(); i++) {  
1142 - std::string name = value->key_at(i);  
1143 - SrsAmf0Any* any = value->value_at(i);  
1144 -  
1145 - if ((ret = srs_amf0_write_utf8(stream, name)) != ERROR_SUCCESS) {  
1146 - srs_error("write ecma_array property name failed. ret=%d", ret);  
1147 - return ret;  
1148 - }  
1149 -  
1150 - if ((ret = srs_amf0_write_any(stream, any)) != ERROR_SUCCESS) {  
1151 - srs_error("write ecma_array property value failed. ret=%d", ret);  
1152 - return ret;  
1153 - }  
1154 -  
1155 - srs_verbose("write amf0 property success. name=%s", name.c_str());  
1156 - }  
1157 -  
1158 - if ((ret = srs_amf0_write_object_eof(stream, &value->eof)) != ERROR_SUCCESS) {  
1159 - srs_error("write ecma_array eof failed. ret=%d", ret);  
1160 - return ret;  
1161 - }  
1162 -  
1163 - srs_verbose("write ecma_array object success.");  
1164 -  
1165 - return ret; 1195 + return value->write(stream);
1166 } 1196 }
1167 1197
1168 -int srs_amf0_get_utf8_size(std::string value) 1198 +int SrsAmf0Size::utf8(string value)
1169 { 1199 {
1170 return 2 + value.length(); 1200 return 2 + value.length();
1171 } 1201 }
1172 1202
1173 -int srs_amf0_get_string_size(std::string value) 1203 +int SrsAmf0Size::str(string value)
1174 { 1204 {
1175 - return 1 + srs_amf0_get_utf8_size(value); 1205 + return 1 + SrsAmf0Size::utf8(value);
1176 } 1206 }
1177 1207
1178 -int srs_amf0_get_number_size() 1208 +int SrsAmf0Size::number()
1179 { 1209 {
1180 return 1 + 8; 1210 return 1 + 8;
1181 } 1211 }
1182 1212
1183 -int srs_amf0_get_null_size() 1213 +int SrsAmf0Size::null()
1184 { 1214 {
1185 return 1; 1215 return 1;
1186 } 1216 }
1187 1217
1188 -int srs_amf0_get_undefined_size() 1218 +int SrsAmf0Size::undefined()
1189 { 1219 {
1190 return 1; 1220 return 1;
1191 } 1221 }
1192 1222
1193 -int srs_amf0_get_boolean_size() 1223 +int SrsAmf0Size::boolean()
1194 { 1224 {
1195 return 1 + 1; 1225 return 1 + 1;
1196 } 1226 }
1197 1227
1198 -int srs_amf0_get_object_size(SrsAmf0Object* obj) 1228 +int SrsAmf0Size::object(SrsAmf0Object* obj)
1199 { 1229 {
1200 if (!obj) { 1230 if (!obj) {
1201 return 0; 1231 return 0;
1202 } 1232 }
1203 1233
1204 - int size = 1;  
1205 -  
1206 - for (int i = 0; i < obj->size(); i++){  
1207 - std::string name = obj->key_at(i);  
1208 - SrsAmf0Any* value = obj->value_at(i);  
1209 -  
1210 - size += srs_amf0_get_utf8_size(name);  
1211 - size += srs_amf0_get_any_size(value);  
1212 - }  
1213 -  
1214 - size += srs_amf0_get_object_eof_size();  
1215 -  
1216 - return size; 1234 + return obj->size();
  1235 +}
  1236 +
  1237 +int SrsAmf0Size::object_eof()
  1238 +{
  1239 + return 2 + 1;
1217 } 1240 }
1218 1241
1219 -int srs_amf0_get_ecma_array_size(SrsASrsAmf0EcmaArray* arr) 1242 +int SrsAmf0Size::array(SrsAmf0EcmaArray* arr)
1220 { 1243 {
1221 if (!arr) { 1244 if (!arr) {
1222 return 0; 1245 return 0;
1223 } 1246 }
1224 1247
1225 - int size = 1 + 4;  
1226 -  
1227 - for (int i = 0; i < arr->size(); i++){  
1228 - std::string name = arr->key_at(i);  
1229 - SrsAmf0Any* value = arr->value_at(i);  
1230 -  
1231 - size += srs_amf0_get_utf8_size(name);  
1232 - size += srs_amf0_get_any_size(value);  
1233 - }  
1234 -  
1235 - size += srs_amf0_get_object_eof_size();  
1236 -  
1237 - return size; 1248 + return arr->size();
1238 } 1249 }
1239 1250
1240 -int srs_amf0_get_object_eof_size() 1251 +int SrsAmf0Size::any(SrsAmf0Any* o)
1241 { 1252 {
1242 - return 2 + 1; 1253 + if (!o) {
  1254 + return 0;
  1255 + }
  1256 +
  1257 + return o->size();
1243 } 1258 }
@@ -59,6 +59,8 @@ struct SrsAmf0Any @@ -59,6 +59,8 @@ struct SrsAmf0Any
59 virtual bool is_object(); 59 virtual bool is_object();
60 virtual bool is_object_eof(); 60 virtual bool is_object_eof();
61 virtual bool is_ecma_array(); 61 virtual bool is_ecma_array();
  62 +
  63 + virtual int size() = 0;
62 }; 64 };
63 65
64 /** 66 /**
@@ -73,6 +75,8 @@ struct SrsAmf0String : public SrsAmf0Any @@ -73,6 +75,8 @@ struct SrsAmf0String : public SrsAmf0Any
73 75
74 SrsAmf0String(const char* _value = NULL); 76 SrsAmf0String(const char* _value = NULL);
75 virtual ~SrsAmf0String(); 77 virtual ~SrsAmf0String();
  78 +
  79 + virtual int size();
76 }; 80 };
77 81
78 /** 82 /**
@@ -88,6 +92,8 @@ struct SrsAmf0Boolean : public SrsAmf0Any @@ -88,6 +92,8 @@ struct SrsAmf0Boolean : public SrsAmf0Any
88 92
89 SrsAmf0Boolean(bool _value = false); 93 SrsAmf0Boolean(bool _value = false);
90 virtual ~SrsAmf0Boolean(); 94 virtual ~SrsAmf0Boolean();
  95 +
  96 + virtual int size();
91 }; 97 };
92 98
93 /** 99 /**
@@ -102,6 +108,8 @@ struct SrsAmf0Number : public SrsAmf0Any @@ -102,6 +108,8 @@ struct SrsAmf0Number : public SrsAmf0Any
102 108
103 SrsAmf0Number(double _value = 0.0); 109 SrsAmf0Number(double _value = 0.0);
104 virtual ~SrsAmf0Number(); 110 virtual ~SrsAmf0Number();
  111 +
  112 + virtual int size();
105 }; 113 };
106 114
107 /** 115 /**
@@ -113,6 +121,8 @@ struct SrsAmf0Null : public SrsAmf0Any @@ -113,6 +121,8 @@ struct SrsAmf0Null : public SrsAmf0Any
113 { 121 {
114 SrsAmf0Null(); 122 SrsAmf0Null();
115 virtual ~SrsAmf0Null(); 123 virtual ~SrsAmf0Null();
  124 +
  125 + virtual int size();
116 }; 126 };
117 127
118 /** 128 /**
@@ -124,6 +134,8 @@ struct SrsAmf0Undefined : public SrsAmf0Any @@ -124,6 +134,8 @@ struct SrsAmf0Undefined : public SrsAmf0Any
124 { 134 {
125 SrsAmf0Undefined(); 135 SrsAmf0Undefined();
126 virtual ~SrsAmf0Undefined(); 136 virtual ~SrsAmf0Undefined();
  137 +
  138 + virtual int size();
127 }; 139 };
128 140
129 /** 141 /**
@@ -137,6 +149,8 @@ struct SrsAmf0ObjectEOF : public SrsAmf0Any @@ -137,6 +149,8 @@ struct SrsAmf0ObjectEOF : public SrsAmf0Any
137 149
138 SrsAmf0ObjectEOF(); 150 SrsAmf0ObjectEOF();
139 virtual ~SrsAmf0ObjectEOF(); 151 virtual ~SrsAmf0ObjectEOF();
  152 +
  153 + virtual int size();
140 }; 154 };
141 155
142 /** 156 /**
@@ -179,6 +193,9 @@ public: @@ -179,6 +193,9 @@ public:
179 193
180 SrsAmf0Object(); 194 SrsAmf0Object();
181 virtual ~SrsAmf0Object(); 195 virtual ~SrsAmf0Object();
  196 +
  197 + virtual int read(SrsStream* stream);
  198 + virtual int write(SrsStream* stream);
182 199
183 virtual int size(); 200 virtual int size();
184 virtual std::string key_at(int index); 201 virtual std::string key_at(int index);
@@ -196,7 +213,7 @@ public: @@ -196,7 +213,7 @@ public:
196 * associative-count = U32 213 * associative-count = U32
197 * object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker) 214 * object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker)
198 */ 215 */
199 -struct SrsASrsAmf0EcmaArray : public SrsAmf0Any 216 +struct SrsAmf0EcmaArray : public SrsAmf0Any
200 { 217 {
201 private: 218 private:
202 SrsUnSortedHashtable properties; 219 SrsUnSortedHashtable properties;
@@ -204,8 +221,11 @@ public: @@ -204,8 +221,11 @@ public:
204 int32_t count; 221 int32_t count;
205 SrsAmf0ObjectEOF eof; 222 SrsAmf0ObjectEOF eof;
206 223
207 - SrsASrsAmf0EcmaArray();  
208 - virtual ~SrsASrsAmf0EcmaArray(); 224 + SrsAmf0EcmaArray();
  225 + virtual ~SrsAmf0EcmaArray();
  226 +
  227 + virtual int read(SrsStream* stream);
  228 + virtual int write(SrsStream* stream);
209 229
210 virtual int size(); 230 virtual int size();
211 virtual void clear(); 231 virtual void clear();
@@ -287,20 +307,26 @@ extern int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value); @@ -287,20 +307,26 @@ extern int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value);
287 * associative-count = U32 307 * associative-count = U32
288 * object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker) 308 * object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker)
289 */ 309 */
290 -extern int srs_amf0_read_ecma_array(SrsStream* stream, SrsASrsAmf0EcmaArray*& value);  
291 -extern int srs_amf0_write_ecma_array(SrsStream* stream, SrsASrsAmf0EcmaArray* value); 310 +extern int srs_amf0_read_ecma_array(SrsStream* stream, SrsAmf0EcmaArray*& value);
  311 +extern int srs_amf0_write_ecma_array(SrsStream* stream, SrsAmf0EcmaArray* value);
292 312
293 /** 313 /**
294 -* get amf0 objects size. 314 +* the class to get amf0 object size
295 */ 315 */
296 -extern int srs_amf0_get_utf8_size(std::string value);  
297 -extern int srs_amf0_get_string_size(std::string value);  
298 -extern int srs_amf0_get_number_size();  
299 -extern int srs_amf0_get_null_size();  
300 -extern int srs_amf0_get_undefined_size();  
301 -extern int srs_amf0_get_boolean_size();  
302 -extern int srs_amf0_get_object_size(SrsAmf0Object* obj);  
303 -extern int srs_amf0_get_ecma_array_size(SrsASrsAmf0EcmaArray* arr); 316 +class SrsAmf0Size
  317 +{
  318 +public:
  319 + static int utf8(std::string value);
  320 + static int str(std::string value);
  321 + static int number();
  322 + static int null();
  323 + static int undefined();
  324 + static int boolean();
  325 + static int object(SrsAmf0Object* obj);
  326 + static int object_eof();
  327 + static int array(SrsAmf0EcmaArray* arr);
  328 + static int any(SrsAmf0Any* o);
  329 +};
304 330
305 /** 331 /**
306 * convert the any to specified object. 332 * convert the any to specified object.
@@ -706,7 +706,7 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip) @@ -706,7 +706,7 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip)
706 pkt->info->set(StatusCode, new SrsAmf0String(StatusCodeConnectSuccess)); 706 pkt->info->set(StatusCode, new SrsAmf0String(StatusCodeConnectSuccess));
707 pkt->info->set(StatusDescription, new SrsAmf0String("Connection succeeded")); 707 pkt->info->set(StatusDescription, new SrsAmf0String("Connection succeeded"));
708 pkt->info->set("objectEncoding", new SrsAmf0Number(req->objectEncoding)); 708 pkt->info->set("objectEncoding", new SrsAmf0Number(req->objectEncoding));
709 - SrsASrsAmf0EcmaArray* data = new SrsASrsAmf0EcmaArray(); 709 + SrsAmf0EcmaArray* data = new SrsAmf0EcmaArray();
710 pkt->info->set("data", data); 710 pkt->info->set("data", data);
711 711
712 data->set("version", new SrsAmf0String(RTMP_SIG_FMS_VER)); 712 data->set("version", new SrsAmf0String(RTMP_SIG_FMS_VER));
@@ -1791,8 +1791,8 @@ int SrsConnectAppPacket::get_message_type() @@ -1791,8 +1791,8 @@ int SrsConnectAppPacket::get_message_type()
1791 1791
1792 int SrsConnectAppPacket::get_size() 1792 int SrsConnectAppPacket::get_size()
1793 { 1793 {
1794 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
1795 - + srs_amf0_get_object_size(command_object); 1794 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  1795 + + SrsAmf0Size::object(command_object);
1796 } 1796 }
1797 1797
1798 int SrsConnectAppPacket::encode_packet(SrsStream* stream) 1798 int SrsConnectAppPacket::encode_packet(SrsStream* stream)
@@ -1901,14 +1901,14 @@ int SrsConnectAppResPacket::get_message_type() @@ -1901,14 +1901,14 @@ int SrsConnectAppResPacket::get_message_type()
1901 1901
1902 int SrsConnectAppResPacket::get_size() 1902 int SrsConnectAppResPacket::get_size()
1903 { 1903 {
1904 - int size = srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size(); 1904 + int size = SrsAmf0Size::str(command_name) + SrsAmf0Size::number();
1905 1905
1906 if (props->size() > 0) { 1906 if (props->size() > 0) {
1907 - size += srs_amf0_get_object_size(props); 1907 + size += SrsAmf0Size::object(props);
1908 } 1908 }
1909 1909
1910 if (info->size() > 0) { 1910 if (info->size() > 0) {
1911 - size += srs_amf0_get_object_size(info); 1911 + size += SrsAmf0Size::object(info);
1912 } 1912 }
1913 1913
1914 return size; 1914 return size;
@@ -2007,8 +2007,8 @@ int SrsCreateStreamPacket::get_message_type() @@ -2007,8 +2007,8 @@ int SrsCreateStreamPacket::get_message_type()
2007 2007
2008 int SrsCreateStreamPacket::get_size() 2008 int SrsCreateStreamPacket::get_size()
2009 { 2009 {
2010 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2011 - + srs_amf0_get_null_size(); 2010 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2011 + + SrsAmf0Size::null();
2012 } 2012 }
2013 2013
2014 int SrsCreateStreamPacket::encode_packet(SrsStream* stream) 2014 int SrsCreateStreamPacket::encode_packet(SrsStream* stream)
@@ -2098,8 +2098,8 @@ int SrsCreateStreamResPacket::get_message_type() @@ -2098,8 +2098,8 @@ int SrsCreateStreamResPacket::get_message_type()
2098 2098
2099 int SrsCreateStreamResPacket::get_size() 2099 int SrsCreateStreamResPacket::get_size()
2100 { 2100 {
2101 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2102 - + srs_amf0_get_null_size() + srs_amf0_get_number_size(); 2101 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2102 + + SrsAmf0Size::null() + SrsAmf0Size::number();
2103 } 2103 }
2104 2104
2105 int SrsCreateStreamResPacket::encode_packet(SrsStream* stream) 2105 int SrsCreateStreamResPacket::encode_packet(SrsStream* stream)
@@ -2234,8 +2234,8 @@ int SrsFMLEStartPacket::get_message_type() @@ -2234,8 +2234,8 @@ int SrsFMLEStartPacket::get_message_type()
2234 2234
2235 int SrsFMLEStartPacket::get_size() 2235 int SrsFMLEStartPacket::get_size()
2236 { 2236 {
2237 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2238 - + srs_amf0_get_null_size() + srs_amf0_get_string_size(stream_name); 2237 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2238 + + SrsAmf0Size::null() + SrsAmf0Size::str(stream_name);
2239 } 2239 }
2240 2240
2241 int SrsFMLEStartPacket::encode_packet(SrsStream* stream) 2241 int SrsFMLEStartPacket::encode_packet(SrsStream* stream)
@@ -2355,8 +2355,8 @@ int SrsFMLEStartResPacket::get_message_type() @@ -2355,8 +2355,8 @@ int SrsFMLEStartResPacket::get_message_type()
2355 2355
2356 int SrsFMLEStartResPacket::get_size() 2356 int SrsFMLEStartResPacket::get_size()
2357 { 2357 {
2358 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2359 - + srs_amf0_get_null_size() + srs_amf0_get_undefined_size(); 2358 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2359 + + SrsAmf0Size::null() + SrsAmf0Size::undefined();
2360 } 2360 }
2361 2361
2362 int SrsFMLEStartResPacket::encode_packet(SrsStream* stream) 2362 int SrsFMLEStartResPacket::encode_packet(SrsStream* stream)
@@ -2458,9 +2458,9 @@ int SrsPublishPacket::get_message_type() @@ -2458,9 +2458,9 @@ int SrsPublishPacket::get_message_type()
2458 2458
2459 int SrsPublishPacket::get_size() 2459 int SrsPublishPacket::get_size()
2460 { 2460 {
2461 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2462 - + srs_amf0_get_null_size() + srs_amf0_get_string_size(stream_name)  
2463 - + srs_amf0_get_string_size(type); 2461 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2462 + + SrsAmf0Size::null() + SrsAmf0Size::str(stream_name)
  2463 + + SrsAmf0Size::str(type);
2464 } 2464 }
2465 2465
2466 int SrsPublishPacket::encode_packet(SrsStream* stream) 2466 int SrsPublishPacket::encode_packet(SrsStream* stream)
@@ -2654,10 +2654,10 @@ int SrsPlayPacket::get_message_type() @@ -2654,10 +2654,10 @@ int SrsPlayPacket::get_message_type()
2654 2654
2655 int SrsPlayPacket::get_size() 2655 int SrsPlayPacket::get_size()
2656 { 2656 {
2657 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2658 - + srs_amf0_get_null_size() + srs_amf0_get_string_size(stream_name)  
2659 - + srs_amf0_get_number_size() + srs_amf0_get_number_size()  
2660 - + srs_amf0_get_boolean_size(); 2657 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2658 + + SrsAmf0Size::null() + SrsAmf0Size::str(stream_name)
  2659 + + SrsAmf0Size::number() + SrsAmf0Size::number()
  2660 + + SrsAmf0Size::boolean();
2661 } 2661 }
2662 2662
2663 int SrsPlayPacket::encode_packet(SrsStream* stream) 2663 int SrsPlayPacket::encode_packet(SrsStream* stream)
@@ -2737,8 +2737,8 @@ int SrsPlayResPacket::get_message_type() @@ -2737,8 +2737,8 @@ int SrsPlayResPacket::get_message_type()
2737 2737
2738 int SrsPlayResPacket::get_size() 2738 int SrsPlayResPacket::get_size()
2739 { 2739 {
2740 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2741 - + srs_amf0_get_null_size() + srs_amf0_get_object_size(desc); 2740 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2741 + + SrsAmf0Size::null() + SrsAmf0Size::object(desc);
2742 } 2742 }
2743 2743
2744 int SrsPlayResPacket::encode_packet(SrsStream* stream) 2744 int SrsPlayResPacket::encode_packet(SrsStream* stream)
@@ -2799,8 +2799,8 @@ int SrsOnBWDonePacket::get_message_type() @@ -2799,8 +2799,8 @@ int SrsOnBWDonePacket::get_message_type()
2799 2799
2800 int SrsOnBWDonePacket::get_size() 2800 int SrsOnBWDonePacket::get_size()
2801 { 2801 {
2802 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2803 - + srs_amf0_get_null_size(); 2802 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2803 + + SrsAmf0Size::null();
2804 } 2804 }
2805 2805
2806 int SrsOnBWDonePacket::encode_packet(SrsStream* stream) 2806 int SrsOnBWDonePacket::encode_packet(SrsStream* stream)
@@ -2856,8 +2856,8 @@ int SrsOnStatusCallPacket::get_message_type() @@ -2856,8 +2856,8 @@ int SrsOnStatusCallPacket::get_message_type()
2856 2856
2857 int SrsOnStatusCallPacket::get_size() 2857 int SrsOnStatusCallPacket::get_size()
2858 { 2858 {
2859 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2860 - + srs_amf0_get_null_size() + srs_amf0_get_object_size(data); 2859 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2860 + + SrsAmf0Size::null() + SrsAmf0Size::object(data);
2861 } 2861 }
2862 2862
2863 int SrsOnStatusCallPacket::encode_packet(SrsStream* stream) 2863 int SrsOnStatusCallPacket::encode_packet(SrsStream* stream)
@@ -2919,8 +2919,8 @@ int SrsBandwidthPacket::get_message_type() @@ -2919,8 +2919,8 @@ int SrsBandwidthPacket::get_message_type()
2919 2919
2920 int SrsBandwidthPacket::get_size() 2920 int SrsBandwidthPacket::get_size()
2921 { 2921 {
2922 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_number_size()  
2923 - + srs_amf0_get_null_size() + srs_amf0_get_object_size(data); 2922 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  2923 + + SrsAmf0Size::null() + SrsAmf0Size::object(data);
2924 } 2924 }
2925 2925
2926 int SrsBandwidthPacket::encode_packet(SrsStream* stream) 2926 int SrsBandwidthPacket::encode_packet(SrsStream* stream)
@@ -3073,7 +3073,7 @@ int SrsOnStatusDataPacket::get_message_type() @@ -3073,7 +3073,7 @@ int SrsOnStatusDataPacket::get_message_type()
3073 3073
3074 int SrsOnStatusDataPacket::get_size() 3074 int SrsOnStatusDataPacket::get_size()
3075 { 3075 {
3076 - return srs_amf0_get_string_size(command_name) + srs_amf0_get_object_size(data); 3076 + return SrsAmf0Size::str(command_name) + SrsAmf0Size::object(data);
3077 } 3077 }
3078 3078
3079 int SrsOnStatusDataPacket::encode_packet(SrsStream* stream) 3079 int SrsOnStatusDataPacket::encode_packet(SrsStream* stream)
@@ -3120,8 +3120,8 @@ int SrsSampleAccessPacket::get_message_type() @@ -3120,8 +3120,8 @@ int SrsSampleAccessPacket::get_message_type()
3120 3120
3121 int SrsSampleAccessPacket::get_size() 3121 int SrsSampleAccessPacket::get_size()
3122 { 3122 {
3123 - return srs_amf0_get_string_size(command_name)  
3124 - + srs_amf0_get_boolean_size() + srs_amf0_get_boolean_size(); 3123 + return SrsAmf0Size::str(command_name)
  3124 + + SrsAmf0Size::boolean() + SrsAmf0Size::boolean();
3125 } 3125 }
3126 3126
3127 int SrsSampleAccessPacket::encode_packet(SrsStream* stream) 3127 int SrsSampleAccessPacket::encode_packet(SrsStream* stream)
@@ -3195,7 +3195,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) @@ -3195,7 +3195,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream)
3195 return ret; 3195 return ret;
3196 } 3196 }
3197 3197
3198 - SrsASrsAmf0EcmaArray* arr = dynamic_cast<SrsASrsAmf0EcmaArray*>(any); 3198 + SrsAmf0EcmaArray* arr = dynamic_cast<SrsAmf0EcmaArray*>(any);
3199 if (!arr) { 3199 if (!arr) {
3200 ret = ERROR_RTMP_AMF0_DECODE; 3200 ret = ERROR_RTMP_AMF0_DECODE;
3201 srs_error("decode metadata array failed. ret=%d", ret); 3201 srs_error("decode metadata array failed. ret=%d", ret);
@@ -3224,7 +3224,7 @@ int SrsOnMetaDataPacket::get_message_type() @@ -3224,7 +3224,7 @@ int SrsOnMetaDataPacket::get_message_type()
3224 3224
3225 int SrsOnMetaDataPacket::get_size() 3225 int SrsOnMetaDataPacket::get_size()
3226 { 3226 {
3227 - return srs_amf0_get_string_size(name) + srs_amf0_get_object_size(metadata); 3227 + return SrsAmf0Size::str(name) + SrsAmf0Size::object(metadata);
3228 } 3228 }
3229 3229
3230 int SrsOnMetaDataPacket::encode_packet(SrsStream* stream) 3230 int SrsOnMetaDataPacket::encode_packet(SrsStream* stream)
1 file 1 file
2 - main readonly separator,  
3 - ..\main\srs_main_server.cpp,  
4 - ..\main\srs_main_bandcheck.cpp,  
5 - auto readonly separator,  
6 - ..\..\objs\srs_auto_headers.hpp,  
7 - libs readonly separator,  
8 - ..\libs\srs_librtmp.hpp,  
9 - ..\libs\srs_librtmp.cpp,  
10 - ..\libs\srs_lib_simple_socket.hpp,  
11 - ..\libs\srs_lib_simple_socket.cpp,  
12 - core readonly separator,  
13 - ..\core\srs_core.hpp,  
14 - ..\core\srs_core.cpp,  
15 - ..\core\srs_core_autofree.hpp,  
16 - ..\core\srs_core_autofree.cpp,  
17 - kernel readonly separator,  
18 - ..\kernel\srs_kernel_buffer.hpp,  
19 - ..\kernel\srs_kernel_buffer.cpp,  
20 - ..\kernel\srs_kernel_error.hpp,  
21 - ..\kernel\srs_kernel_error.cpp,  
22 - ..\kernel\srs_kernel_log.hpp,  
23 - ..\kernel\srs_kernel_log.cpp,  
24 - ..\kernel\srs_kernel_stream.hpp,  
25 - ..\kernel\srs_kernel_stream.cpp,  
26 - rtmp-protocol readonly separator,  
27 - ..\rtmp\srs_protocol_amf0.hpp,  
28 - ..\rtmp\srs_protocol_amf0.cpp,  
29 - ..\rtmp\srs_protocol_handshake.hpp,  
30 - ..\rtmp\srs_protocol_handshake.cpp,  
31 - ..\rtmp\srs_protocol_io.hpp,  
32 - ..\rtmp\srs_protocol_io.cpp,  
33 - ..\rtmp\srs_protocol_rtmp.hpp,  
34 - ..\rtmp\srs_protocol_rtmp.cpp,  
35 - ..\rtmp\srs_protocol_rtmp_stack.hpp,  
36 - ..\rtmp\srs_protocol_rtmp_stack.cpp,  
37 - ..\rtmp\srs_protocol_utility.hpp,  
38 - ..\rtmp\srs_protocol_utility.cpp,  
39 - app readonly separator,  
40 - ..\app\srs_app_bandwidth.hpp,  
41 - ..\app\srs_app_bandwidth.cpp,  
42 - ..\app\srs_app_client.hpp,  
43 - ..\app\srs_app_client.cpp,  
44 - ..\app\srs_app_codec.hpp,  
45 - ..\app\srs_app_codec.cpp,  
46 - ..\app\srs_app_conn.hpp,  
47 - ..\app\srs_app_conn.cpp,  
48 - ..\app\srs_app_config.hpp,  
49 - ..\app\srs_app_config.cpp,  
50 - ..\app\srs_app_encoder.hpp,  
51 - ..\app\srs_app_encoder.cpp,  
52 - ..\app\srs_app_forward.hpp,  
53 - ..\app\srs_app_forward.cpp,  
54 - ..\app\srs_app_hls.hpp,  
55 - ..\app\srs_app_hls.cpp,  
56 - ..\app\srs_app_http.hpp,  
57 - ..\app\srs_app_http.cpp,  
58 - ..\app\srs_app_log.hpp,  
59 - ..\app\srs_app_log.cpp,  
60 - ..\app\srs_app_refer.hpp,  
61 - ..\app\srs_app_refer.cpp,  
62 - ..\app\srs_app_reload.hpp,  
63 - ..\app\srs_app_reload.cpp,  
64 - ..\app\srs_app_pithy_print.hpp,  
65 - ..\app\srs_app_pithy_print.cpp,  
66 - ..\app\srs_app_thread.hpp,  
67 - ..\app\srs_app_thread.cpp,  
68 - ..\app\srs_app_server.hpp,  
69 - ..\app\srs_app_server.cpp,  
70 - ..\app\srs_app_st.hpp,  
71 - ..\app\srs_app_st.cpp,  
72 - ..\app\srs_app_socket.hpp,  
73 - ..\app\srs_app_socket.cpp,  
74 - ..\app\srs_app_source.hpp,  
75 - ..\app\srs_app_source.cpp,  
76 - utest readonly separator,  
77 - ..\utest\srs_utest.hpp,  
78 - ..\utest\srs_utest.cpp,  
79 - research readonly separator,  
80 - ..\..\research\librtmp\srs_play.c,  
81 - ..\..\research\librtmp\srs_publish.c,  
82 - ..\..\research\hls\ts_info.cc; 2 + main readonly separator,
  3 + ..\main\srs_main_server.cpp,
  4 + ..\main\srs_main_bandcheck.cpp,
  5 + auto readonly separator,
  6 + ..\..\objs\srs_auto_headers.hpp,
  7 + libs readonly separator,
  8 + ..\libs\srs_librtmp.hpp,
  9 + ..\libs\srs_librtmp.cpp,
  10 + ..\libs\srs_lib_simple_socket.hpp,
  11 + ..\libs\srs_lib_simple_socket.cpp,
  12 + core readonly separator,
  13 + ..\core\srs_core.hpp,
  14 + ..\core\srs_core.cpp,
  15 + ..\core\srs_core_autofree.hpp,
  16 + ..\core\srs_core_autofree.cpp,
  17 + kernel readonly separator,
  18 + ..\kernel\srs_kernel_buffer.hpp,
  19 + ..\kernel\srs_kernel_buffer.cpp,
  20 + ..\kernel\srs_kernel_error.hpp,
  21 + ..\kernel\srs_kernel_error.cpp,
  22 + ..\kernel\srs_kernel_log.hpp,
  23 + ..\kernel\srs_kernel_log.cpp,
  24 + ..\kernel\srs_kernel_stream.hpp,
  25 + ..\kernel\srs_kernel_stream.cpp,
  26 + rtmp-protocol readonly separator,
  27 + ..\rtmp\srs_protocol_amf0.hpp,
  28 + ..\rtmp\srs_protocol_amf0.cpp,
  29 + ..\rtmp\srs_protocol_handshake.hpp,
  30 + ..\rtmp\srs_protocol_handshake.cpp,
  31 + ..\rtmp\srs_protocol_io.hpp,
  32 + ..\rtmp\srs_protocol_io.cpp,
  33 + ..\rtmp\srs_protocol_rtmp.hpp,
  34 + ..\rtmp\srs_protocol_rtmp.cpp,
  35 + ..\rtmp\srs_protocol_rtmp_stack.hpp,
  36 + ..\rtmp\srs_protocol_rtmp_stack.cpp,
  37 + ..\rtmp\srs_protocol_utility.hpp,
  38 + ..\rtmp\srs_protocol_utility.cpp,
  39 + app readonly separator,
  40 + ..\app\srs_app_bandwidth.hpp,
  41 + ..\app\srs_app_bandwidth.cpp,
  42 + ..\app\srs_app_client.hpp,
  43 + ..\app\srs_app_client.cpp,
  44 + ..\app\srs_app_codec.hpp,
  45 + ..\app\srs_app_codec.cpp,
  46 + ..\app\srs_app_conn.hpp,
  47 + ..\app\srs_app_conn.cpp,
  48 + ..\app\srs_app_config.hpp,
  49 + ..\app\srs_app_config.cpp,
  50 + ..\app\srs_app_encoder.hpp,
  51 + ..\app\srs_app_encoder.cpp,
  52 + ..\app\srs_app_forward.hpp,
  53 + ..\app\srs_app_forward.cpp,
  54 + ..\app\srs_app_hls.hpp,
  55 + ..\app\srs_app_hls.cpp,
  56 + ..\app\srs_app_http.hpp,
  57 + ..\app\srs_app_http.cpp,
  58 + ..\app\srs_app_log.hpp,
  59 + ..\app\srs_app_log.cpp,
  60 + ..\app\srs_app_refer.hpp,
  61 + ..\app\srs_app_refer.cpp,
  62 + ..\app\srs_app_reload.hpp,
  63 + ..\app\srs_app_reload.cpp,
  64 + ..\app\srs_app_pithy_print.hpp,
  65 + ..\app\srs_app_pithy_print.cpp,
  66 + ..\app\srs_app_thread.hpp,
  67 + ..\app\srs_app_thread.cpp,
  68 + ..\app\srs_app_server.hpp,
  69 + ..\app\srs_app_server.cpp,
  70 + ..\app\srs_app_st.hpp,
  71 + ..\app\srs_app_st.cpp,
  72 + ..\app\srs_app_socket.hpp,
  73 + ..\app\srs_app_socket.cpp,
  74 + ..\app\srs_app_source.hpp,
  75 + ..\app\srs_app_source.cpp,
  76 + utest readonly separator,
  77 + ..\utest\srs_utest.hpp,
  78 + ..\utest\srs_utest.cpp,
  79 + ..\utest\srs_utest_amf0.hpp,
  80 + ..\utest\srs_utest_amf0.cpp,
  81 + research readonly separator,
  82 + ..\..\research\librtmp\srs_play.c,
  83 + ..\..\research\librtmp\srs_publish.c,
  84 + ..\..\research\hls\ts_info.cc;
83 85
84 mainconfig 86 mainconfig
85 - "" = "MAIN"; 87 + "" = "MAIN";
86 88
@@ -37,9 +37,32 @@ SrsConfig* _srs_config = NULL; @@ -37,9 +37,32 @@ SrsConfig* _srs_config = NULL;
37 SrsServer* _srs_server = NULL; 37 SrsServer* _srs_server = NULL;
38 38
39 // basic test and samples. 39 // basic test and samples.
40 -VOID TEST(SampleTest, FastSampleInt64Test){ 40 +VOID TEST(SampleTest, FastSampleInt64Test)
  41 +{
41 EXPECT_EQ(1, (int)sizeof(int8_t)); 42 EXPECT_EQ(1, (int)sizeof(int8_t));
42 EXPECT_EQ(2, (int)sizeof(int16_t)); 43 EXPECT_EQ(2, (int)sizeof(int16_t));
43 EXPECT_EQ(4, (int)sizeof(int32_t)); 44 EXPECT_EQ(4, (int)sizeof(int32_t));
44 EXPECT_EQ(8, (int)sizeof(int64_t)); 45 EXPECT_EQ(8, (int)sizeof(int64_t));
45 } 46 }
  47 +
  48 +VOID TEST(SampleTest, FastSampleMacrosTest)
  49 +{
  50 + EXPECT_TRUE(1);
  51 + EXPECT_FALSE(0);
  52 +
  53 + EXPECT_EQ(1, 1); // ==
  54 + EXPECT_NE(1, 2); // !=
  55 + EXPECT_LE(1, 2); // <=
  56 + EXPECT_LT(1, 2); // <
  57 + EXPECT_GE(2, 1); // >=
  58 + EXPECT_GT(2, 1); // >
  59 +
  60 + EXPECT_STREQ("winlin", "winlin");
  61 + EXPECT_STRNE("winlin", "srs");
  62 + EXPECT_STRCASEEQ("winlin", "Winlin");
  63 + EXPECT_STRCASENE("winlin", "srs");
  64 +
  65 + EXPECT_FLOAT_EQ(1.0, 1.000000000000001);
  66 + EXPECT_DOUBLE_EQ(1.0, 1.0000000000000001);
  67 + EXPECT_NEAR(10, 15, 5);
  68 +}
  1 +/*
  2 +The MIT License (MIT)
  3 +
  4 +Copyright (c) 2013-2014 winlin
  5 +
  6 +Permission is hereby granted, free of charge, to any person obtaining a copy of
  7 +this software and associated documentation files (the "Software"), to deal in
  8 +the Software without restriction, including without limitation the rights to
  9 +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  10 +the Software, and to permit persons to whom the Software is furnished to do so,
  11 +subject to the following conditions:
  12 +
  13 +The above copyright notice and this permission notice shall be included in all
  14 +copies or substantial portions of the Software.
  15 +
  16 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  18 +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  19 +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  20 +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21 +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22 +*/
  23 +#include <srs_utest_amf0.hpp>
  24 +
  25 +VOID TEST(AMF0Test, Size)
  26 +{
  27 + EXPECT_EQ(2+6, SrsAmf0Size::utf8("winlin"));
  28 + EXPECT_EQ(2+0, SrsAmf0Size::utf8(""));
  29 +
  30 + EXPECT_EQ(1+2+6, SrsAmf0Size::str("winlin"));
  31 + EXPECT_EQ(1+2+0, SrsAmf0Size::str(""));
  32 +
  33 + EXPECT_EQ(1+8, SrsAmf0Size::number());
  34 +
  35 + EXPECT_EQ(1, SrsAmf0Size::null());
  36 +
  37 + EXPECT_EQ(1, SrsAmf0Size::undefined());
  38 +
  39 + EXPECT_EQ(1+1, SrsAmf0Size::boolean());
  40 +
  41 + if (true) {
  42 + int size = 1+3;
  43 + SrsAmf0Object obj;
  44 +
  45 + EXPECT_EQ(size, SrsAmf0Size::object(&obj));
  46 + }
  47 + if (true) {
  48 + int size = 1+3;
  49 + SrsAmf0Object obj;
  50 +
  51 + size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
  52 + obj.set("name", new SrsAmf0String("winlin"));
  53 +
  54 + EXPECT_EQ(size, SrsAmf0Size::object(&obj));
  55 + }
  56 +
  57 + if (true) {
  58 + int size = 1+4+3;
  59 + SrsAmf0EcmaArray arr;
  60 +
  61 + EXPECT_EQ(size, SrsAmf0Size::array(&arr));
  62 + }
  63 + if (true) {
  64 + int size = 1+4+3;
  65 + SrsAmf0EcmaArray arr;
  66 +
  67 + size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
  68 + arr.set("name", new SrsAmf0String("winlin"));
  69 +
  70 + EXPECT_EQ(size, SrsAmf0Size::array(&arr));
  71 + }
  72 + if (true) {
  73 + int size = 1+4+3;
  74 + SrsAmf0EcmaArray arr;
  75 +
  76 + size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
  77 + arr.set("name", new SrsAmf0String("winlin"));
  78 +
  79 + SrsAmf0Object* args = new SrsAmf0Object();
  80 + size += SrsAmf0Size::utf8("args")+SrsAmf0Size::object(args);
  81 + arr.set("args", args);
  82 +
  83 + EXPECT_EQ(size, SrsAmf0Size::array(&arr));
  84 + }
  85 +}
  1 +/*
  2 +The MIT License (MIT)
  3 +
  4 +Copyright (c) 2013-2014 winlin
  5 +
  6 +Permission is hereby granted, free of charge, to any person obtaining a copy of
  7 +this software and associated documentation files (the "Software"), to deal in
  8 +the Software without restriction, including without limitation the rights to
  9 +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  10 +the Software, and to permit persons to whom the Software is furnished to do so,
  11 +subject to the following conditions:
  12 +
  13 +The above copyright notice and this permission notice shall be included in all
  14 +copies or substantial portions of the Software.
  15 +
  16 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  18 +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  19 +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  20 +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21 +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22 +*/
  23 +
  24 +#ifndef SRS_UTEST_AMF0_HPP
  25 +#define SRS_UTEST_AMF0_HPP
  26 +
  27 +/*
  28 +#include <srs_utest_amf0.hpp>
  29 +*/
  30 +#include <srs_utest.hpp>
  31 +#include <srs_protocol_amf0.hpp>
  32 +
  33 +#endif