mirror of https://bitbucket.org/ausocean/av.git
rtmp: start reordering funcs in rtmp.go, still need to do a few more
This commit is contained in:
parent
1441d1d968
commit
43701a252f
504
rtmp/rtmp.go
504
rtmp/rtmp.go
|
@ -149,13 +149,9 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// int RTMP_IsConnected(RTMP *r);
|
// TODO: find location in c file
|
||||||
// rtmp.c +363
|
func SET_RCVTIMEO(tv *int32, s int32) {
|
||||||
func C_RTMP_IsConnected(r *C_RTMP) int32 {
|
*tv = s * 1000
|
||||||
if r.m_sb.sb_socket != -1 {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func startSession(rtmp *C_RTMP, u string, timeout uint32) (*C_RTMP, error) {
|
func startSession(rtmp *C_RTMP, u string, timeout uint32) (*C_RTMP, error) {
|
||||||
|
@ -194,6 +190,12 @@ func startSession(rtmp *C_RTMP, u string, timeout uint32) (*C_RTMP, error) {
|
||||||
return rtmp, nil
|
return rtmp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// uint32_t RTMP_GetTime();
|
||||||
|
// rtmp.c +156
|
||||||
|
func C_RTMP_GetTime() int32 {
|
||||||
|
return int32(time.Now().UnixNano() / 1000000)
|
||||||
|
}
|
||||||
|
|
||||||
// RTMP* RTMP_IsConnected();
|
// RTMP* RTMP_IsConnected();
|
||||||
// rtmp.c +317
|
// rtmp.c +317
|
||||||
func C_RTMP_Alloc() *C_RTMP {
|
func C_RTMP_Alloc() *C_RTMP {
|
||||||
|
@ -218,6 +220,59 @@ func C_RTMP_Init(r *C_RTMP) {
|
||||||
r.Link.swfAge = 30
|
r.Link.swfAge = 30
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// void RTMP_EnableWrite(RTMP *r);
|
||||||
|
// rtmp.c +351
|
||||||
|
func C_RTMP_EnableWrite(r *C_RTMP) {
|
||||||
|
r.Link.protocol |= RTMP_FEATURE_WRITE
|
||||||
|
}
|
||||||
|
|
||||||
|
// int RTMP_IsConnected(RTMP *r);
|
||||||
|
// rtmp.c +363
|
||||||
|
func C_RTMP_IsConnected(r *C_RTMP) int32 {
|
||||||
|
if r.m_sb.sb_socket != -1 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// void RTMP_SetBufferMS(RTMP *r, int size);
|
||||||
|
// rtmp.c +381
|
||||||
|
func C_RTMP_SetBufferMS(r *C_RTMP, size int32) {
|
||||||
|
r.m_nBufferMS = int32(size)
|
||||||
|
}
|
||||||
|
|
||||||
|
// void SocksSetup(RTMP *r, C_AVal* sockshost);
|
||||||
|
// rtmp.c +410
|
||||||
|
func C_SocksSetup(r *C_RTMP, sockshost *C_AVal) {
|
||||||
|
if sockshost.av_len != 0 {
|
||||||
|
socksport := strchr((*byte)(unsafe.Pointer(sockshost.av_val)), ':')
|
||||||
|
hostname := strdup((*byte)(unsafe.Pointer(sockshost.av_val)))
|
||||||
|
|
||||||
|
if unsafe.Pointer(socksport) != nil {
|
||||||
|
*indxBytePtr(unsafe.Pointer(hostname),
|
||||||
|
int(uintptr(decBytePtr(unsafe.Pointer(socksport),
|
||||||
|
int(uintptr(unsafe.Pointer(sockshost.av_val))))))) = '\000'
|
||||||
|
r.Link.sockshost.av_val = (*byte)(unsafe.Pointer(hostname))
|
||||||
|
r.Link.sockshost.av_len = int32(strlen(hostname))
|
||||||
|
|
||||||
|
value, err := strconv.Atoi(string(ptrToSlice(unsafe.Pointer(uintptr(
|
||||||
|
unsafe.Pointer(socksport))+uintptr(1)), int(strlen((*byte)(unsafe.Pointer(
|
||||||
|
uintptr(unsafe.Pointer(socksport))+uintptr(1)))))+1)))
|
||||||
|
if err != nil {
|
||||||
|
log.Println("C_SocksSetup: bad string conversion!")
|
||||||
|
}
|
||||||
|
if uintptr(unsafe.Pointer(socksport)) == 0 {
|
||||||
|
value = 1080
|
||||||
|
}
|
||||||
|
r.Link.socksport = uint16(value)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
r.Link.sockshost.av_val = nil
|
||||||
|
r.Link.sockshost.av_len = 0
|
||||||
|
r.Link.socksport = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// int RTMP_SetupURL(RTMP *r, char* url);
|
// int RTMP_SetupURL(RTMP *r, char* url);
|
||||||
// rtmp.c +757
|
// rtmp.c +757
|
||||||
// NOTE: code dealing with rtmp over http has been disregarded
|
// NOTE: code dealing with rtmp over http has been disregarded
|
||||||
|
@ -292,38 +347,6 @@ func C_RTMP_SetupURL(r *C_RTMP, u string) int32 {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// void SocksSetup(RTMP *r, C_AVal* sockshost);
|
|
||||||
// rtmp.c +410
|
|
||||||
func C_SocksSetup(r *C_RTMP, sockshost *C_AVal) {
|
|
||||||
if sockshost.av_len != 0 {
|
|
||||||
socksport := strchr((*byte)(unsafe.Pointer(sockshost.av_val)), ':')
|
|
||||||
hostname := strdup((*byte)(unsafe.Pointer(sockshost.av_val)))
|
|
||||||
|
|
||||||
if unsafe.Pointer(socksport) != nil {
|
|
||||||
*indxBytePtr(unsafe.Pointer(hostname),
|
|
||||||
int(uintptr(decBytePtr(unsafe.Pointer(socksport),
|
|
||||||
int(uintptr(unsafe.Pointer(sockshost.av_val))))))) = '\000'
|
|
||||||
r.Link.sockshost.av_val = (*byte)(unsafe.Pointer(hostname))
|
|
||||||
r.Link.sockshost.av_len = int32(strlen(hostname))
|
|
||||||
|
|
||||||
value, err := strconv.Atoi(string(ptrToSlice(unsafe.Pointer(uintptr(
|
|
||||||
unsafe.Pointer(socksport))+uintptr(1)), int(strlen((*byte)(unsafe.Pointer(
|
|
||||||
uintptr(unsafe.Pointer(socksport))+uintptr(1)))))+1)))
|
|
||||||
if err != nil {
|
|
||||||
log.Println("C_SocksSetup: bad string conversion!")
|
|
||||||
}
|
|
||||||
if uintptr(unsafe.Pointer(socksport)) == 0 {
|
|
||||||
value = 1080
|
|
||||||
}
|
|
||||||
r.Link.socksport = uint16(value)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
r.Link.sockshost.av_val = nil
|
|
||||||
r.Link.sockshost.av_len = 0
|
|
||||||
r.Link.socksport = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
func rtmpClose(r *C_RTMP) {
|
func rtmpClose(r *C_RTMP) {
|
||||||
closeInternal(r, 0)
|
closeInternal(r, 0)
|
||||||
|
@ -408,55 +431,6 @@ func closeInternal(r *C_RTMP, reconnect int32) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// void RTMP_EnableWrite(RTMP *r);
|
|
||||||
// rtmp.c +351
|
|
||||||
func C_RTMP_EnableWrite(r *C_RTMP) {
|
|
||||||
r.Link.protocol |= RTMP_FEATURE_WRITE
|
|
||||||
}
|
|
||||||
|
|
||||||
// void RTMP_SetBufferMS(RTMP *r, int size);
|
|
||||||
// rtmp.c +381
|
|
||||||
func C_RTMP_SetBufferMS(r *C_RTMP, size int32) {
|
|
||||||
r.m_nBufferMS = int32(size)
|
|
||||||
}
|
|
||||||
|
|
||||||
// int RTMP_Connect(RTMP *r, RTMPPacket* cp);
|
|
||||||
// rtmp.c +1032
|
|
||||||
func C_RTMP_Connect(r *C_RTMP, cp *C_RTMPPacket) int {
|
|
||||||
// TODO: port this
|
|
||||||
var service C.sockaddr_in
|
|
||||||
|
|
||||||
if r.Link.hostname.av_len == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
memset((*byte)(unsafe.Pointer(&service)), 0, int(unsafe.Sizeof(service)))
|
|
||||||
|
|
||||||
// TODO: port this
|
|
||||||
service.sin_family = C.AF_INET
|
|
||||||
|
|
||||||
if r.Link.socksport != 0 {
|
|
||||||
// TODO: port this
|
|
||||||
if C.add_addr_info(&service, (*C.AVal)(unsafe.Pointer(&r.Link.sockshost)), C.int(r.Link.socksport)) == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// connect directly
|
|
||||||
if C.add_addr_info(&service, (*C.AVal)(unsafe.Pointer(&r.Link.hostname)),
|
|
||||||
C.int(r.Link.port)) == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//if C.RTMP_Connect0(r, (*C.sockaddr)(unsafe.Pointer(&service))) == 0 {
|
|
||||||
if C_RTMP_Connect0(r, (*C.sockaddr)(unsafe.Pointer(&service))) == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
r.m_bSendCounter = 1
|
|
||||||
|
|
||||||
return int(C_RTMP_Connect1(r, cp))
|
|
||||||
//return int(C.RTMP_Connect1(r, cp))
|
|
||||||
}
|
|
||||||
|
|
||||||
// int RTMP_Connect0(RTMP *r, struct sockaddr* service);
|
// int RTMP_Connect0(RTMP *r, struct sockaddr* service);
|
||||||
// rtmp.c +906
|
// rtmp.c +906
|
||||||
func C_RTMP_Connect0(r *C_RTMP, service *C.sockaddr) int {
|
func C_RTMP_Connect0(r *C_RTMP, service *C.sockaddr) int {
|
||||||
|
@ -505,6 +479,65 @@ func C_RTMP_Connect0(r *C_RTMP, service *C.sockaddr) int {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// int RTMP_Connect1(RTMP* r, RTMPPacket* cp);
|
||||||
|
// rtmp.c +978
|
||||||
|
func C_RTMP_Connect1(r *C_RTMP, cp *C_RTMPPacket) int {
|
||||||
|
if debugMode {
|
||||||
|
log.Println("... connected, handshaking...")
|
||||||
|
}
|
||||||
|
//if C.HandShake(r, 1) == 0 {
|
||||||
|
if C_HandShake(r, 1) == 0 {
|
||||||
|
log.Println("C_RTMP_Connect1: handshake failed!")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if debugMode {
|
||||||
|
log.Println("... handshaked...")
|
||||||
|
}
|
||||||
|
//if C.SendConnectPacket(r, cp) == 0 {
|
||||||
|
if C_SendConnectPacket(r, cp) == 0 {
|
||||||
|
log.Println("RTMP connect failed!")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// int RTMP_Connect(RTMP *r, RTMPPacket* cp);
|
||||||
|
// rtmp.c +1032
|
||||||
|
func C_RTMP_Connect(r *C_RTMP, cp *C_RTMPPacket) int {
|
||||||
|
// TODO: port this
|
||||||
|
var service C.sockaddr_in
|
||||||
|
|
||||||
|
if r.Link.hostname.av_len == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
memset((*byte)(unsafe.Pointer(&service)), 0, int(unsafe.Sizeof(service)))
|
||||||
|
|
||||||
|
// TODO: port this
|
||||||
|
service.sin_family = C.AF_INET
|
||||||
|
|
||||||
|
if r.Link.socksport != 0 {
|
||||||
|
// TODO: port this
|
||||||
|
if C.add_addr_info(&service, (*C.AVal)(unsafe.Pointer(&r.Link.sockshost)), C.int(r.Link.socksport)) == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// connect directly
|
||||||
|
if C.add_addr_info(&service, (*C.AVal)(unsafe.Pointer(&r.Link.hostname)),
|
||||||
|
C.int(r.Link.port)) == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//if C.RTMP_Connect0(r, (*C.sockaddr)(unsafe.Pointer(&service))) == 0 {
|
||||||
|
if C_RTMP_Connect0(r, (*C.sockaddr)(unsafe.Pointer(&service))) == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
r.m_bSendCounter = 1
|
||||||
|
|
||||||
|
return int(C_RTMP_Connect1(r, cp))
|
||||||
|
//return int(C.RTMP_Connect1(r, cp))
|
||||||
|
}
|
||||||
|
|
||||||
// int SocksNegotiate(RTMP* r);
|
// int SocksNegotiate(RTMP* r);
|
||||||
// rtmp.c +1062
|
// rtmp.c +1062
|
||||||
func C_SocksNegotiate(r *C_RTMP) int {
|
func C_SocksNegotiate(r *C_RTMP) int {
|
||||||
|
@ -542,115 +575,6 @@ func C_SocksNegotiate(r *C_RTMP) int {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: find location in c file
|
|
||||||
func SET_RCVTIMEO(tv *int32, s int32) {
|
|
||||||
*tv = s * 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
// int RTMP_Connect1(RTMP* r, RTMPPacket* cp);
|
|
||||||
// rtmp.c +978
|
|
||||||
func C_RTMP_Connect1(r *C_RTMP, cp *C_RTMPPacket) int {
|
|
||||||
if debugMode {
|
|
||||||
log.Println("... connected, handshaking...")
|
|
||||||
}
|
|
||||||
//if C.HandShake(r, 1) == 0 {
|
|
||||||
if C_HandShake(r, 1) == 0 {
|
|
||||||
log.Println("C_RTMP_Connect1: handshake failed!")
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
if debugMode {
|
|
||||||
log.Println("... handshaked...")
|
|
||||||
}
|
|
||||||
//if C.SendConnectPacket(r, cp) == 0 {
|
|
||||||
if C_SendConnectPacket(r, cp) == 0 {
|
|
||||||
log.Println("RTMP connect failed!")
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// int HandShake(RTMP* r, int FP9HandShake);
|
|
||||||
// rtmp.c +3744
|
|
||||||
func C_HandShake(r *C_RTMP, FP9HandShake int32) int {
|
|
||||||
var bMatch int
|
|
||||||
//uptime := uint32(0)
|
|
||||||
//suptime := uint32(0)
|
|
||||||
//typ := byte(0)
|
|
||||||
var uptime, suptime uint32
|
|
||||||
var typ byte
|
|
||||||
//clientbuf := make([]byte, RTMP_SIG_SIZE+1)
|
|
||||||
var clientbuf [RTMP_SIG_SIZE + 1]byte
|
|
||||||
clientsig := (*byte)(incBytePtr(unsafe.Pointer(&clientbuf[0]), 1))
|
|
||||||
//serversig := make([]byte, RTMP_SIG_SIZE)
|
|
||||||
var serversig [RTMP_SIG_SIZE]byte
|
|
||||||
|
|
||||||
clientbuf[0] = 0x03 // not encrypted
|
|
||||||
|
|
||||||
// TODO: port rtmp_getTime
|
|
||||||
//uptime = inet.Htonl(uint32(C.RTMP_GetTime()))
|
|
||||||
uptime = inet.Htonl(uint32(C_RTMP_GetTime()))
|
|
||||||
memmove(unsafe.Pointer(clientsig), unsafe.Pointer(&uptime), 4)
|
|
||||||
|
|
||||||
memset(indxBytePtr(unsafe.Pointer(clientsig), 4), 0, 4)
|
|
||||||
|
|
||||||
for i := 8; i < RTMP_SIG_SIZE; i++ {
|
|
||||||
*indxBytePtr(unsafe.Pointer(clientsig), i) = byte(rand.Intn(256))
|
|
||||||
}
|
|
||||||
|
|
||||||
if C_WriteN(r, unsafe.Pointer(&clientbuf[0]), RTMP_SIG_SIZE+1) == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
//if C.ReadN(r, (*byte)(unsafe.Pointer(&typ)), 1) != 1 {
|
|
||||||
if C_ReadN(r, (*byte)(unsafe.Pointer(&typ)), 1) != 1 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if debugMode {
|
|
||||||
log.Println("C_HandShake: Type answer: %v", typ)
|
|
||||||
}
|
|
||||||
if typ != clientbuf[0] {
|
|
||||||
log.Println("C_HandShake: type mismatch: client sent %v, server sent: %v",
|
|
||||||
clientbuf[0], typ)
|
|
||||||
}
|
|
||||||
if C_ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
|
||||||
//if C.ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// decode server response
|
|
||||||
memmove(unsafe.Pointer(&suptime), unsafe.Pointer(&serversig[0]), 4)
|
|
||||||
suptime = inet.Ntohl(suptime)
|
|
||||||
|
|
||||||
// 2nd part of handshake
|
|
||||||
if C_WriteN(r, unsafe.Pointer(&serversig[0]), RTMP_SIG_SIZE) == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if C_ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
|
||||||
//if C.ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: find golang memcmp
|
|
||||||
bMatch = 0
|
|
||||||
if memcmp(unsafe.Pointer(&serversig[0]), unsafe.Pointer(clientsig),
|
|
||||||
RTMP_SIG_SIZE) == 0 {
|
|
||||||
bMatch = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if bMatch == 0 {
|
|
||||||
log.Println("Client signature does not match!")
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// uint32_t RTMP_GetTime();
|
|
||||||
// rtmp.c +156
|
|
||||||
func C_RTMP_GetTime() int32 {
|
|
||||||
return int32(time.Now().UnixNano() / 1000000)
|
|
||||||
}
|
|
||||||
|
|
||||||
// int ReadN(RTMP* r, char* buffer, int n);
|
// int ReadN(RTMP* r, char* buffer, int n);
|
||||||
// rtmp.c +1390
|
// rtmp.c +1390
|
||||||
func C_ReadN(r *C_RTMP, buffer *byte, n int) int {
|
func C_ReadN(r *C_RTMP, buffer *byte, n int) int {
|
||||||
|
@ -712,61 +636,6 @@ func C_ReadN(r *C_RTMP, buffer *byte, n int) int {
|
||||||
return nOriginalSize - n
|
return nOriginalSize - n
|
||||||
}
|
}
|
||||||
|
|
||||||
// int RTMPSockBuf_Fill(RTMPSockBuf* sb);
|
|
||||||
// rtmp.c +4253
|
|
||||||
func C_RTMPSockBuf_Fill(sb *C_RTMPSockBuf) int {
|
|
||||||
var nBytes int
|
|
||||||
|
|
||||||
if sb.sb_size == 0 {
|
|
||||||
sb.sb_start = &sb.sb_buf[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
nBytes = int(unsafe.Sizeof(sb.sb_buf)) - 1 - int(sb.sb_size) -
|
|
||||||
int(uintptr(unsafe.Pointer(sb.sb_start))-uintptr(unsafe.Pointer(
|
|
||||||
&sb.sb_buf[0])))
|
|
||||||
|
|
||||||
// TODO: figure out what to do with recv
|
|
||||||
nBytes = int(C.recv(C.int(sb.sb_socket), unsafe.Pointer(uintptr(unsafe.Pointer(
|
|
||||||
sb.sb_start))+uintptr(int(sb.sb_size))), C.size_t(nBytes), 0))
|
|
||||||
|
|
||||||
if nBytes != -1 {
|
|
||||||
sb.sb_size += int32(nBytes)
|
|
||||||
} else {
|
|
||||||
log.Println("C_RTMPSockBuf_Fill: recv error!")
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
return nBytes
|
|
||||||
}
|
|
||||||
|
|
||||||
// int SendBytesReceived(RTMP* r);
|
|
||||||
// rtmp.c +2080
|
|
||||||
func C_SendBytesReceived(r *C_RTMP) int {
|
|
||||||
var packet C_RTMPPacket
|
|
||||||
var pbuf [256]byte
|
|
||||||
pend := (*byte)(incBytePtr(unsafe.Pointer(&pbuf[0]), 256))
|
|
||||||
|
|
||||||
packet.m_nChannel = 0x02 /* control channel (invoke) */
|
|
||||||
packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM
|
|
||||||
packet.m_packetType = RTMP_PACKET_TYPE_BYTES_READ_REPORT
|
|
||||||
packet.m_nTimeStamp = 0
|
|
||||||
packet.m_nInfoField2 = 0
|
|
||||||
packet.m_hasAbsTimestamp = 0
|
|
||||||
packet.m_body = (*byte)(incBytePtr(unsafe.Pointer(&pbuf[0]),
|
|
||||||
RTMP_MAX_HEADER_SIZE))
|
|
||||||
|
|
||||||
packet.m_nBodySize = 4
|
|
||||||
|
|
||||||
C_AMF_EncodeInt32((*byte)(unsafe.Pointer(packet.m_body)), pend, int32(r.m_nBytesIn))
|
|
||||||
// C.AMF_EncodeInt32(packet.m_body, (*byte)(unsafe.Pointer(pend)), r.m_nBytesIn)
|
|
||||||
|
|
||||||
r.m_nBytesInSent = r.m_nBytesIn
|
|
||||||
|
|
||||||
//return int(C.RTMP_SendPacket(r, &packet, 0))
|
|
||||||
return C_RTMP_SendPacket(r, &packet, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// int SendConnectPacket(RTMP* r, RTMPPacket* cp);
|
// int SendConnectPacket(RTMP* r, RTMPPacket* cp);
|
||||||
// rtmp.c +1579
|
// rtmp.c +1579
|
||||||
func C_SendConnectPacket(r *C_RTMP, cp *C_RTMPPacket) int {
|
func C_SendConnectPacket(r *C_RTMP, cp *C_RTMPPacket) int {
|
||||||
|
@ -947,6 +816,137 @@ func C_SendConnectPacket(r *C_RTMP, cp *C_RTMPPacket) int {
|
||||||
return C_RTMP_SendPacket(r, &packet, 1)
|
return C_RTMP_SendPacket(r, &packet, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// int SendBytesReceived(RTMP* r);
|
||||||
|
// rtmp.c +2080
|
||||||
|
func C_SendBytesReceived(r *C_RTMP) int {
|
||||||
|
var packet C_RTMPPacket
|
||||||
|
var pbuf [256]byte
|
||||||
|
pend := (*byte)(incBytePtr(unsafe.Pointer(&pbuf[0]), 256))
|
||||||
|
|
||||||
|
packet.m_nChannel = 0x02 /* control channel (invoke) */
|
||||||
|
packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM
|
||||||
|
packet.m_packetType = RTMP_PACKET_TYPE_BYTES_READ_REPORT
|
||||||
|
packet.m_nTimeStamp = 0
|
||||||
|
packet.m_nInfoField2 = 0
|
||||||
|
packet.m_hasAbsTimestamp = 0
|
||||||
|
packet.m_body = (*byte)(incBytePtr(unsafe.Pointer(&pbuf[0]),
|
||||||
|
RTMP_MAX_HEADER_SIZE))
|
||||||
|
|
||||||
|
packet.m_nBodySize = 4
|
||||||
|
|
||||||
|
C_AMF_EncodeInt32((*byte)(unsafe.Pointer(packet.m_body)), pend, int32(r.m_nBytesIn))
|
||||||
|
// C.AMF_EncodeInt32(packet.m_body, (*byte)(unsafe.Pointer(pend)), r.m_nBytesIn)
|
||||||
|
|
||||||
|
r.m_nBytesInSent = r.m_nBytesIn
|
||||||
|
|
||||||
|
//return int(C.RTMP_SendPacket(r, &packet, 0))
|
||||||
|
return C_RTMP_SendPacket(r, &packet, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// int HandShake(RTMP* r, int FP9HandShake);
|
||||||
|
// rtmp.c +3744
|
||||||
|
func C_HandShake(r *C_RTMP, FP9HandShake int32) int {
|
||||||
|
var bMatch int
|
||||||
|
//uptime := uint32(0)
|
||||||
|
//suptime := uint32(0)
|
||||||
|
//typ := byte(0)
|
||||||
|
var uptime, suptime uint32
|
||||||
|
var typ byte
|
||||||
|
//clientbuf := make([]byte, RTMP_SIG_SIZE+1)
|
||||||
|
var clientbuf [RTMP_SIG_SIZE + 1]byte
|
||||||
|
clientsig := (*byte)(incBytePtr(unsafe.Pointer(&clientbuf[0]), 1))
|
||||||
|
//serversig := make([]byte, RTMP_SIG_SIZE)
|
||||||
|
var serversig [RTMP_SIG_SIZE]byte
|
||||||
|
|
||||||
|
clientbuf[0] = 0x03 // not encrypted
|
||||||
|
|
||||||
|
// TODO: port rtmp_getTime
|
||||||
|
//uptime = inet.Htonl(uint32(C.RTMP_GetTime()))
|
||||||
|
uptime = inet.Htonl(uint32(C_RTMP_GetTime()))
|
||||||
|
memmove(unsafe.Pointer(clientsig), unsafe.Pointer(&uptime), 4)
|
||||||
|
|
||||||
|
memset(indxBytePtr(unsafe.Pointer(clientsig), 4), 0, 4)
|
||||||
|
|
||||||
|
for i := 8; i < RTMP_SIG_SIZE; i++ {
|
||||||
|
*indxBytePtr(unsafe.Pointer(clientsig), i) = byte(rand.Intn(256))
|
||||||
|
}
|
||||||
|
|
||||||
|
if C_WriteN(r, unsafe.Pointer(&clientbuf[0]), RTMP_SIG_SIZE+1) == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//if C.ReadN(r, (*byte)(unsafe.Pointer(&typ)), 1) != 1 {
|
||||||
|
if C_ReadN(r, (*byte)(unsafe.Pointer(&typ)), 1) != 1 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if debugMode {
|
||||||
|
log.Println("C_HandShake: Type answer: %v", typ)
|
||||||
|
}
|
||||||
|
if typ != clientbuf[0] {
|
||||||
|
log.Println("C_HandShake: type mismatch: client sent %v, server sent: %v",
|
||||||
|
clientbuf[0], typ)
|
||||||
|
}
|
||||||
|
if C_ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
||||||
|
//if C.ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// decode server response
|
||||||
|
memmove(unsafe.Pointer(&suptime), unsafe.Pointer(&serversig[0]), 4)
|
||||||
|
suptime = inet.Ntohl(suptime)
|
||||||
|
|
||||||
|
// 2nd part of handshake
|
||||||
|
if C_WriteN(r, unsafe.Pointer(&serversig[0]), RTMP_SIG_SIZE) == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if C_ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
||||||
|
//if C.ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: find golang memcmp
|
||||||
|
bMatch = 0
|
||||||
|
if memcmp(unsafe.Pointer(&serversig[0]), unsafe.Pointer(clientsig),
|
||||||
|
RTMP_SIG_SIZE) == 0 {
|
||||||
|
bMatch = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if bMatch == 0 {
|
||||||
|
log.Println("Client signature does not match!")
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// int RTMPSockBuf_Fill(RTMPSockBuf* sb);
|
||||||
|
// rtmp.c +4253
|
||||||
|
func C_RTMPSockBuf_Fill(sb *C_RTMPSockBuf) int {
|
||||||
|
var nBytes int
|
||||||
|
|
||||||
|
if sb.sb_size == 0 {
|
||||||
|
sb.sb_start = &sb.sb_buf[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
nBytes = int(unsafe.Sizeof(sb.sb_buf)) - 1 - int(sb.sb_size) -
|
||||||
|
int(uintptr(unsafe.Pointer(sb.sb_start))-uintptr(unsafe.Pointer(
|
||||||
|
&sb.sb_buf[0])))
|
||||||
|
|
||||||
|
// TODO: figure out what to do with recv
|
||||||
|
nBytes = int(C.recv(C.int(sb.sb_socket), unsafe.Pointer(uintptr(unsafe.Pointer(
|
||||||
|
sb.sb_start))+uintptr(int(sb.sb_size))), C.size_t(nBytes), 0))
|
||||||
|
|
||||||
|
if nBytes != -1 {
|
||||||
|
sb.sb_size += int32(nBytes)
|
||||||
|
} else {
|
||||||
|
log.Println("C_RTMPSockBuf_Fill: recv error!")
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return nBytes
|
||||||
|
}
|
||||||
|
|
||||||
// int RTMP_ConnectStream(RTMP* r, int seekTime);
|
// int RTMP_ConnectStream(RTMP* r, int seekTime);
|
||||||
// rtmp.c +1099
|
// rtmp.c +1099
|
||||||
func C_RTMP_ConnectStream(r *C_RTMP, seekTime int32) int {
|
func C_RTMP_ConnectStream(r *C_RTMP, seekTime int32) int {
|
||||||
|
|
Loading…
Reference in New Issue