mirror of https://bitbucket.org/ausocean/av.git
Ported amfPropEncode and now using - tested and working
This commit is contained in:
parent
1b1843d2b6
commit
558c27ffbc
67
rtmp/rtmp.go
67
rtmp/rtmp.go
|
@ -1093,10 +1093,13 @@ func sendConnectPacket(r *C.RTMP, cp *C.RTMPPacket) int {
|
||||||
|
|
||||||
if r.Link.extras.o_num != 0 {
|
if r.Link.extras.o_num != 0 {
|
||||||
for i := 0; i < int(r.Link.extras.o_num); i++ {
|
for i := 0; i < int(r.Link.extras.o_num); i++ {
|
||||||
enc = (*byte)(unsafe.Pointer(C.AMFProp_Encode((*C.AMFObjectProperty)(
|
//enc = (*byte)(unsafe.Pointer(C.AMFProp_Encode((*C.AMFObjectProperty)(
|
||||||
incPtr(unsafe.Pointer(&r.Link.extras.o_props), int(unsafe.Sizeof(
|
//incPtr(unsafe.Pointer(&r.Link.extras.o_props), int(unsafe.Sizeof(
|
||||||
r.Link.extras.o_props)), i)), (*C.char)(unsafe.Pointer(enc)), (*C.char)(
|
//r.Link.extras.o_props)), i)), (*C.char)(unsafe.Pointer(enc)), (*C.char)(
|
||||||
unsafe.Pointer(pend)))))
|
//unsafe.Pointer(pend)))))
|
||||||
|
enc = amfPropEncode((*C.AMFObjectProperty)(incPtr(unsafe.Pointer(
|
||||||
|
&r.Link.extras.o_props), int(unsafe.Sizeof(r.Link.extras.o_props)), i)),
|
||||||
|
enc, pend)
|
||||||
|
|
||||||
if enc == nil {
|
if enc == nil {
|
||||||
return 0
|
return 0
|
||||||
|
@ -1111,6 +1114,59 @@ func sendConnectPacket(r *C.RTMP, cp *C.RTMPPacket) int {
|
||||||
return rtmpSendPacket(r, &packet, 1)
|
return rtmpSendPacket(r, &packet, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func amfPropEncode(p *C.AMFObjectProperty, pBuffer *byte, pBufEnd *byte) *byte {
|
||||||
|
if p.p_type == AMF_INVALID {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.p_type != AMF_NULL && int(uintptr(unsafe.Pointer(pBuffer)))+
|
||||||
|
int(p.p_name.av_len)+2+1 >= int(
|
||||||
|
uintptr(unsafe.Pointer(pBufEnd))) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.p_type != AMF_NULL && p.p_name.av_len != 0 {
|
||||||
|
*indxBytePtr(unsafe.Pointer(pBuffer), 0) = byte(p.p_name.av_len >> 8)
|
||||||
|
pBuffer = (*byte)(incBytePtr(unsafe.Pointer(pBuffer), 1))
|
||||||
|
*indxBytePtr(unsafe.Pointer(pBuffer), 0) = byte(p.p_name.av_len & 0xff)
|
||||||
|
pBuffer = (*byte)(incBytePtr(unsafe.Pointer(pBuffer), 1))
|
||||||
|
memmove(unsafe.Pointer(pBuffer), unsafe.Pointer(p.p_name.av_val),
|
||||||
|
uintptr(p.p_name.av_len))
|
||||||
|
pBuffer = (*byte)(incBytePtr(unsafe.Pointer(pBuffer), int(p.p_name.av_len)))
|
||||||
|
}
|
||||||
|
|
||||||
|
switch p.p_type {
|
||||||
|
case AMF_NUMBER:
|
||||||
|
pBuffer = amfEncodeNumber(pBuffer, pBufEnd, float64(p.p_vu.p_number))
|
||||||
|
case AMF_BOOLEAN:
|
||||||
|
val := 0
|
||||||
|
if p.p_vu.p_number != 0 {
|
||||||
|
val = 1
|
||||||
|
}
|
||||||
|
pBuffer = amfEncodeBoolean(pBuffer, pBufEnd, val)
|
||||||
|
case AMF_STRING:
|
||||||
|
pBuffer = amfEncodeString(pBuffer, pBufEnd, &p.p_vu.p_aval)
|
||||||
|
case AMF_NULL:
|
||||||
|
if uintptr(incBytePtr(unsafe.Pointer(pBuffer), 1)) >= uintptr(unsafe.Pointer(
|
||||||
|
pBufEnd)) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
*(*byte)(unsafe.Pointer(pBuffer)) = AMF_NULL
|
||||||
|
pBuffer = (*byte)(incBytePtr(unsafe.Pointer(pBuffer), 1))
|
||||||
|
case AMF_OBJECT:
|
||||||
|
pBuffer = (*byte)(unsafe.Pointer(C.AMF_Encode(&p.p_vu.p_object, (*C.char)(
|
||||||
|
unsafe.Pointer(pBuffer)), (*C.char)(unsafe.Pointer(pBufEnd)))))
|
||||||
|
case AMF_ECMA_ARRAY:
|
||||||
|
pBuffer = (*byte)(unsafe.Pointer(C.AMF_EncodeEcmaArray(&p.p_vu.p_object, (*C.char)(unsafe.Pointer(pBuffer)), (*C.char)(unsafe.Pointer(pBufEnd)))))
|
||||||
|
case AMF_STRICT_ARRAY:
|
||||||
|
pBuffer = (*byte)(unsafe.Pointer(C.AMF_EncodeArray(&p.p_vu.p_object, (*C.char)(unsafe.Pointer(pBuffer)), (*C.char)(unsafe.Pointer(pBufEnd)))))
|
||||||
|
default:
|
||||||
|
log.Println("amfPropEncode: invalid type!")
|
||||||
|
pBuffer = nil
|
||||||
|
}
|
||||||
|
return pBuffer
|
||||||
|
}
|
||||||
|
|
||||||
func rtmpConnectStream(r *C.RTMP, seekTime int32) int {
|
func rtmpConnectStream(r *C.RTMP, seekTime int32) int {
|
||||||
var packet C.RTMPPacket
|
var packet C.RTMPPacket
|
||||||
memset((*byte)(unsafe.Pointer(&packet)), 0, int(unsafe.Sizeof(packet)))
|
memset((*byte)(unsafe.Pointer(&packet)), 0, int(unsafe.Sizeof(packet)))
|
||||||
|
@ -1121,7 +1177,7 @@ func rtmpConnectStream(r *C.RTMP, seekTime int32) int {
|
||||||
|
|
||||||
r.m_mediaChannel = 0
|
r.m_mediaChannel = 0
|
||||||
|
|
||||||
// TODO: port is connected and read packet
|
// TODO: read packet
|
||||||
for r.m_bPlaying == 0 && rtmpIsConnected(r) != 0 &&
|
for r.m_bPlaying == 0 && rtmpIsConnected(r) != 0 &&
|
||||||
C.RTMP_ReadPacket(r, &packet) != 0 {
|
C.RTMP_ReadPacket(r, &packet) != 0 {
|
||||||
|
|
||||||
|
@ -1495,7 +1551,6 @@ func rtmpSendPacket(r *C.RTMP, packet *C.RTMPPacket, queue int) int {
|
||||||
ptr = incBytePtr(ptr, 3+int(method.av_len))
|
ptr = incBytePtr(ptr, 3+int(method.av_len))
|
||||||
//txn = int(C.AMF_DecodeNumber((*C.char)(ptr)))
|
//txn = int(C.AMF_DecodeNumber((*C.char)(ptr)))
|
||||||
txn = int(amfDecodeNumber((*byte)(ptr)))
|
txn = int(amfDecodeNumber((*byte)(ptr)))
|
||||||
// TODO: port this
|
|
||||||
avQueue(&r.m_methodCalls, (*int32)(unsafe.Pointer(&r.m_numCalls)),
|
avQueue(&r.m_methodCalls, (*int32)(unsafe.Pointer(&r.m_numCalls)),
|
||||||
&method, int32(txn))
|
&method, int32(txn))
|
||||||
//C.AV_queue(&r.m_methodCalls, (*C.int)(unsafe.Pointer(&r.m_numCalls)), &method,
|
//C.AV_queue(&r.m_methodCalls, (*C.int)(unsafe.Pointer(&r.m_numCalls)), &method,
|
||||||
|
|
Loading…
Reference in New Issue