From 3691c106faee66c5208d54857c5d72553944471f Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 8 Mar 2014 17:18:44 +0800 Subject: [PATCH] amf0 utest: add usage for amf0 --- trunk/src/rtmp/srs_protocol_amf0.hpp | 29 ++++++++++++++++++++++ trunk/src/rtmp/srs_protocol_rtmp_stack.cpp | 29 ++++++++++++---------- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/trunk/src/rtmp/srs_protocol_amf0.hpp b/trunk/src/rtmp/srs_protocol_amf0.hpp index 45f8268d8..325d352be 100644 --- a/trunk/src/rtmp/srs_protocol_amf0.hpp +++ b/trunk/src/rtmp/srs_protocol_amf0.hpp @@ -37,6 +37,35 @@ class SrsStream; class SrsAmf0Object; class SrsAmf0EcmaArray; +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +// amf0 codec +// 1. SrsAmf0Any: read any from stream +// SrsAmf0Any* pany = NULL; +// if ((ret = srs_amf0_read_any(stream, &pany)) != ERROR_SUCCESS) { +// return ret; +// } +// 2. SrsAmf0Any: convert to specifid type, for instance, string +// SrsAmf0Any* pany = ... +// if (pany && pany->is_string()) { +// string v = pany->to_str(); +// } +// 3. SrsAmf0Any: parse specified type to any, for instance, string +// SrsAmf0Any* pany = SrsAmf0Any::str("winlin"); +// 4. SrsAmf0Size: get amf0 instance size +// int size = SrsAmf0Size::str("winlin"); +// 5. SrsAmf0Object: the amf0 object, directly new is ok. +// SrsAmf0Object* obj = SrsAmf0Any::object(); +// SrsAmf0Object* obj = new SrsAmf0Object(); +// 5. SrsAmf0EcmaArray: the amf0 ecma array, directly new is ok. +// SrsAmf0EcmaArray* arr = SrsAmf0Any::array(); +// SrsAmf0EcmaArray* arr = new SrsAmf0EcmaArray(); +// for detail usage, see interfaces of each object. +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + /** * any amf0 value. * 2.1 Types Overview diff --git a/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp b/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp index 8269b2999..ddb3455c5 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp_stack.cpp @@ -2624,17 +2624,19 @@ int SrsPlayPacket::decode(SrsStream* stream) } SrsAutoFree(SrsAmf0Any, reset_value, false); - // check if the value is bool or number - // An optional Boolean value or number that specifies whether - // to flush any previous playlist - if (reset_value->is_boolean()) { - reset = reset_value->to_boolean(); - } else if (reset_value->is_number()) { - reset = (reset_value->to_number() == 0 ? false : true); - } else { - ret = ERROR_RTMP_AMF0_DECODE; - srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret); - return ret; + if (reset_value) { + // check if the value is bool or number + // An optional Boolean value or number that specifies whether + // to flush any previous playlist + if (reset_value->is_boolean()) { + reset = reset_value->to_boolean(); + } else if (reset_value->is_number()) { + reset = (reset_value->to_number() == 0 ? false : true); + } else { + ret = ERROR_RTMP_AMF0_DECODE; + srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret); + return ret; + } } srs_info("amf0 decode play packet success"); @@ -3188,7 +3190,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) return ret; } - if (any->is_object()) { + if (any && any->is_object()) { srs_freep(metadata); metadata = dynamic_cast(any); srs_info("decode metadata object success"); @@ -3199,10 +3201,11 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) if (!arr) { ret = ERROR_RTMP_AMF0_DECODE; srs_error("decode metadata array failed. ret=%d", ret); - srs_freep(any); return ret; } + // if ecma array, copy to object. + SrsAutoFree(SrsAmf0EcmaArray, arr, false); for (int i = 0; i < arr->size(); i++) { metadata->set(arr->key_at(i), arr->value_at(i)); }