mirror of https://bitbucket.org/ausocean/av.git
Updating c stuff
This commit is contained in:
parent
7f6d377cb1
commit
1a8aeace34
146
rtmp/rtmp.go
146
rtmp/rtmp.go
|
@ -161,6 +161,8 @@ const (
|
||||||
const (
|
const (
|
||||||
minDataSize = 11
|
minDataSize = 11
|
||||||
debugMode = false
|
debugMode = false
|
||||||
|
TRUE = 1
|
||||||
|
FALSE = 0
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -781,8 +783,8 @@ func handShake(r *C.RTMP, FP9HandShake int32) int {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if C.ReadN(r, (*C.char)(unsafe.Pointer(&typ)), 1) != 1 {
|
//if C.ReadN(r, (*C.char)(unsafe.Pointer(&typ)), 1) != 1 {
|
||||||
//if readN(r, (*byte)(unsafe.Pointer(&typ)), 1) != 1 {
|
if readN(r, (*byte)(unsafe.Pointer(&typ)), 1) != 1 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -807,8 +809,8 @@ func handShake(r *C.RTMP, FP9HandShake int32) int {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
//if readN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
if readN(r, (*byte)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
||||||
if C.ReadN(r, (*C.char)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
//if C.ReadN(r, (*C.char)(unsafe.Pointer(&serversig[0])), RTMP_SIG_SIZE) != RTMP_SIG_SIZE {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -931,7 +933,8 @@ func sendBytesReceived(r *C.RTMP) int {
|
||||||
|
|
||||||
r.m_nBytesInSent = r.m_nBytesIn
|
r.m_nBytesInSent = r.m_nBytesIn
|
||||||
|
|
||||||
return int(C.RTMP_SendPacket(r, &packet, 0))
|
//return int(C.RTMP_SendPacket(r, &packet, 0))
|
||||||
|
return rtmpSendPacket(r, &packet, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendConnectPacket(r *C.RTMP, cp *C.RTMPPacket) int {
|
func sendConnectPacket(r *C.RTMP, cp *C.RTMPPacket) int {
|
||||||
|
@ -1286,6 +1289,139 @@ func rtmpConnectStream(r *C.RTMP, seekTime int32) int {
|
||||||
return int(r.m_bPlaying)
|
return int(r.m_bPlaying)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func rtmpReadPacket(r *C.RTMP, packet *C.RTMPPacket) int32 {
|
||||||
|
var hbuf [RTMP_MAX_HEADER_SIZE]uint8
|
||||||
|
memset((*byte)(hbuf), RTMP_MAX_HEADER_SIZE)
|
||||||
|
var header *byte
|
||||||
|
header = (*byte)(unsafe.Pointer(&hbuf[0]))
|
||||||
|
var nSize, hSize, nToRead, nChunk int32
|
||||||
|
var didAlloc int32 = 0
|
||||||
|
var extendedTimestamp int32
|
||||||
|
|
||||||
|
if readN(r, (*byte)(&hbuf[0]), 1) == 0 {
|
||||||
|
log.Println("rtmpReadPacket: failed to read RTMP packet header!")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
packet.m_headerType = C.int((hbuf[0] & 0xc0) >> 6)
|
||||||
|
packet.m_Channel = C.int(hbuf[0] & 0x3f)
|
||||||
|
header = (*byte)(incBytePtr(unsafe.Pointer(header), 1))
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case packet.m_nChannel == 0:
|
||||||
|
if readN(r, (*byte)(&hbuf[1]), 1) != 1 {
|
||||||
|
log.Println("rtmpReadPacket: failed to read rtmp packet header 2nd byte.")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
packet.m_nChannel = hbuf[1]
|
||||||
|
packet.m_nChannel += 64
|
||||||
|
header = (*byte)(incBytePtr(unsafe.Pointer(header), 1))
|
||||||
|
case packet.m_nChannel == 1:
|
||||||
|
var tmp int32
|
||||||
|
|
||||||
|
if readN(r, (*byte)(&hubf[1]), 2) != 2 {
|
||||||
|
log.Println("rtmpReadPacket: failed to read RTMP packet 3rd byte")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = (hbuf[2] << 8) + hbuf[1]
|
||||||
|
packet.m_nChannel = C.int(tmp + 64)
|
||||||
|
header = (*byte)(incBytePtr(unsafe.Pointer(header), 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
nSize = packetSize[packet.m_headerType]
|
||||||
|
|
||||||
|
if packet.m_nChannel >= r.m_channelsAllocatedIn {
|
||||||
|
var n int32 = packet.m_nChannel + 10
|
||||||
|
timestamp := (*int32)(C.realloc(r.m_channelTimestamp, unsafe.Sizeof(n)*n))
|
||||||
|
var packets **C.RTMPPacket = (**C.RTMPPacket)(C.realloc(r.m_vecChannelsIn, unsafe.Sizeof(*packets)*n))
|
||||||
|
if timestamp == nil {
|
||||||
|
C.free(r.m_channelTimestamp)
|
||||||
|
}
|
||||||
|
|
||||||
|
if packets == nil {
|
||||||
|
C.free(r.m_vecChannelsIn)
|
||||||
|
}
|
||||||
|
|
||||||
|
r.m_channelTimestamp = timestamp
|
||||||
|
r.m_vecChannelsIn = packets
|
||||||
|
|
||||||
|
if timestamp == nil || packets == nil {
|
||||||
|
r.m_channelsAllocatedInt = 0
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(r.m_channelTimestamp+r.m_channelsAllocatedInt, 0, int32Size*(n-
|
||||||
|
r.m_channelsAllocatedIn))
|
||||||
|
memset(incPtr(unsafe.Pointer(r.m_vecChannelsIn), int(uintptr(unsafe.Pointer(
|
||||||
|
r.m_channelsAllocatedIn))), unsafe.Sizeof(*r.m_vecChannelsIn)), 0,
|
||||||
|
unsafe.Sizeof(*packets)*(n-r.m_channelsAllocatedIn))
|
||||||
|
r.m_channelsAllocatedIn = n
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case nSize == RTMP_LARGE_HEADER_SIZE:
|
||||||
|
packet.m_hasAbsTimestamp = 1
|
||||||
|
case nSize < RTMP_LARGE_HEADER_SIZE:
|
||||||
|
if r.m_vecChannelsIn[packet.m_nChannel] != nil {
|
||||||
|
memmove(unsafe.Pointer(packet), unsafe.Pointer(
|
||||||
|
r.m_vecChannelsIn[packet.m_nChannel]), unsafe.Sizeof(**packets))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nSize--
|
||||||
|
|
||||||
|
if nSize > 0 && readN(r, header, nSize) != nSize {
|
||||||
|
log.Println("rtmpReadPacket: failed to read rtmp packet header.")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
hSize = nSize + decBytePtr(unsafe.Pointer(header), int(uintptr(
|
||||||
|
unsafe.Pointer(&hbuf[0]))))
|
||||||
|
|
||||||
|
if nSize >= 3 {
|
||||||
|
packet.m_nTimeStamp = amfDecodeInt24(header)
|
||||||
|
|
||||||
|
if nSize >= 6 {
|
||||||
|
packet.m_nBodySize = amfDecodeInt24((*byte)(incBytePtr(unsafe.Pointer(header), 3)))
|
||||||
|
packet.m_nBytesRead = 0
|
||||||
|
|
||||||
|
if nSize > 6 {
|
||||||
|
packet.m_packetType = C.char(*indxBytePtr(unsafe.Pointer(header), 6))
|
||||||
|
|
||||||
|
if nSize == 11 {
|
||||||
|
// TODO: port this
|
||||||
|
packet.m_nInfoField2 = C.DecodeInt32LE((*C.char)(incBytePtr(unsafe.Pointer(header), 7)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extendedTimestamp = 0
|
||||||
|
if packet.m_nTimeStamp == 0xffffff {
|
||||||
|
extendedTimestamp = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if extendedTimestamp != 0 {
|
||||||
|
if readN(r, (*byte)(incBytePtr(unsafe.Pointer(header), nSize)), 4) != 4 {
|
||||||
|
log.Println("RTMPRead_Packet: Failed to read extended timestamp")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
// TODO: port this
|
||||||
|
packet.m_nTimeStamp = amfDecodeInt32((*C.char)(incBytePtr(unsafe.Pointer(header), nSize)))
|
||||||
|
hSize += 4
|
||||||
|
}
|
||||||
|
|
||||||
|
if packet.m_nBodySize > 0 && packet.m_body == nil {
|
||||||
|
// TODO: port this
|
||||||
|
if C.RTMPPacket_Alloc(packet, packet.m_nBodySize) == 0 {
|
||||||
|
log.Println("RTMPRead_Packet: failed to allocate packet")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
didAlloc = TRUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func rtmpPacketIsReady(p *C.RTMPPacket) int {
|
func rtmpPacketIsReady(p *C.RTMPPacket) int {
|
||||||
if p.m_nBytesRead == p.m_nBodySize {
|
if p.m_nBytesRead == p.m_nBodySize {
|
||||||
return 1
|
return 1
|
||||||
|
|
|
@ -3523,7 +3523,7 @@ HandleClientBW(RTMP *r, const RTMPPacket *packet)
|
||||||
r->m_nClientBW2);
|
r->m_nClientBW2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
DecodeInt32LE(const char *data)
|
DecodeInt32LE(const char *data)
|
||||||
{
|
{
|
||||||
unsigned char *c = (unsigned char *)data;
|
unsigned char *c = (unsigned char *)data;
|
||||||
|
|
|
@ -299,6 +299,8 @@ extern "C"
|
||||||
|
|
||||||
int HandShake(RTMP *r, int FP9HandShake);
|
int HandShake(RTMP *r, int FP9HandShake);
|
||||||
|
|
||||||
|
int DecodeInt32LE(const char *data);
|
||||||
|
|
||||||
int SendBytesReceived(RTMP *r);
|
int SendBytesReceived(RTMP *r);
|
||||||
|
|
||||||
int SendConnectPacket(RTMP *r, RTMPPacket *cp);
|
int SendConnectPacket(RTMP *r, RTMPPacket *cp);
|
||||||
|
|
Loading…
Reference in New Issue