正在显示
4 个修改的文件
包含
122 行增加
和
39 行删除
| @@ -594,6 +594,23 @@ SrsAmf0Object::~SrsAmf0Object() | @@ -594,6 +594,23 @@ SrsAmf0Object::~SrsAmf0Object() | ||
| 594 | srs_freep(eof); | 594 | srs_freep(eof); |
| 595 | } | 595 | } |
| 596 | 596 | ||
| 597 | +int SrsAmf0Object::size() | ||
| 598 | +{ | ||
| 599 | + int size = 1; | ||
| 600 | + | ||
| 601 | + for (int i = 0; i < properties->size(); i++){ | ||
| 602 | + std::string name = key_at(i); | ||
| 603 | + SrsAmf0Any* value = value_at(i); | ||
| 604 | + | ||
| 605 | + size += SrsAmf0Size::utf8(name); | ||
| 606 | + size += SrsAmf0Size::any(value); | ||
| 607 | + } | ||
| 608 | + | ||
| 609 | + size += SrsAmf0Size::object_eof(); | ||
| 610 | + | ||
| 611 | + return size; | ||
| 612 | +} | ||
| 613 | + | ||
| 597 | int SrsAmf0Object::read(SrsStream* stream) | 614 | int SrsAmf0Object::read(SrsStream* stream) |
| 598 | { | 615 | { |
| 599 | int ret = ERROR_SUCCESS; | 616 | int ret = ERROR_SUCCESS; |
| @@ -691,21 +708,9 @@ int SrsAmf0Object::write(SrsStream* stream) | @@ -691,21 +708,9 @@ int SrsAmf0Object::write(SrsStream* stream) | ||
| 691 | return ret; | 708 | return ret; |
| 692 | } | 709 | } |
| 693 | 710 | ||
| 694 | -int SrsAmf0Object::size() | 711 | +int SrsAmf0Object::count() |
| 695 | { | 712 | { |
| 696 | - int size = 1; | ||
| 697 | - | ||
| 698 | - for (int i = 0; i < properties->size(); i++){ | ||
| 699 | - std::string name = key_at(i); | ||
| 700 | - SrsAmf0Any* value = value_at(i); | ||
| 701 | - | ||
| 702 | - size += SrsAmf0Size::utf8(name); | ||
| 703 | - size += SrsAmf0Size::any(value); | ||
| 704 | - } | ||
| 705 | - | ||
| 706 | - size += SrsAmf0Size::object_eof(); | ||
| 707 | - | ||
| 708 | - return size; | 713 | + return properties->size(); |
| 709 | } | 714 | } |
| 710 | 715 | ||
| 711 | std::string SrsAmf0Object::key_at(int index) | 716 | std::string SrsAmf0Object::key_at(int index) |
| @@ -751,6 +756,23 @@ SrsAmf0EcmaArray::~SrsAmf0EcmaArray() | @@ -751,6 +756,23 @@ SrsAmf0EcmaArray::~SrsAmf0EcmaArray() | ||
| 751 | srs_freep(eof); | 756 | srs_freep(eof); |
| 752 | } | 757 | } |
| 753 | 758 | ||
| 759 | +int SrsAmf0EcmaArray::size() | ||
| 760 | +{ | ||
| 761 | + int size = 1 + 4; | ||
| 762 | + | ||
| 763 | + for (int i = 0; i < properties->size(); i++){ | ||
| 764 | + std::string name = key_at(i); | ||
| 765 | + SrsAmf0Any* value = value_at(i); | ||
| 766 | + | ||
| 767 | + size += SrsAmf0Size::utf8(name); | ||
| 768 | + size += SrsAmf0Size::any(value); | ||
| 769 | + } | ||
| 770 | + | ||
| 771 | + size += SrsAmf0Size::object_eof(); | ||
| 772 | + | ||
| 773 | + return size; | ||
| 774 | +} | ||
| 775 | + | ||
| 754 | int SrsAmf0EcmaArray::read(SrsStream* stream) | 776 | int SrsAmf0EcmaArray::read(SrsStream* stream) |
| 755 | { | 777 | { |
| 756 | int ret = ERROR_SUCCESS; | 778 | int ret = ERROR_SUCCESS; |
| @@ -782,7 +804,7 @@ int SrsAmf0EcmaArray::read(SrsStream* stream) | @@ -782,7 +804,7 @@ int SrsAmf0EcmaArray::read(SrsStream* stream) | ||
| 782 | srs_verbose("amf0 read ecma_array count success. count=%d", count); | 804 | srs_verbose("amf0 read ecma_array count success. count=%d", count); |
| 783 | 805 | ||
| 784 | // value | 806 | // value |
| 785 | - this->count = count; | 807 | + this->_count = count; |
| 786 | 808 | ||
| 787 | while (!stream->empty()) { | 809 | while (!stream->empty()) { |
| 788 | // detect whether is eof. | 810 | // detect whether is eof. |
| @@ -837,8 +859,8 @@ int SrsAmf0EcmaArray::write(SrsStream* stream) | @@ -837,8 +859,8 @@ int SrsAmf0EcmaArray::write(SrsStream* stream) | ||
| 837 | return ret; | 859 | return ret; |
| 838 | } | 860 | } |
| 839 | 861 | ||
| 840 | - stream->write_4bytes(this->count); | ||
| 841 | - srs_verbose("amf0 write ecma_array count success. count=%d", value->count); | 862 | + stream->write_4bytes(this->_count); |
| 863 | + srs_verbose("amf0 write ecma_array count success. count=%d", _count); | ||
| 842 | 864 | ||
| 843 | // value | 865 | // value |
| 844 | for (int i = 0; i < properties->size(); i++) { | 866 | for (int i = 0; i < properties->size(); i++) { |
| @@ -868,26 +890,14 @@ int SrsAmf0EcmaArray::write(SrsStream* stream) | @@ -868,26 +890,14 @@ int SrsAmf0EcmaArray::write(SrsStream* stream) | ||
| 868 | return ret; | 890 | return ret; |
| 869 | } | 891 | } |
| 870 | 892 | ||
| 871 | -int SrsAmf0EcmaArray::size() | 893 | +void SrsAmf0EcmaArray::clear() |
| 872 | { | 894 | { |
| 873 | - int size = 1 + 4; | ||
| 874 | - | ||
| 875 | - for (int i = 0; i < properties->size(); i++){ | ||
| 876 | - std::string name = key_at(i); | ||
| 877 | - SrsAmf0Any* value = value_at(i); | ||
| 878 | - | ||
| 879 | - size += SrsAmf0Size::utf8(name); | ||
| 880 | - size += SrsAmf0Size::any(value); | ||
| 881 | - } | ||
| 882 | - | ||
| 883 | - size += SrsAmf0Size::object_eof(); | ||
| 884 | - | ||
| 885 | - return size; | 895 | + properties->clear(); |
| 886 | } | 896 | } |
| 887 | 897 | ||
| 888 | -void SrsAmf0EcmaArray::clear() | 898 | +int SrsAmf0EcmaArray::count() |
| 889 | { | 899 | { |
| 890 | - properties->clear(); | 900 | + return properties->size(); |
| 891 | } | 901 | } |
| 892 | 902 | ||
| 893 | std::string SrsAmf0EcmaArray::key_at(int index) | 903 | std::string SrsAmf0EcmaArray::key_at(int index) |
| @@ -158,14 +158,20 @@ private: | @@ -158,14 +158,20 @@ private: | ||
| 158 | public: | 158 | public: |
| 159 | virtual ~SrsAmf0Object(); | 159 | virtual ~SrsAmf0Object(); |
| 160 | 160 | ||
| 161 | +public: | ||
| 162 | + virtual int size(); | ||
| 161 | virtual int read(SrsStream* stream); | 163 | virtual int read(SrsStream* stream); |
| 162 | virtual int write(SrsStream* stream); | 164 | virtual int write(SrsStream* stream); |
| 163 | 165 | ||
| 164 | - virtual int size(); | 166 | +public: |
| 167 | + virtual int count(); | ||
| 168 | + // @remark: max index is count(). | ||
| 165 | virtual std::string key_at(int index); | 169 | virtual std::string key_at(int index); |
| 170 | + // @remark: max index is count(). | ||
| 166 | virtual SrsAmf0Any* value_at(int index); | 171 | virtual SrsAmf0Any* value_at(int index); |
| 172 | + | ||
| 173 | +public: | ||
| 167 | virtual void set(std::string key, SrsAmf0Any* value); | 174 | virtual void set(std::string key, SrsAmf0Any* value); |
| 168 | - | ||
| 169 | virtual SrsAmf0Any* get_property(std::string name); | 175 | virtual SrsAmf0Any* get_property(std::string name); |
| 170 | virtual SrsAmf0Any* ensure_property_string(std::string name); | 176 | virtual SrsAmf0Any* ensure_property_string(std::string name); |
| 171 | virtual SrsAmf0Any* ensure_property_number(std::string name); | 177 | virtual SrsAmf0Any* ensure_property_number(std::string name); |
| @@ -182,7 +188,7 @@ class SrsAmf0EcmaArray : public SrsAmf0Any | @@ -182,7 +188,7 @@ class SrsAmf0EcmaArray : public SrsAmf0Any | ||
| 182 | private: | 188 | private: |
| 183 | __SrsUnSortedHashtable* properties; | 189 | __SrsUnSortedHashtable* properties; |
| 184 | __SrsAmf0ObjectEOF* eof; | 190 | __SrsAmf0ObjectEOF* eof; |
| 185 | - int32_t count; | 191 | + int32_t _count; |
| 186 | 192 | ||
| 187 | private: | 193 | private: |
| 188 | // use SrsAmf0Any::ecma_array() to create it. | 194 | // use SrsAmf0Any::ecma_array() to create it. |
| @@ -191,15 +197,21 @@ private: | @@ -191,15 +197,21 @@ private: | ||
| 191 | public: | 197 | public: |
| 192 | virtual ~SrsAmf0EcmaArray(); | 198 | virtual ~SrsAmf0EcmaArray(); |
| 193 | 199 | ||
| 200 | +public: | ||
| 201 | + virtual int size(); | ||
| 194 | virtual int read(SrsStream* stream); | 202 | virtual int read(SrsStream* stream); |
| 195 | virtual int write(SrsStream* stream); | 203 | virtual int write(SrsStream* stream); |
| 196 | 204 | ||
| 197 | - virtual int size(); | 205 | +public: |
| 198 | virtual void clear(); | 206 | virtual void clear(); |
| 207 | + virtual int count(); | ||
| 208 | + // @remark: max index is count(). | ||
| 199 | virtual std::string key_at(int index); | 209 | virtual std::string key_at(int index); |
| 210 | + // @remark: max index is count(). | ||
| 200 | virtual SrsAmf0Any* value_at(int index); | 211 | virtual SrsAmf0Any* value_at(int index); |
| 201 | - virtual void set(std::string key, SrsAmf0Any* value); | ||
| 202 | 212 | ||
| 213 | +public: | ||
| 214 | + virtual void set(std::string key, SrsAmf0Any* value); | ||
| 203 | virtual SrsAmf0Any* get_property(std::string name); | 215 | virtual SrsAmf0Any* get_property(std::string name); |
| 204 | virtual SrsAmf0Any* ensure_property_string(std::string name); | 216 | virtual SrsAmf0Any* ensure_property_string(std::string name); |
| 205 | }; | 217 | }; |
| @@ -3183,7 +3183,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) | @@ -3183,7 +3183,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) | ||
| 3183 | SrsAmf0EcmaArray* arr = any->to_ecma_array(); | 3183 | SrsAmf0EcmaArray* arr = any->to_ecma_array(); |
| 3184 | 3184 | ||
| 3185 | // if ecma array, copy to object. | 3185 | // if ecma array, copy to object. |
| 3186 | - for (int i = 0; i < arr->size(); i++) { | 3186 | + for (int i = 0; i < arr->count(); i++) { |
| 3187 | metadata->set(arr->key_at(i), arr->value_at(i)); | 3187 | metadata->set(arr->key_at(i), arr->value_at(i)); |
| 3188 | } | 3188 | } |
| 3189 | 3189 |
| @@ -748,3 +748,64 @@ VOID TEST(AMF0Test, AnyAssert) | @@ -748,3 +748,64 @@ VOID TEST(AMF0Test, AnyAssert) | ||
| 748 | EXPECT_EQ(1+4+3, s.pos()); | 748 | EXPECT_EQ(1+4+3, s.pos()); |
| 749 | } | 749 | } |
| 750 | } | 750 | } |
| 751 | + | ||
| 752 | +VOID TEST(AMF0Test, ObjectProps) | ||
| 753 | +{ | ||
| 754 | + SrsAmf0Object* o = NULL; | ||
| 755 | + | ||
| 756 | + // get/set property | ||
| 757 | + if (true) { | ||
| 758 | + o = SrsAmf0Any::object(); | ||
| 759 | + SrsAutoFree(SrsAmf0Object, o, false); | ||
| 760 | + | ||
| 761 | + EXPECT_TRUE(NULL == o->get_property("name")); | ||
| 762 | + | ||
| 763 | + o->set("name", SrsAmf0Any::str("winlin")); | ||
| 764 | + EXPECT_TRUE(NULL != o->get_property("name")); | ||
| 765 | + | ||
| 766 | + EXPECT_TRUE(NULL == o->get_property("age")); | ||
| 767 | + | ||
| 768 | + o->set("age", SrsAmf0Any::number(100)); | ||
| 769 | + EXPECT_TRUE(NULL != o->get_property("age")); | ||
| 770 | + } | ||
| 771 | + | ||
| 772 | + // index property | ||
| 773 | + if (true) { | ||
| 774 | + o = SrsAmf0Any::object(); | ||
| 775 | + SrsAutoFree(SrsAmf0Object, o, false); | ||
| 776 | + | ||
| 777 | + o->set("name", SrsAmf0Any::str("winlin")); | ||
| 778 | + EXPECT_STREQ("name", o->key_at(0).c_str()); | ||
| 779 | + ASSERT_TRUE(o->value_at(0)->is_string()); | ||
| 780 | + EXPECT_STREQ("winlin", o->value_at(0)->to_str().c_str()); | ||
| 781 | + | ||
| 782 | + o->set("age", SrsAmf0Any::number(100)); | ||
| 783 | + EXPECT_STREQ("name", o->key_at(0).c_str()); | ||
| 784 | + ASSERT_TRUE(o->value_at(0)->is_string()); | ||
| 785 | + EXPECT_STREQ("winlin", o->value_at(0)->to_str().c_str()); | ||
| 786 | + | ||
| 787 | + EXPECT_STREQ("age", o->key_at(1).c_str()); | ||
| 788 | + ASSERT_TRUE(o->value_at(1)->is_number()); | ||
| 789 | + EXPECT_DOUBLE_EQ(100, o->value_at(1)->to_number()); | ||
| 790 | + } | ||
| 791 | + | ||
| 792 | + // ensure property | ||
| 793 | + if (true) { | ||
| 794 | + o = SrsAmf0Any::object(); | ||
| 795 | + SrsAutoFree(SrsAmf0Object, o, false); | ||
| 796 | + | ||
| 797 | + EXPECT_TRUE(NULL == o->ensure_property_string("name")); | ||
| 798 | + EXPECT_TRUE(NULL == o->ensure_property_number("age")); | ||
| 799 | + | ||
| 800 | + o->set("name", SrsAmf0Any::str("winlin")); | ||
| 801 | + EXPECT_TRUE(NULL != o->ensure_property_string("name")); | ||
| 802 | + EXPECT_TRUE(NULL == o->ensure_property_number("name")); | ||
| 803 | + EXPECT_TRUE(NULL == o->ensure_property_number("age")); | ||
| 804 | + | ||
| 805 | + o->set("age", SrsAmf0Any::number(100)); | ||
| 806 | + EXPECT_TRUE(NULL != o->ensure_property_string("name")); | ||
| 807 | + EXPECT_TRUE(NULL == o->ensure_property_number("name")); | ||
| 808 | + EXPECT_TRUE(NULL != o->ensure_property_number("age")); | ||
| 809 | + EXPECT_TRUE(NULL == o->ensure_property_string("age")); | ||
| 810 | + } | ||
| 811 | +} |
-
请 注册 或 登录 后发表评论