1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

amf0 utest: remove class SrsAmf0String, use SrsAmf0Any instead

This commit is contained in:
winlin 2014-03-08 13:57:08 +08:00
parent 57ce04ae12
commit cae8228b09
6 changed files with 104 additions and 90 deletions

View file

@ -276,7 +276,7 @@ int SrsBandwidth::check_play(
std::stringstream seq;
seq << i;
std::string play_data = "SrS band check data from server's playing......";
pkt->data->set(seq.str(), new SrsAmf0String(play_data.c_str()));
pkt->data->set(seq.str(), SrsAmf0Any::str(play_data.c_str()));
}
data_count += 2;

View file

@ -639,10 +639,8 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
}
#endif
metadata->metadata->set("server", new SrsAmf0String(
RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")"));
metadata->metadata->set("contributor",
new SrsAmf0String(RTMP_SIG_SRS_PRIMARY_AUTHROS));
metadata->metadata->set("server", SrsAmf0Any::str(RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")"));
metadata->metadata->set("contributor", SrsAmf0Any::str(RTMP_SIG_SRS_PRIMARY_AUTHROS));
SrsAmf0Any* prop = NULL;
if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) {

View file

@ -105,12 +105,23 @@ bool SrsAmf0Any::is_ecma_array()
return marker == RTMP_AMF0_EcmaArray;
}
std::string SrsAmf0Any::to_str()
{
__SrsAmf0String* o = srs_amf0_convert<__SrsAmf0String>(this);
return o->value;
}
bool SrsAmf0Any::is_object_eof()
{
return marker == RTMP_AMF0_ObjectEnd;
}
SrsAmf0String::SrsAmf0String(const char* _value)
SrsAmf0Any* SrsAmf0Any::str(const char* value)
{
return new __SrsAmf0String(value);
}
__SrsAmf0String::__SrsAmf0String(const char* _value)
{
marker = RTMP_AMF0_String;
if (_value) {
@ -118,11 +129,11 @@ SrsAmf0String::SrsAmf0String(const char* _value)
}
}
SrsAmf0String::~SrsAmf0String()
__SrsAmf0String::~__SrsAmf0String()
{
}
int SrsAmf0String::size()
int __SrsAmf0String::size()
{
return SrsAmf0Size::str(value);
}
@ -1035,8 +1046,8 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value)
if ((ret = srs_amf0_read_string(stream, data)) != ERROR_SUCCESS) {
return ret;
}
value = new SrsAmf0String();
srs_amf0_convert<SrsAmf0String>(value)->value = data;
value = SrsAmf0Any::str();
srs_amf0_convert<__SrsAmf0String>(value)->value = data;
return ret;
}
case RTMP_AMF0_Boolean: {
@ -1109,7 +1120,7 @@ int srs_amf0_write_any(SrsStream* stream, SrsAmf0Any* value)
switch (value->marker) {
case RTMP_AMF0_String: {
std::string data = srs_amf0_convert<SrsAmf0String>(value)->value;
std::string data = srs_amf0_convert<__SrsAmf0String>(value)->value;
return srs_amf0_write_string(stream, data);
}
case RTMP_AMF0_Boolean: {

View file

@ -47,10 +47,10 @@ class SrsAmf0Any
{
public:
char marker;
public:
SrsAmf0Any();
virtual ~SrsAmf0Any();
public:
virtual bool is_string();
virtual bool is_boolean();
virtual bool is_number();
@ -59,8 +59,12 @@ public:
virtual bool is_object();
virtual bool is_object_eof();
virtual bool is_ecma_array();
public:
virtual std::string to_str();
public:
virtual int size() = 0;
public:
static SrsAmf0Any* str(const char* value = NULL);
};
/**
@ -68,14 +72,15 @@ public:
* 2.4 String Type
* string-type = string-marker UTF-8
* @return default value is empty string.
* @remark: use SrsAmf0Any::str() to create it.
*/
class SrsAmf0String : public SrsAmf0Any
class __SrsAmf0String : public SrsAmf0Any
{
public:
std::string value;
SrsAmf0String(const char* _value = NULL);
virtual ~SrsAmf0String();
__SrsAmf0String(const char* _value);
virtual ~__SrsAmf0String();
virtual int size();
};

View file

@ -280,15 +280,15 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
msg->set_packet(pkt, 0);
pkt->command_object = new SrsAmf0Object();
pkt->command_object->set("app", new SrsAmf0String(app.c_str()));
pkt->command_object->set("swfUrl", new SrsAmf0String());
pkt->command_object->set("tcUrl", new SrsAmf0String(tc_url.c_str()));
pkt->command_object->set("app", SrsAmf0Any::str(app.c_str()));
pkt->command_object->set("swfUrl", SrsAmf0Any::str());
pkt->command_object->set("tcUrl", SrsAmf0Any::str(tc_url.c_str()));
pkt->command_object->set("fpad", new SrsAmf0Boolean(false));
pkt->command_object->set("capabilities", new SrsAmf0Number(239));
pkt->command_object->set("audioCodecs", new SrsAmf0Number(3575));
pkt->command_object->set("videoCodecs", new SrsAmf0Number(252));
pkt->command_object->set("videoFunction", new SrsAmf0Number(1));
pkt->command_object->set("pageUrl", new SrsAmf0String());
pkt->command_object->set("pageUrl", SrsAmf0Any::str());
pkt->command_object->set("objectEncoding", new SrsAmf0Number(0));
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
@ -632,14 +632,14 @@ int SrsRtmpServer::connect_app(SrsRequest* req)
srs_error("invalid request, must specifies the tcUrl. ret=%d", ret);
return ret;
}
req->tcUrl = srs_amf0_convert<SrsAmf0String>(prop)->value;
req->tcUrl = prop->to_str();
if ((prop = pkt->command_object->ensure_property_string("pageUrl")) != NULL) {
req->pageUrl = srs_amf0_convert<SrsAmf0String>(prop)->value;
req->pageUrl = prop->to_str();
}
if ((prop = pkt->command_object->ensure_property_string("swfUrl")) != NULL) {
req->swfUrl = srs_amf0_convert<SrsAmf0String>(prop)->value;
req->swfUrl = prop->to_str();
}
if ((prop = pkt->command_object->ensure_property_number("objectEncoding")) != NULL) {
@ -698,31 +698,31 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsConnectAppResPacket* pkt = new SrsConnectAppResPacket();
pkt->props->set("fmsVer", new SrsAmf0String("FMS/"RTMP_SIG_FMS_VER));
pkt->props->set("fmsVer", SrsAmf0Any::str("FMS/"RTMP_SIG_FMS_VER));
pkt->props->set("capabilities", new SrsAmf0Number(127));
pkt->props->set("mode", new SrsAmf0Number(1));
pkt->info->set(StatusLevel, new SrsAmf0String(StatusLevelStatus));
pkt->info->set(StatusCode, new SrsAmf0String(StatusCodeConnectSuccess));
pkt->info->set(StatusDescription, new SrsAmf0String("Connection succeeded"));
pkt->info->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->info->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectSuccess));
pkt->info->set(StatusDescription, SrsAmf0Any::str("Connection succeeded"));
pkt->info->set("objectEncoding", new SrsAmf0Number(req->objectEncoding));
SrsAmf0EcmaArray* data = new SrsAmf0EcmaArray();
pkt->info->set("data", data);
data->set("version", new SrsAmf0String(RTMP_SIG_FMS_VER));
data->set("srs_sig", new SrsAmf0String(RTMP_SIG_SRS_KEY));
data->set("srs_server", new SrsAmf0String(RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")"));
data->set("srs_license", new SrsAmf0String(RTMP_SIG_SRS_LICENSE));
data->set("srs_role", new SrsAmf0String(RTMP_SIG_SRS_ROLE));
data->set("srs_url", new SrsAmf0String(RTMP_SIG_SRS_URL));
data->set("srs_version", new SrsAmf0String(RTMP_SIG_SRS_VERSION));
data->set("srs_site", new SrsAmf0String(RTMP_SIG_SRS_WEB));
data->set("srs_email", new SrsAmf0String(RTMP_SIG_SRS_EMAIL));
data->set("srs_copyright", new SrsAmf0String(RTMP_SIG_SRS_COPYRIGHT));
data->set("srs_primary_authors", new SrsAmf0String(RTMP_SIG_SRS_PRIMARY_AUTHROS));
data->set("version", SrsAmf0Any::str(RTMP_SIG_FMS_VER));
data->set("srs_sig", SrsAmf0Any::str(RTMP_SIG_SRS_KEY));
data->set("srs_server", SrsAmf0Any::str(RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")"));
data->set("srs_license", SrsAmf0Any::str(RTMP_SIG_SRS_LICENSE));
data->set("srs_role", SrsAmf0Any::str(RTMP_SIG_SRS_ROLE));
data->set("srs_url", SrsAmf0Any::str(RTMP_SIG_SRS_URL));
data->set("srs_version", SrsAmf0Any::str(RTMP_SIG_SRS_VERSION));
data->set("srs_site", SrsAmf0Any::str(RTMP_SIG_SRS_WEB));
data->set("srs_email", SrsAmf0Any::str(RTMP_SIG_SRS_EMAIL));
data->set("srs_copyright", SrsAmf0Any::str(RTMP_SIG_SRS_COPYRIGHT));
data->set("srs_primary_authors", SrsAmf0Any::str(RTMP_SIG_SRS_PRIMARY_AUTHROS));
if (server_ip) {
data->set("srs_server_ip", new SrsAmf0String(server_ip));
data->set("srs_server_ip", SrsAmf0Any::str(server_ip));
}
msg->set_packet(pkt, 0);
@ -742,9 +742,9 @@ void SrsRtmpServer::response_connect_reject(SrsRequest *req, const char* desc)
SrsConnectAppResPacket* pkt = new SrsConnectAppResPacket();
pkt->command_name = "_error";
pkt->props->set(StatusLevel, new SrsAmf0String(StatusLevelError));
pkt->props->set(StatusCode, new SrsAmf0String(StatusCodeConnectRejected));
pkt->props->set(StatusDescription, new SrsAmf0String(desc));
pkt->props->set(StatusLevel, SrsAmf0Any::str(StatusLevelError));
pkt->props->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectRejected));
pkt->props->set(StatusDescription, SrsAmf0Any::str(desc));
//pkt->props->set("objectEncoding", new SrsAmf0Number(req->objectEncoding));
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
@ -864,11 +864,11 @@ int SrsRtmpServer::start_play(int stream_id)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->data->set(StatusLevel, new SrsAmf0String(StatusLevelStatus));
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodeStreamReset));
pkt->data->set(StatusDescription, new SrsAmf0String("Playing and resetting stream."));
pkt->data->set(StatusDetails, new SrsAmf0String("stream"));
pkt->data->set(StatusClientId, new SrsAmf0String(RTMP_SIG_CLIENT_ID));
pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeStreamReset));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Playing and resetting stream."));
pkt->data->set(StatusDetails, SrsAmf0Any::str("stream"));
pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
msg->set_packet(pkt, stream_id);
@ -884,11 +884,11 @@ int SrsRtmpServer::start_play(int stream_id)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->data->set(StatusLevel, new SrsAmf0String(StatusLevelStatus));
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodeStreamStart));
pkt->data->set(StatusDescription, new SrsAmf0String("Started playing stream."));
pkt->data->set(StatusDetails, new SrsAmf0String("stream"));
pkt->data->set(StatusClientId, new SrsAmf0String(RTMP_SIG_CLIENT_ID));
pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeStreamStart));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Started playing stream."));
pkt->data->set(StatusDetails, SrsAmf0Any::str("stream"));
pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
msg->set_packet(pkt, stream_id);
@ -918,7 +918,7 @@ int SrsRtmpServer::start_play(int stream_id)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsOnStatusDataPacket* pkt = new SrsOnStatusDataPacket();
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodeDataStart));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeDataStart));
msg->set_packet(pkt, stream_id);
@ -944,9 +944,9 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->data->set(StatusLevel, new SrsAmf0String(StatusLevelStatus));
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodeStreamPause));
pkt->data->set(StatusDescription, new SrsAmf0String("Paused stream."));
pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeStreamPause));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Paused stream."));
msg->set_packet(pkt, stream_id);
@ -977,9 +977,9 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->data->set(StatusLevel, new SrsAmf0String(StatusLevelStatus));
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodeStreamUnpause));
pkt->data->set(StatusDescription, new SrsAmf0String("Unpaused stream."));
pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeStreamUnpause));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Unpaused stream."));
msg->set_packet(pkt, stream_id);
@ -1087,8 +1087,8 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->command_name = RTMP_AMF0_COMMAND_ON_FC_PUBLISH;
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodePublishStart));
pkt->data->set(StatusDescription, new SrsAmf0String("Started publishing stream."));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodePublishStart));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream."));
msg->set_packet(pkt, stream_id);
@ -1103,10 +1103,10 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->data->set(StatusLevel, new SrsAmf0String(StatusLevelStatus));
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodePublishStart));
pkt->data->set(StatusDescription, new SrsAmf0String("Started publishing stream."));
pkt->data->set(StatusClientId, new SrsAmf0String(RTMP_SIG_CLIENT_ID));
pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodePublishStart));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream."));
pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
msg->set_packet(pkt, stream_id);
@ -1132,8 +1132,8 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->command_name = RTMP_AMF0_COMMAND_ON_FC_UNPUBLISH;
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodeUnpublishSuccess));
pkt->data->set(StatusDescription, new SrsAmf0String("Stop publishing stream."));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeUnpublishSuccess));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Stop publishing stream."));
msg->set_packet(pkt, stream_id);
@ -1161,10 +1161,10 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->data->set(StatusLevel, new SrsAmf0String(StatusLevelStatus));
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodeUnpublishSuccess));
pkt->data->set(StatusDescription, new SrsAmf0String("Stream is now unpublished"));
pkt->data->set(StatusClientId, new SrsAmf0String(RTMP_SIG_CLIENT_ID));
pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeUnpublishSuccess));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Stream is now unpublished"));
pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
msg->set_packet(pkt, stream_id);
@ -1189,10 +1189,10 @@ int SrsRtmpServer::start_flash_publish(int stream_id)
SrsCommonMessage* msg = new SrsCommonMessage();
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->data->set(StatusLevel, new SrsAmf0String(StatusLevelStatus));
pkt->data->set(StatusCode, new SrsAmf0String(StatusCodePublishStart));
pkt->data->set(StatusDescription, new SrsAmf0String("Started publishing stream."));
pkt->data->set(StatusClientId, new SrsAmf0String(RTMP_SIG_CLIENT_ID));
pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodePublishStart));
pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream."));
pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
msg->set_packet(pkt, stream_id);

