2018-08-24 03:55:36 +03:00
|
|
|
/*
|
|
|
|
NAME
|
|
|
|
amf_headers.go
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
See Readme.md
|
|
|
|
|
|
|
|
AUTHORS
|
|
|
|
Saxon Nelson-Milton <saxon@ausocean.org>
|
|
|
|
|
|
|
|
LICENSE
|
|
|
|
amf_headers.go is Copyright (C) 2017 the Australian Ocean Lab (AusOcean)
|
|
|
|
|
|
|
|
It is free software: you can redistribute it and/or modify them
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
Free Software Foundation, either version 3 of the License, or (at your
|
|
|
|
option) any later version.
|
|
|
|
|
|
|
|
It is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with revid in gpl.txt. If not, see http://www.gnu.org/licenses.
|
|
|
|
|
|
|
|
Derived from librtmp under the GNU Lesser General Public License 2.1
|
|
|
|
Copyright (C) 2005-2008 Team XBMC http://www.xbmc.org
|
|
|
|
Copyright (C) 2008-2009 Andrej Stepanchuk
|
|
|
|
Copyright (C) 2009-2010 Howard Chu
|
|
|
|
*/
|
2018-08-24 03:17:11 +03:00
|
|
|
package rtmp
|
|
|
|
|
2018-08-25 15:57:20 +03:00
|
|
|
import (
|
|
|
|
"unsafe"
|
|
|
|
)
|
|
|
|
|
2018-08-24 03:17:11 +03:00
|
|
|
const (
|
|
|
|
AMF_NUMBER = iota
|
|
|
|
AMF_BOOLEAN
|
|
|
|
AMF_STRING
|
|
|
|
AMF_OBJECT
|
|
|
|
AMF_MOVIECLIP /* reserved, not used */
|
|
|
|
AMF_NULL
|
|
|
|
AMF_UNDEFINED
|
|
|
|
AMF_REFERENCE
|
|
|
|
AMF_ECMA_ARRAY
|
|
|
|
AMF_OBJECT_END
|
|
|
|
AMF_STRICT_ARRAY
|
|
|
|
AMF_DATE
|
|
|
|
AMF_LONG_STRING
|
|
|
|
AMF_UNSUPPORTED
|
|
|
|
AMF_RECORDSET /* reserved, not used */
|
|
|
|
AMF_XML_DOC
|
|
|
|
AMF_TYPED_OBJECT
|
|
|
|
AMF_AVMPLUS /* switch to AMF3 */
|
|
|
|
AMF_INVALID = 0xff
|
|
|
|
)
|
|
|
|
|
2018-08-24 04:00:24 +03:00
|
|
|
// typedef enum
|
|
|
|
// amf.h +40
|
|
|
|
type C_AMFDataType int32
|
|
|
|
|
2018-08-24 03:17:11 +03:00
|
|
|
// typedef struct C_AVal
|
|
|
|
// amf.h +57
|
|
|
|
type C_AVal struct {
|
|
|
|
av_val *byte
|
|
|
|
av_len int32
|
|
|
|
}
|
|
|
|
|
2018-08-25 15:57:20 +03:00
|
|
|
// C_AVal is in amf.h
|
|
|
|
// amf.h +62
|
|
|
|
func AVC(str string) C_AVal {
|
|
|
|
var aval C_AVal
|
|
|
|
if len(str) != 0 {
|
|
|
|
aval.av_val = &([]byte(str)[0])
|
|
|
|
} else {
|
|
|
|
aval.av_val = nil
|
|
|
|
}
|
|
|
|
aval.av_len = int32(len(str))
|
|
|
|
return aval
|
|
|
|
}
|
|
|
|
|
2018-09-06 07:13:40 +03:00
|
|
|
func CAV(av *C_AVal) string {
|
|
|
|
return string((*[_Gi]byte)(unsafe.Pointer(av.av_val))[:av.av_len])
|
|
|
|
}
|
|
|
|
|
2018-08-25 15:57:20 +03:00
|
|
|
// #define AVMATCH(a1,a2)
|
|
|
|
// amf.h +63
|
|
|
|
func C_AVMATCH(a1, a2 *C_AVal) int32 {
|
|
|
|
if a1.av_len == a2.av_len && memcmp(unsafe.Pointer(a1.av_val),
|
|
|
|
unsafe.Pointer(a2.av_val), int(a1.av_len)) == 0 {
|
|
|
|
return 1
|
|
|
|
} else {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-24 03:17:11 +03:00
|
|
|
// typedef struct AMF_Object
|
|
|
|
// amf.h +67
|
|
|
|
type C_AMFObject struct {
|
|
|
|
o_num int32
|
|
|
|
o_props *C_AMFObjectProperty
|
|
|
|
}
|
|
|
|
|
2018-08-24 04:00:24 +03:00
|
|
|
// typedef struct P_vu
|
|
|
|
// amf.h +73
|
|
|
|
type P_vu struct {
|
|
|
|
p_number float64
|
2018-09-06 09:40:15 +03:00
|
|
|
p_aval string
|
2018-08-24 04:00:24 +03:00
|
|
|
p_object C_AMFObject
|
|
|
|
}
|
|
|
|
|
2018-08-24 03:17:11 +03:00
|
|
|
// typedef struct AMFObjectProperty
|
|
|
|
// amf.h +79
|
|
|
|
type C_AMFObjectProperty struct {
|
|
|
|
p_name C_AVal
|
|
|
|
p_type C_AMFDataType
|
|
|
|
p_vu P_vu
|
|
|
|
p_UTCoffset int16
|
|
|
|
}
|