diff --git a/rtmp/amf/decode.go b/rtmp/amf/decode.go index 9c1108c..1ad64d1 100644 --- a/rtmp/amf/decode.go +++ b/rtmp/amf/decode.go @@ -10,7 +10,7 @@ type AMFObj map[interface{}]interface{} func DecodeAMF(data *[]byte) (AMFObj, error) { var byte_idx uint32 - var root_obj_idx uint8 + var root_obj_idx int amf_root_obj := make(AMFObj) for { top_level_obj, err := read_next(data, &byte_idx) @@ -18,6 +18,7 @@ func DecodeAMF(data *[]byte) (AMFObj, error) { return amf_root_obj, err } amf_root_obj[root_obj_idx] = top_level_obj + root_obj_idx += 1 if byte_idx == uint32(len(*data)) { break @@ -66,6 +67,30 @@ func read_string(data *[]byte, byte_idx *uint32) (string, error) { return string(string_bytes), err } +func read_object(data *[]byte, byte_idx *uint32) (AMFObj, error) { + root_obj := make(AMFObj) + for { + key, err := read_string(data, byte_idx) + if err != nil { + return root_obj, err + } + if key == "" { + if end_byte, err := read_bytes(data, byte_idx, 1); err != nil { + return root_obj, err + } else if end_byte[0] != 9 { + return root_obj, errors.New("Object should end but didnt") + } + return root_obj, nil + } + val, err := read_next(data, byte_idx) + if err != nil { + return root_obj, err + } + root_obj[key] = val + } + +} + func read_next(data *[]byte, byte_idx *uint32) (interface{}, error) { data_type, err := read_bytes(data, byte_idx, 1) var next_obj interface{} @@ -79,6 +104,8 @@ func read_next(data *[]byte, byte_idx *uint32) (interface{}, error) { next_obj, err = read_bool(data, byte_idx) case 2: next_obj, err = read_string(data, byte_idx) + case 3: + next_obj, err = read_object(data, byte_idx) default: return nil, errors.New("Unhandled data type") }