You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/rtmp/amf0.go

90 lines
2.2 KiB
Go

package rtmp
import (
"github.com/q191201771/lal/bele"
"io"
)
var (
amf0TypeMarkerNumber uint8 = 0x00 //
amf0TypeMarkerBoolean uint8 = 0x01
amf0TypeMarkerString uint8 = 0x02 //
amf0TypeMarkerObject uint8 = 0x03 //
amf0TypeMarkerMovieclip uint8 = 0x04
amf0TypeMarkerNull uint8 = 0x05
amf0TypeMarkerUndefined uint8 = 0x06
amf0TypeMarkerReference uint8 = 0x07
amf0TypeMarkerEcmaArray uint8 = 0x08
amf0TypeMarkerObjectEnd uint8 = 0x09 //
amf0TypeMarkerStrictArray uint8 = 0x0a
amf0TypeMarkerData uint8 = 0x0b
amf0TypeMarkerLongString uint8 = 0x0c //
amf0TypeMarkerUnsupported uint8 = 0x0d
amf0TypeMarkerRecordset uint8 = 0x0e
amf0TypeMarkerXmlDocument uint8 = 0x0f
amf0TypeMarkerTypedObject uint8 = 0x10
amf0TypeMarkerObjectEndBytes = []byte{0, 0, amf0TypeMarkerObjectEnd}
)
type amf0 struct {
}
var Amf0 amf0
func (amf0) writeString(writer io.Writer, val string) error {
if len(val) < 65536 {
if _, err := writer.Write([]byte{amf0TypeMarkerString}); err != nil {
return err
}
if err := bele.WriteBe(writer, uint16(len(val))); err != nil {
return err
}
} else {
if _, err := writer.Write([]byte{amf0TypeMarkerLongString}); err != nil {
return err
}
if err := bele.WriteBe(writer, uint32(len(val))); err != nil {
return err
}
}
_, err := writer.Write([]byte(val))
return err
}
func (amf0) writeNumber(writer io.Writer, val float64) error {
if _, err := writer.Write([]byte{amf0TypeMarkerNumber}); err != nil {
return err
}
return bele.WriteBe(writer, val)
}
type ObjectPair struct {
key string
value interface{}
}
func (amf0) writeObject(writer io.Writer, objs []ObjectPair) error {
if _, err := writer.Write([]byte{amf0TypeMarkerObject}); err != nil {
return err
}
for i := 0; i < len(objs); i++ {
if err := bele.WriteBe(writer, uint16(len(objs[i].key))); err != nil {
return err
}
if _, err := writer.Write([]byte(objs[i].key)); err != nil {
return err
}
switch objs[i].value.(type) {
case string:
if err := Amf0.writeString(writer, objs[i].value.(string)); err != nil {
return err
}
default:
panic(objs[i].value)
}
}
_, err := writer.Write(amf0TypeMarkerObjectEndBytes)
return err
}