正在显示
2 个修改的文件
包含
45 行增加
和
13 行删除
| @@ -37,6 +37,35 @@ class SrsStream; | @@ -37,6 +37,35 @@ class SrsStream; | ||
| 37 | class SrsAmf0Object; | 37 | class SrsAmf0Object; |
| 38 | class SrsAmf0EcmaArray; | 38 | class SrsAmf0EcmaArray; |
| 39 | 39 | ||
| 40 | +//////////////////////////////////////////////////////////////////////// | ||
| 41 | +//////////////////////////////////////////////////////////////////////// | ||
| 42 | +//////////////////////////////////////////////////////////////////////// | ||
| 43 | +// amf0 codec | ||
| 44 | +// 1. SrsAmf0Any: read any from stream | ||
| 45 | +// SrsAmf0Any* pany = NULL; | ||
| 46 | +// if ((ret = srs_amf0_read_any(stream, &pany)) != ERROR_SUCCESS) { | ||
| 47 | +// return ret; | ||
| 48 | +// } | ||
| 49 | +// 2. SrsAmf0Any: convert to specifid type, for instance, string | ||
| 50 | +// SrsAmf0Any* pany = ... | ||
| 51 | +// if (pany && pany->is_string()) { | ||
| 52 | +// string v = pany->to_str(); | ||
| 53 | +// } | ||
| 54 | +// 3. SrsAmf0Any: parse specified type to any, for instance, string | ||
| 55 | +// SrsAmf0Any* pany = SrsAmf0Any::str("winlin"); | ||
| 56 | +// 4. SrsAmf0Size: get amf0 instance size | ||
| 57 | +// int size = SrsAmf0Size::str("winlin"); | ||
| 58 | +// 5. SrsAmf0Object: the amf0 object, directly new is ok. | ||
| 59 | +// SrsAmf0Object* obj = SrsAmf0Any::object(); | ||
| 60 | +// SrsAmf0Object* obj = new SrsAmf0Object(); | ||
| 61 | +// 5. SrsAmf0EcmaArray: the amf0 ecma array, directly new is ok. | ||
| 62 | +// SrsAmf0EcmaArray* arr = SrsAmf0Any::array(); | ||
| 63 | +// SrsAmf0EcmaArray* arr = new SrsAmf0EcmaArray(); | ||
| 64 | +// for detail usage, see interfaces of each object. | ||
| 65 | +//////////////////////////////////////////////////////////////////////// | ||
| 66 | +//////////////////////////////////////////////////////////////////////// | ||
| 67 | +//////////////////////////////////////////////////////////////////////// | ||
| 68 | + | ||
| 40 | /** | 69 | /** |
| 41 | * any amf0 value. | 70 | * any amf0 value. |
| 42 | * 2.1 Types Overview | 71 | * 2.1 Types Overview |
| @@ -2624,17 +2624,19 @@ int SrsPlayPacket::decode(SrsStream* stream) | @@ -2624,17 +2624,19 @@ int SrsPlayPacket::decode(SrsStream* stream) | ||
| 2624 | } | 2624 | } |
| 2625 | SrsAutoFree(SrsAmf0Any, reset_value, false); | 2625 | SrsAutoFree(SrsAmf0Any, reset_value, false); |
| 2626 | 2626 | ||
| 2627 | - // check if the value is bool or number | ||
| 2628 | - // An optional Boolean value or number that specifies whether | ||
| 2629 | - // to flush any previous playlist | ||
| 2630 | - if (reset_value->is_boolean()) { | ||
| 2631 | - reset = reset_value->to_boolean(); | ||
| 2632 | - } else if (reset_value->is_number()) { | ||
| 2633 | - reset = (reset_value->to_number() == 0 ? false : true); | ||
| 2634 | - } else { | ||
| 2635 | - ret = ERROR_RTMP_AMF0_DECODE; | ||
| 2636 | - srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret); | ||
| 2637 | - return ret; | 2627 | + if (reset_value) { |
| 2628 | + // check if the value is bool or number | ||
| 2629 | + // An optional Boolean value or number that specifies whether | ||
| 2630 | + // to flush any previous playlist | ||
| 2631 | + if (reset_value->is_boolean()) { | ||
| 2632 | + reset = reset_value->to_boolean(); | ||
| 2633 | + } else if (reset_value->is_number()) { | ||
| 2634 | + reset = (reset_value->to_number() == 0 ? false : true); | ||
| 2635 | + } else { | ||
| 2636 | + ret = ERROR_RTMP_AMF0_DECODE; | ||
| 2637 | + srs_error("amf0 invalid type=%#x, requires number or bool, ret=%d", reset_value->marker, ret); | ||
| 2638 | + return ret; | ||
| 2639 | + } | ||
| 2638 | } | 2640 | } |
| 2639 | 2641 | ||
| 2640 | srs_info("amf0 decode play packet success"); | 2642 | srs_info("amf0 decode play packet success"); |
| @@ -3188,7 +3190,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) | @@ -3188,7 +3190,7 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) | ||
| 3188 | return ret; | 3190 | return ret; |
| 3189 | } | 3191 | } |
| 3190 | 3192 | ||
| 3191 | - if (any->is_object()) { | 3193 | + if (any && any->is_object()) { |
| 3192 | srs_freep(metadata); | 3194 | srs_freep(metadata); |
| 3193 | metadata = dynamic_cast<SrsAmf0Object*>(any); | 3195 | metadata = dynamic_cast<SrsAmf0Object*>(any); |
| 3194 | srs_info("decode metadata object success"); | 3196 | srs_info("decode metadata object success"); |
| @@ -3199,10 +3201,11 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) | @@ -3199,10 +3201,11 @@ int SrsOnMetaDataPacket::decode(SrsStream* stream) | ||
| 3199 | if (!arr) { | 3201 | if (!arr) { |
| 3200 | ret = ERROR_RTMP_AMF0_DECODE; | 3202 | ret = ERROR_RTMP_AMF0_DECODE; |
| 3201 | srs_error("decode metadata array failed. ret=%d", ret); | 3203 | srs_error("decode metadata array failed. ret=%d", ret); |
| 3202 | - srs_freep(any); | ||
| 3203 | return ret; | 3204 | return ret; |
| 3204 | } | 3205 | } |
| 3205 | 3206 | ||
| 3207 | + // if ecma array, copy to object. | ||
| 3208 | + SrsAutoFree(SrsAmf0EcmaArray, arr, false); | ||
| 3206 | for (int i = 0; i < arr->size(); i++) { | 3209 | for (int i = 0; i < arr->size(); i++) { |
| 3207 | metadata->set(arr->key_at(i), arr->value_at(i)); | 3210 | metadata->set(arr->key_at(i), arr->value_at(i)); |
| 3208 | } | 3211 | } |
-
请 注册 或 登录 后发表评论