Basic root and number AMF decoding
This commit is contained in:
parent
ca36226491
commit
74d95d4769
1 changed files with 53 additions and 7 deletions
|
@ -1,13 +1,59 @@
|
||||||
package amf
|
package amf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"encoding/binary"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
type AMFObj map[interface{}]interface{}
|
type AMFObj map[interface{}]interface{}
|
||||||
|
|
||||||
func DecodeAMF(data *[]byte) (AMFObj, error) {
|
func DecodeAMF(data *[]byte) (AMFObj, error) {
|
||||||
obj := make(AMFObj)
|
var byte_idx uint32
|
||||||
test := make(AMFObj)
|
var root_obj_idx uint8
|
||||||
obj[0] = "connect"
|
amf_root_obj := make(AMFObj)
|
||||||
obj[1] = float64(1)
|
|
||||||
obj[2] = test
|
for {
|
||||||
test["tcUrl"] = "rtmp://test-domain.nil/Desktop/tmp"
|
top_level_obj, err := read_next(data, &byte_idx)
|
||||||
return obj, nil
|
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")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue