mirror of https://bitbucket.org/ausocean/av.git
rtmp: make C_ReadN take a []byte
This commit is contained in:
parent
5f3f50373b
commit
eeb1e1933b
57
rtmp/rtmp.go
57
rtmp/rtmp.go
|
@ -469,7 +469,7 @@ func C_SocksNegotiate(r *C_RTMP) (ok bool) {
|
||||||
|
|
||||||
C_WriteN(r, packet)
|
C_WriteN(r, packet)
|
||||||
|
|
||||||
if C_ReadN(r, &packet[0], 8) != 8 {
|
if C_ReadN(r, packet[:8]) != 8 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,20 +580,15 @@ func C_RTMP_ClientPacket(r *C_RTMP, packet *C_RTMPPacket) int32 {
|
||||||
|
|
||||||
// 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, buf []byte) int {
|
||||||
nOriginalSize := n
|
nOriginalSize := len(buf)
|
||||||
var avail int
|
|
||||||
var ptr *byte
|
|
||||||
|
|
||||||
r.m_sb.sb_timedout = false
|
r.m_sb.sb_timedout = false
|
||||||
|
|
||||||
ptr = buffer
|
for len(buf) != 0 {
|
||||||
|
|
||||||
for n > 0 {
|
|
||||||
nBytes := 0
|
nBytes := 0
|
||||||
var nRead int
|
var nRead int
|
||||||
|
|
||||||
avail = int(r.m_sb.sb_size)
|
avail := int(r.m_sb.sb_size)
|
||||||
if avail == 0 {
|
if avail == 0 {
|
||||||
if C_RTMPSockBuf_Fill(&r.m_sb) < 1 {
|
if C_RTMPSockBuf_Fill(&r.m_sb) < 1 {
|
||||||
if !r.m_sb.sb_timedout {
|
if !r.m_sb.sb_timedout {
|
||||||
|
@ -603,14 +598,14 @@ func C_ReadN(r *C_RTMP, buffer *byte, n int) int {
|
||||||
avail = int(r.m_sb.sb_size)
|
avail = int(r.m_sb.sb_size)
|
||||||
}
|
}
|
||||||
|
|
||||||
if n < avail {
|
if len(buf) < avail {
|
||||||
nRead = n
|
nRead = len(buf)
|
||||||
} else {
|
} else {
|
||||||
nRead = avail
|
nRead = avail
|
||||||
}
|
}
|
||||||
|
|
||||||
if nRead > 0 {
|
if nRead > 0 {
|
||||||
memmove(unsafe.Pointer(ptr), unsafe.Pointer(&r.m_sb.sb_buf[r.m_sb.sb_start]), uintptr(nRead))
|
copy(buf, r.m_sb.sb_buf[r.m_sb.sb_start:][:nRead])
|
||||||
r.m_sb.sb_start += nRead
|
r.m_sb.sb_start += nRead
|
||||||
r.m_sb.sb_size -= nRead
|
r.m_sb.sb_size -= nRead
|
||||||
nBytes = nRead
|
nBytes = nRead
|
||||||
|
@ -628,11 +623,10 @@ func C_ReadN(r *C_RTMP, buffer *byte, n int) int {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
n -= nBytes
|
buf = buf[nBytes:]
|
||||||
ptr = (*byte)(incBytePtr(unsafe.Pointer(ptr), nBytes))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nOriginalSize - n
|
return nOriginalSize - len(buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
// int WriteN(RTMP* r, const char* buffer, int n);
|
// int WriteN(RTMP* r, const char* buffer, int n);
|
||||||
|
@ -1257,13 +1251,13 @@ func C_EncodeInt32LE(dst []byte, v int32) int32 {
|
||||||
// int RTMP_ReadPacket(RTMP* r, RTMPPacket* packet);
|
// int RTMP_ReadPacket(RTMP* r, RTMPPacket* packet);
|
||||||
// rtmp.c +3550
|
// rtmp.c +3550
|
||||||
func C_RTMP_ReadPacket(r *C_RTMP, packet *C_RTMPPacket) (ok bool) {
|
func C_RTMP_ReadPacket(r *C_RTMP, packet *C_RTMPPacket) (ok bool) {
|
||||||
var hbuf [RTMP_MAX_HEADER_SIZE]uint8
|
var hbuf [RTMP_MAX_HEADER_SIZE]byte
|
||||||
var header *byte
|
var header *byte
|
||||||
header = (*byte)(unsafe.Pointer(&hbuf[0]))
|
header = (*byte)(unsafe.Pointer(&hbuf[0]))
|
||||||
var nSize, hSize, nToRead, nChunk int32
|
var nSize, hSize, nToRead, nChunk int32
|
||||||
var extendedTimestamp int32
|
var extendedTimestamp int32
|
||||||
|
|
||||||
if C_ReadN(r, &hbuf[0], 1) == 0 {
|
if C_ReadN(r, hbuf[:1]) != 1 {
|
||||||
log.Println("C_RTMP_ReadPacket: failed to read RTMP packet header!")
|
log.Println("C_RTMP_ReadPacket: failed to read RTMP packet header!")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -1274,7 +1268,7 @@ func C_RTMP_ReadPacket(r *C_RTMP, packet *C_RTMPPacket) (ok bool) {
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case packet.m_nChannel == 0:
|
case packet.m_nChannel == 0:
|
||||||
if C_ReadN(r, &hbuf[1], 1) != 1 {
|
if C_ReadN(r, hbuf[1:2]) != 1 {
|
||||||
log.Println("C_RTMP_ReadPacket: failed to read rtmp packet header 2nd byte.")
|
log.Println("C_RTMP_ReadPacket: failed to read rtmp packet header 2nd byte.")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -1283,14 +1277,12 @@ func C_RTMP_ReadPacket(r *C_RTMP, packet *C_RTMPPacket) (ok bool) {
|
||||||
packet.m_nChannel += 64
|
packet.m_nChannel += 64
|
||||||
header = (*byte)(incBytePtr(unsafe.Pointer(header), 1))
|
header = (*byte)(incBytePtr(unsafe.Pointer(header), 1))
|
||||||
case packet.m_nChannel == 1:
|
case packet.m_nChannel == 1:
|
||||||
var tmp int32
|
if C_ReadN(r, hbuf[1:3]) != 2 {
|
||||||
|
|
||||||
if C_ReadN(r, &hbuf[1], 2) != 2 {
|
|
||||||
log.Println("C_RTMP_ReadPacket: failed to read RTMP packet 3rd byte")
|
log.Println("C_RTMP_ReadPacket: failed to read RTMP packet 3rd byte")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = int32((hbuf[2] << 8) + hbuf[1])
|
tmp := int32((hbuf[2] << 8) + hbuf[1])
|
||||||
packet.m_nChannel = tmp + 64
|
packet.m_nChannel = tmp + 64
|
||||||
header = (*byte)(incBytePtr(unsafe.Pointer(header), 2))
|
header = (*byte)(incBytePtr(unsafe.Pointer(header), 2))
|
||||||
}
|
}
|
||||||
|
@ -1331,7 +1323,7 @@ func C_RTMP_ReadPacket(r *C_RTMP, packet *C_RTMPPacket) (ok bool) {
|
||||||
|
|
||||||
nSize--
|
nSize--
|
||||||
|
|
||||||
if nSize > 0 && C_ReadN(r, header, int(nSize)) != int(nSize) {
|
if nSize > 0 && C_ReadN(r, pl2b(header, int(nSize))) != int(nSize) {
|
||||||
log.Println("C_RTMP_ReadPacket: failed to read rtmp packet header.")
|
log.Println("C_RTMP_ReadPacket: failed to read rtmp packet header.")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -1361,7 +1353,7 @@ func C_RTMP_ReadPacket(r *C_RTMP, packet *C_RTMPPacket) (ok bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if extendedTimestamp != 0 {
|
if extendedTimestamp != 0 {
|
||||||
if C_ReadN(r, (*byte)(incBytePtr(unsafe.Pointer(header), int(nSize))), 4) != 4 {
|
if C_ReadN(r, pl2b((*byte)(incBytePtr(unsafe.Pointer(header), int(nSize))), 4)) != 4 {
|
||||||
log.Println("RTMPRead_Packet: Failed to read extended timestamp")
|
log.Println("RTMPRead_Packet: Failed to read extended timestamp")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -1392,8 +1384,7 @@ func C_RTMP_ReadPacket(r *C_RTMP, packet *C_RTMPPacket) (ok bool) {
|
||||||
packet.m_chunk.c_chunk = (*[_Gi]byte)(unsafe.Pointer(packet.m_body))[packet.m_nBytesRead : packet.m_nBytesRead+uint32(nChunk)]
|
packet.m_chunk.c_chunk = (*[_Gi]byte)(unsafe.Pointer(packet.m_body))[packet.m_nBytesRead : packet.m_nBytesRead+uint32(nChunk)]
|
||||||
}
|
}
|
||||||
|
|
||||||
if C_ReadN(r, (*byte)(incBytePtr(unsafe.Pointer(packet.m_body), int(packet.m_nBytesRead))),
|
if C_ReadN(r, pl2b((*byte)(incBytePtr(unsafe.Pointer(packet.m_body), int(packet.m_nBytesRead))), int(nChunk))) != int(nChunk) {
|
||||||
int(nChunk)) != int(nChunk) {
|
|
||||||
log.Println("C_RTMP_ReadPacket: failed to read RTMP packet body")
|
log.Println("C_RTMP_ReadPacket: failed to read RTMP packet body")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -1431,7 +1422,7 @@ func C_RTMP_ReadPacket(r *C_RTMP, packet *C_RTMPPacket) (ok bool) {
|
||||||
// rtmp.c +3744
|
// rtmp.c +3744
|
||||||
func C_HandShake(r *C_RTMP, FP9HandShake int32) (ok bool) {
|
func C_HandShake(r *C_RTMP, FP9HandShake int32) (ok bool) {
|
||||||
var uptime, suptime uint32
|
var uptime, suptime uint32
|
||||||
var typ byte
|
var typ [1]byte
|
||||||
//clientbuf := make([]byte, RTMP_SIG_SIZE+1)
|
//clientbuf := make([]byte, RTMP_SIG_SIZE+1)
|
||||||
var clientbuf [RTMP_SIG_SIZE + 1]byte
|
var clientbuf [RTMP_SIG_SIZE + 1]byte
|
||||||
clientsig := (*byte)(incBytePtr(unsafe.Pointer(&clientbuf[0]), 1))
|
clientsig := (*byte)(incBytePtr(unsafe.Pointer(&clientbuf[0]), 1))
|
||||||
|
@ -1454,18 +1445,18 @@ func C_HandShake(r *C_RTMP, FP9HandShake int32) (ok bool) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if C_ReadN(r, (*byte)(unsafe.Pointer(&typ)), 1) != 1 {
|
if C_ReadN(r, typ[:]) != 1 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if debugMode {
|
if debugMode {
|
||||||
log.Printf("C_HandShake: Type answer: %v\n", typ)
|
log.Printf("C_HandShake: Type answer: %v\n", typ[0])
|
||||||
}
|
}
|
||||||
if typ != clientbuf[0] {
|
if typ[0] != clientbuf[0] {
|
||||||
log.Printf("C_HandShake: type mismatch: client sent %v, server sent: %v\n",
|
log.Printf("C_HandShake: type mismatch: client sent %v, server sent: %v\n",
|
||||||
clientbuf[0], typ)
|
clientbuf[0], typ)
|
||||||
}
|
}
|
||||||
if C_ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
if C_ReadN(r, serversig[:]) != RTMP_SIG_SIZE {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1478,7 +1469,7 @@ func C_HandShake(r *C_RTMP, FP9HandShake int32) (ok bool) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if C_ReadN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
if C_ReadN(r, serversig[:]) != RTMP_SIG_SIZE {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue