mirror of https://bitbucket.org/ausocean/av.git
Port AMF3ReadInteger, AMF3ReadString, AMF3DC_AddProp and AMFProp_SetName
This commit is contained in:
parent
346e63ca7c
commit
8be354a6d5
90
rtmp/rtmp.go
90
rtmp/rtmp.go
|
@ -3558,6 +3558,86 @@ func C_AMF_EncodeNamedBoolean(output *byte, outend *byte, strName *C.AVal, bVal
|
||||||
return C_AMF_EncodeBoolean(output, outend, bVal)
|
return C_AMF_EncodeBoolean(output, outend, bVal)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// void AMFProp_SetName(AMFObjectProperty *prop, AVal *name);
|
||||||
|
// amf.c +318
|
||||||
|
func C_AMFProp_SetName(prop *C.AMFObjectProperty, name *C.AVal) {
|
||||||
|
prop.p_name = *name
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
AMF3_INTEGER_MAX = 268435455
|
||||||
|
AMF3_INTEGER_MIN = -268435456
|
||||||
|
)
|
||||||
|
|
||||||
|
// int AMF3ReadInteger(const char *data, int32_t *valp);
|
||||||
|
// amf.c +426
|
||||||
|
func C_AMF3ReadInteger(data *byte, valp *int32) int32 {
|
||||||
|
var i int
|
||||||
|
var val int32
|
||||||
|
|
||||||
|
for i <= 2 {
|
||||||
|
/* handle first 3 bytes */
|
||||||
|
if *indxBytePtr(unsafe.Pointer(data), i)&0x80 != 0 {
|
||||||
|
/* byte used */
|
||||||
|
val <<= 7 /* shift up */
|
||||||
|
val |= int32(*indxBytePtr(unsafe.Pointer(data), i) & 0x7f) /* add bits */
|
||||||
|
i++
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if i > 2 {
|
||||||
|
/* use 4th byte, all 8bits */
|
||||||
|
val <<= 8
|
||||||
|
val |= int32(*indxBytePtr(unsafe.Pointer(data), 3))
|
||||||
|
|
||||||
|
/* range check */
|
||||||
|
if val > AMF3_INTEGER_MAX {
|
||||||
|
val -= (1 << 29)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* use 7bits of last unparsed byte (0xxxxxxx) */
|
||||||
|
val <<= 7
|
||||||
|
val |= int32(*indxBytePtr(unsafe.Pointer(data), i))
|
||||||
|
}
|
||||||
|
|
||||||
|
*valp = val
|
||||||
|
|
||||||
|
if i > 2 {
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
return int32(i + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// int AMF3ReadString(const char *data, AVal *str);
|
||||||
|
// amf.c +466
|
||||||
|
func C_AMF3ReadString(data *byte, str *C.AVal) int32 {
|
||||||
|
var ref int32
|
||||||
|
// assert elided - we will get a panic if it's nil.
|
||||||
|
|
||||||
|
len := C_AMF3ReadInteger(data, &ref)
|
||||||
|
data = indxBytePtr(unsafe.Pointer(data), int(len))
|
||||||
|
|
||||||
|
if ref&0x1 == 0 {
|
||||||
|
/* reference: 0xxx */
|
||||||
|
// TODO(kortschak) Logging.
|
||||||
|
// refIndex := (ref >> 1)
|
||||||
|
// RTMP_Log(RTMP_LOGDEBUG,
|
||||||
|
// "%s, string reference, index: %d, not supported, ignoring!",
|
||||||
|
// __FUNCTION__, refIndex);
|
||||||
|
str.av_val = nil
|
||||||
|
str.av_len = 0
|
||||||
|
return len
|
||||||
|
} else {
|
||||||
|
nSize := (ref >> 1)
|
||||||
|
str.av_val = (*C.char)(unsafe.Pointer(data))
|
||||||
|
str.av_len = C.int(nSize)
|
||||||
|
return len + nSize
|
||||||
|
}
|
||||||
|
return len
|
||||||
|
}
|
||||||
|
|
||||||
// char* AMF_EncodeBoolean(char* output, char* outend, int bVal);
|
// char* AMF_EncodeBoolean(char* output, char* outend, int bVal);
|
||||||
// amf.c +260
|
// amf.c +260
|
||||||
func C_AMF_EncodeBoolean(output *byte, outend *byte, bVal int) *byte {
|
func C_AMF_EncodeBoolean(output *byte, outend *byte, bVal int) *byte {
|
||||||
|
@ -3765,6 +3845,16 @@ func C_AMF_EncodeInt32(output *byte, outend *byte, nVal int32) *byte {
|
||||||
return (*byte)(incBytePtr(outputPtr, 4))
|
return (*byte)(incBytePtr(outputPtr, 4))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// void AMF3CD_AddProp(AMF3ClassDef *cd, AVal *prop);
|
||||||
|
// amf.c +1298
|
||||||
|
func AMF3CD_AddProp(cd *C.AMF3ClassDef, prop *C.AVal) {
|
||||||
|
if cd.cd_num&0x0f == 0 {
|
||||||
|
cd.cd_props = (*C.AVal)(realloc(unsafe.Pointer(cd.cd_props), int(uintptr(cd.cd_num+16)*unsafe.Sizeof(C.AVal{}))))
|
||||||
|
}
|
||||||
|
*(*C.AVal)(incPtr(unsafe.Pointer(cd.cd_props), int(cd.cd_num), int(unsafe.Sizeof(C.AVal{})))) = *prop
|
||||||
|
cd.cd_num++
|
||||||
|
}
|
||||||
|
|
||||||
func realloc(ptr unsafe.Pointer, size int) unsafe.Pointer {
|
func realloc(ptr unsafe.Pointer, size int) unsafe.Pointer {
|
||||||
dest := allocate(uintptr(size))
|
dest := allocate(uintptr(size))
|
||||||
if ptr != nil {
|
if ptr != nil {
|
||||||
|
|
Loading…
Reference in New Issue