View file

@ -52,7 +52,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object o;
size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
o.set("name", new SrsAmf0String("winlin"));
o.set("name", SrsAmf0Any::str("winlin"));
EXPECT_EQ(size, SrsAmf0Size::object(&o));
}
@ -106,7 +106,7 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray o;
size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
o.set("name", new SrsAmf0String("winlin"));
o.set("name", SrsAmf0Any::str("winlin"));
EXPECT_EQ(size, SrsAmf0Size::array(&o));
}
@ -153,10 +153,10 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object o;
size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
o.set("name", new SrsAmf0String("winlin"));
o.set("name", SrsAmf0Any::str("winlin"));
SrsAmf0EcmaArray* args = new SrsAmf0EcmaArray();
args->set("p0", new SrsAmf0String("function"));
args->set("p0", SrsAmf0Any::str("function"));
size += SrsAmf0Size::utf8("args")+SrsAmf0Size::array(args);
o.set("args", args);
@ -167,10 +167,10 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object o;
size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
o.set("name", new SrsAmf0String("winlin"));
o.set("name", SrsAmf0Any::str("winlin"));
SrsAmf0EcmaArray* args = new SrsAmf0EcmaArray();
args->set("p0", new SrsAmf0String("function"));
args->set("p0", SrsAmf0Any::str("function"));
size += SrsAmf0Size::utf8("args")+SrsAmf0Size::array(args);
o.set("args", args);
@ -188,10 +188,10 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray o;
size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
o.set("name", new SrsAmf0String("winlin"));
o.set("name", SrsAmf0Any::str("winlin"));
SrsAmf0Object* args = new SrsAmf0Object();
args->set("p0", new SrsAmf0String("function"));
args->set("p0", SrsAmf0Any::str("function"));
size += SrsAmf0Size::utf8("args")+SrsAmf0Size::object(args);
o.set("args", args);
@ -202,10 +202,10 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray o;
size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
o.set("name", new SrsAmf0String("winlin"));
o.set("name", SrsAmf0Any::str("winlin"));
SrsAmf0Object* args = new SrsAmf0Object();
args->set("p0", new SrsAmf0String("function"));
args->set("p0", SrsAmf0Any::str("function"));
size += SrsAmf0Size::utf8("args")+SrsAmf0Size::object(args);
o.set("args", args);
@ -223,10 +223,10 @@ VOID TEST(AMF0Test, Size)
SrsAmf0Object o;
size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
o.set("name", new SrsAmf0String("winlin"));
o.set("name", SrsAmf0Any::str("winlin"));
SrsAmf0Object* args = new SrsAmf0Object();
args->set("p0", new SrsAmf0String("function"));
args->set("p0", SrsAmf0Any::str("function"));
size += SrsAmf0Size::utf8("args")+SrsAmf0Size::object(args);
o.set("args", args);
@ -244,10 +244,10 @@ VOID TEST(AMF0Test, Size)
SrsAmf0EcmaArray o;
size += SrsAmf0Size::utf8("name")+SrsAmf0Size::str("winlin");
o.set("name", new SrsAmf0String("winlin"));
o.set("name", SrsAmf0Any::str("winlin"));
SrsAmf0EcmaArray* args = new SrsAmf0EcmaArray();
args->set("p0", new SrsAmf0String("function"));
args->set("p0", SrsAmf0Any::str("function"));
size += SrsAmf0Size::utf8("args")+SrsAmf0Size::array(args);
o.set("args", args);