diff --git a/trunk/src/rtmp/srs_protocol_amf0.cpp b/trunk/src/rtmp/srs_protocol_amf0.cpp index 925f6e754..5a6d317d7 100644 --- a/trunk/src/rtmp/srs_protocol_amf0.cpp +++ b/trunk/src/rtmp/srs_protocol_amf0.cpp @@ -1494,39 +1494,3 @@ int srs_amf0_write_object_eof(SrsStream* stream, __SrsAmf0ObjectEOF* value) return ret; } - -int srs_amf0_read_object(SrsStream* stream, SrsAmf0Object*& value) -{ - int ret = ERROR_SUCCESS; - - value = SrsAmf0Any::object(); - - if ((ret = value->read(stream)) != ERROR_SUCCESS) { - srs_freep(value); - return ret; - } - - return ret; -} -int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value) -{ - return value->write(stream); -} - -int srs_amf0_read_ecma_array(SrsStream* stream, SrsAmf0EcmaArray*& value) -{ - int ret = ERROR_SUCCESS; - - value = SrsAmf0Any::ecma_array(); - - if ((ret = value->read(stream)) != ERROR_SUCCESS) { - srs_freep(value); - return ret; - } - - return ret; -} -int srs_amf0_write_ecma_array(SrsStream* stream, SrsAmf0EcmaArray* value) -{ - return value->write(stream); -} diff --git a/trunk/src/rtmp/srs_protocol_amf0.hpp b/trunk/src/rtmp/srs_protocol_amf0.hpp index 4c0cdb57b..61ab3c870 100644 --- a/trunk/src/rtmp/srs_protocol_amf0.hpp +++ b/trunk/src/rtmp/srs_protocol_amf0.hpp @@ -270,23 +270,4 @@ extern int srs_amf0_write_null(SrsStream* stream); extern int srs_amf0_read_undefined(SrsStream* stream); extern int srs_amf0_write_undefined(SrsStream* stream); -/** -* read amf0 object from stream. -* 2.5 Object Type -* anonymous-object-type = object-marker *(object-property) -* object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker) -*/ -extern int srs_amf0_read_object(SrsStream* stream, SrsAmf0Object*& value); -extern int srs_amf0_write_object(SrsStream* stream, SrsAmf0Object* value); - -/** -* read amf0 object from stream. -* 2.10 ECMA Array Type -* ecma-array-type = associative-count *(object-property) -* associative-count = U32 -* object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker) -*/ -extern int srs_amf0_read_ecma_array(SrsStream* stream, SrsAmf0EcmaArray*& value); -extern int srs_amf0_write_ecma_array(SrsStream* stream, SrsAmf0EcmaArray* value); - #endif \ No newline at end of file diff --git a/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp b/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp index 9db3f5137..bf729f13e 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp @@ -1730,7 +1730,7 @@ SrsConnectAppPacket::SrsConnectAppPacket() { command_name = RTMP_AMF0_COMMAND_CONNECT; transaction_id = 1; - command_object = NULL; + command_object = SrsAmf0Any::object(); } SrsConnectAppPacket::~SrsConnectAppPacket() @@ -1764,12 +1764,7 @@ int SrsConnectAppPacket::decode(SrsStream* stream) return ret; } - if ((ret = srs_amf0_read_object(stream, command_object)) != ERROR_SUCCESS) { - srs_error("amf0 decode connect command_object failed. ret=%d", ret); - return ret; - } - if (command_object == NULL) { - ret = ERROR_RTMP_AMF0_DECODE; + if ((ret = command_object->read(stream)) != ERROR_SUCCESS) { srs_error("amf0 decode connect command_object failed. ret=%d", ret); return ret; } @@ -1811,7 +1806,7 @@ int SrsConnectAppPacket::encode_packet(SrsStream* stream) } srs_verbose("encode transaction_id success."); - if ((ret = srs_amf0_write_object(stream, command_object)) != ERROR_SUCCESS) { + if ((ret = command_object->write(stream)) != ERROR_SUCCESS) { srs_error("encode command_object failed. ret=%d", ret); return ret; } @@ -1826,8 +1821,6 @@ SrsConnectAppResPacket::SrsConnectAppResPacket() { command_name = RTMP_AMF0_COMMAND_RESULT; transaction_id = 1; - // TODO: FIXME: memory leak for decode will set the props and info. - // TODO: FIXME: bug#22, refine the amf0. props = SrsAmf0Any::object(); info = SrsAmf0Any::object(); } @@ -1864,22 +1857,12 @@ int SrsConnectAppResPacket::decode(SrsStream* stream) return ret; } - if ((ret = srs_amf0_read_object(stream, props)) != ERROR_SUCCESS) { - srs_error("amf0 decode connect props failed. ret=%d", ret); - return ret; - } - if (props == NULL) { - ret = ERROR_RTMP_AMF0_DECODE; + if ((ret = props->read(stream)) != ERROR_SUCCESS) { srs_error("amf0 decode connect props failed. ret=%d", ret); return ret; } - if ((ret = srs_amf0_read_object(stream, info)) != ERROR_SUCCESS) { - srs_error("amf0 decode connect info failed. ret=%d", ret); - return ret; - } - if (info == NULL) { - ret = ERROR_RTMP_AMF0_DECODE; + if ((ret = info->read(stream)) != ERROR_SUCCESS) { srs_error("amf0 decode connect info failed. ret=%d", ret); return ret; } @@ -1930,20 +1913,16 @@ int SrsConnectAppResPacket::encode_packet(SrsStream* stream) } srs_verbose("encode transaction_id success."); - if (props->size() > 0) { - if ((ret = srs_amf0_write_object(stream, props)) != ERROR_SUCCESS) { - srs_error("encode props failed. ret=%d", ret); - return ret; - } + if ((ret = props->write(stream)) != ERROR_SUCCESS) { + srs_error("encode props failed. ret=%d", ret); + return ret; } srs_verbose("encode props success."); - if (info->size() > 0) { - if ((ret = srs_amf0_write_object(stream, info)) != ERROR_SUCCESS) { - srs_error("encode info failed. ret=%d", ret); - return ret; - } + if ((ret = info->write(stream)) != ERROR_SUCCESS) { + srs_error("encode info failed. ret=%d", ret); + return ret; } srs_verbose("encode info success."); @@ -2765,7 +2744,7 @@ int SrsPlayResPacket::encode_packet(SrsStream* stream) } srs_verbose("encode command_object success."); - if ((ret = srs_amf0_write_object(stream, desc)) != ERROR_SUCCESS) { + if ((ret = desc->write(stream)) != ERROR_SUCCESS) { srs_error("encode desc failed. ret=%d", ret); return ret; } @@ -2884,7 +2863,7 @@ int SrsOnStatusCallPacket::encode_packet(SrsStream* stream) } srs_verbose("encode args success.");; - if ((ret = srs_amf0_write_object(stream, data)) != ERROR_SUCCESS) { + if ((ret = data->write(stream)) != ERROR_SUCCESS) { srs_error("encode data failed. ret=%d", ret); return ret; } @@ -2947,7 +2926,7 @@ int SrsBandwidthPacket::encode_packet(SrsStream* stream) } srs_verbose("encode args success.");; - if ((ret = srs_amf0_write_object(stream, data)) != ERROR_SUCCESS) { + if ((ret = data->write(stream)) != ERROR_SUCCESS) { srs_error("encode data failed. ret=%d", ret); return ret; } @@ -3088,7 +3067,7 @@ int SrsOnStatusDataPacket::encode_packet(SrsStream* stream) } srs_verbose("encode command_name success."); - if ((ret = srs_amf0_write_object(stream, data)) != ERROR_SUCCESS) { + if ((ret = data->write(stream)) != ERROR_SUCCESS) { srs_error("encode data failed. ret=%d", ret); return ret; } @@ -3240,7 +3219,7 @@ int SrsOnMetaDataPacket::encode_packet(SrsStream* stream) } srs_verbose("encode name success."); - if ((ret = srs_amf0_write_object(stream, metadata)) != ERROR_SUCCESS) { + if ((ret = metadata->write(stream)) != ERROR_SUCCESS) { srs_error("encode metadata failed. ret=%d", ret); return ret; } diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index b80da4019..de5936d82 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -729,4 +729,22 @@ VOID TEST(AMF0Test, AnyAssert) SrsAutoFree(SrsAmf0Any, o, false); EXPECT_TRUE(o->is_ecma_array()); } + + // empty object + if (true) { + o = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Any, o, false); + s.reset(); + EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); + EXPECT_EQ(1+3, s.pos()); + } + + // empty ecma array + if (true) { + o = SrsAmf0Any::ecma_array(); + SrsAutoFree(SrsAmf0Any, o, false); + s.reset(); + EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); + EXPECT_EQ(1+4+3, s.pos()); + } }