正在显示
9 个修改的文件
包含
612 行增加
和
430 行删除
| @@ -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) |
trunk/src/srs/srs.upp
100644 → 100755
| 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 | +} |
trunk/src/utest/srs_utest_amf0.cpp
0 → 100644
| 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 | +} |
trunk/src/utest/srs_utest_amf0.hpp
0 → 100644
| 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 |
-
请 注册 或 登录 后发表评论