stream-server/rtmp/amf/decode.go

60 lines
1.2 KiB
Go
Raw Normal View History

2023-08-10 23:53:23 +05:00
package amf
2023-08-11 15:22:25 +05:00
import (
"errors"
"encoding/binary"
"math"
)
2023-08-10 23:53:23 +05:00
type AMFObj map[interface{}]interface{}
func DecodeAMF(data *[]byte) (AMFObj, error) {
2023-08-11 15:22:25 +05:00
var byte_idx uint32
var root_obj_idx uint8
amf_root_obj := make(AMFObj)
for {
top_level_obj, err := read_next(data, &byte_idx)
if err != nil {
return amf_root_obj, err
}
amf_root_obj[root_obj_idx] = top_level_obj
root_obj_idx += 1
}
return amf_root_obj, nil
}
func read_bytes(data *[]byte, byte_idx *uint32, n uint32) ([]byte, error) {
if int(*byte_idx + n) > len(*data) {
return make([]byte, 0), errors.New("Read goes past end")
}
*byte_idx += n
return (*data)[*byte_idx:*byte_idx + n], nil
}
func read_number(data *[]byte, byte_idx *uint32) (float64, error) {
float_bytes, err := read_bytes(data, byte_idx, 8)
if err != nil {
return 0.0, err
}
return math.Float64frombits(binary.BigEndian.Uint64(float_bytes)), nil
}
func read_next(data *[]byte, byte_idx *uint32) (interface{}, error) {
data_type, err := read_bytes(data, byte_idx, 1)
if err != nil {
return nil, err
}
switch data_type[0] {
case 0:
next_obj, err := read_number(data, byte_idx)
if err != nil {
return nil, err
}
return next_obj, nil
}
return nil, errors.New("tmp")
2023-08-10 23:53:23 +05:00
}
2023-08-11 15:22:25 +05:00