mirror of https://bitbucket.org/ausocean/av.git
Use Go errors for C_RTMP_ParseURL, C_RTMP_SetupURL, C_RTMP_Connect1, and C_RTMP_ConnectStream.
This commit is contained in:
parent
8381d1b1e8
commit
e173153ca6
|
@ -42,11 +42,11 @@ import (
|
||||||
|
|
||||||
// int RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port, AVal *playpath, AVal *app);
|
// int RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port, AVal *playpath, AVal *app);
|
||||||
// parseurl.c +33
|
// parseurl.c +33
|
||||||
func C_RTMP_ParseURL(addr string) (protocol int32, host string, port uint16, app, playpath string, ok bool) {
|
func C_RTMP_ParseURL(addr string) (protocol int32, host string, port uint16, app, playpath string, err error) {
|
||||||
u, err := url.Parse(addr)
|
u, err := url.Parse(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("failed to parse addr: %v", err)
|
log.Printf("failed to parse addr: %v", err)
|
||||||
return protocol, host, port, app, playpath, false
|
return protocol, host, port, app, playpath, err
|
||||||
}
|
}
|
||||||
|
|
||||||
switch u.Scheme {
|
switch u.Scheme {
|
||||||
|
@ -66,20 +66,20 @@ func C_RTMP_ParseURL(addr string) (protocol int32, host string, port uint16, app
|
||||||
protocol = RTMP_PROTOCOL_RTMPTS
|
protocol = RTMP_PROTOCOL_RTMPTS
|
||||||
default:
|
default:
|
||||||
log.Printf("unknown scheme: %q", u.Scheme)
|
log.Printf("unknown scheme: %q", u.Scheme)
|
||||||
return protocol, host, port, app, playpath, false
|
return protocol, host, port, app, playpath, errUnknownScheme
|
||||||
}
|
}
|
||||||
|
|
||||||
host = u.Host
|
host = u.Host
|
||||||
if p := u.Port(); p != "" {
|
if p := u.Port(); p != "" {
|
||||||
pi, err := strconv.Atoi(p)
|
pi, err := strconv.Atoi(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return protocol, host, port, app, playpath, false
|
return protocol, host, port, app, playpath, err
|
||||||
}
|
}
|
||||||
port = uint16(pi)
|
port = uint16(pi)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !path.IsAbs(u.Path) {
|
if !path.IsAbs(u.Path) {
|
||||||
return protocol, host, port, app, playpath, true
|
return protocol, host, port, app, playpath, nil
|
||||||
}
|
}
|
||||||
elems := strings.SplitN(u.Path[1:], "/", 3)
|
elems := strings.SplitN(u.Path[1:], "/", 3)
|
||||||
app = elems[0]
|
app = elems[0]
|
||||||
|
@ -99,5 +99,5 @@ func C_RTMP_ParseURL(addr string) (protocol int32, host string, port uint16, app
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return protocol, host, port, app, playpath, true
|
return protocol, host, port, app, playpath, nil
|
||||||
}
|
}
|
||||||
|
|
50
rtmp/rtmp.go
50
rtmp/rtmp.go
|
@ -128,31 +128,39 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
errUnknownScheme = errors.New("Unknown scheme")
|
||||||
|
errHandshake = errors.New("Handshake failed")
|
||||||
|
errConnSend = errors.New("Connection send error")
|
||||||
|
errConnStream = errors.New("Connection stream error")
|
||||||
|
)
|
||||||
|
|
||||||
func startSession(rtmp *C_RTMP, u string, timeout uint32) (*C_RTMP, error) {
|
func startSession(rtmp *C_RTMP, u string, timeout uint32) (*C_RTMP, error) {
|
||||||
connect_timeout := int32(timeout)
|
connect_timeout := int32(timeout)
|
||||||
rtmp = C_RTMP_Alloc()
|
rtmp = C_RTMP_Alloc()
|
||||||
C_RTMP_Init(rtmp)
|
C_RTMP_Init(rtmp)
|
||||||
rtmp.Link.timeout = connect_timeout
|
rtmp.Link.timeout = connect_timeout
|
||||||
if !C_RTMP_SetupURL(rtmp, u) {
|
err := C_RTMP_SetupURL(rtmp, u)
|
||||||
|
if err != nil {
|
||||||
C_RTMP_Close(rtmp)
|
C_RTMP_Close(rtmp)
|
||||||
//C.RTMP_Free(rtmp)
|
//C.RTMP_Free(rtmp)
|
||||||
return nil, errors.New("rtmp startSession: Failed to setup URL!")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
C_RTMP_EnableWrite(rtmp)
|
C_RTMP_EnableWrite(rtmp)
|
||||||
C_RTMP_SetBufferMS(rtmp, 3600*1000)
|
C_RTMP_SetBufferMS(rtmp, 3600*1000)
|
||||||
err := C_RTMP_Connect(rtmp, nil)
|
err = C_RTMP_Connect(rtmp, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
C_RTMP_Close(rtmp)
|
C_RTMP_Close(rtmp)
|
||||||
//C.RTMP_Free(rtmp)
|
//C.RTMP_Free(rtmp)
|
||||||
return nil, errors.New("rtmp startSession: Failed to connect with error: " + err.Error())
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: port this
|
err = C_RTMP_ConnectStream(rtmp, 0)
|
||||||
if !C_RTMP_ConnectStream(rtmp, 0) {
|
if err != nil {
|
||||||
C_RTMP_Close(rtmp)
|
C_RTMP_Close(rtmp)
|
||||||
//C.RTMP_Free(rtmp)
|
//C.RTMP_Free(rtmp)
|
||||||
return nil, errors.New("rtmp startSession: Failed to connect stream!")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return rtmp, nil
|
return rtmp, nil
|
||||||
|
@ -242,10 +250,10 @@ func C_RTMP_SetBufferMS(r *C_RTMP, size int32) {
|
||||||
// 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
|
||||||
func C_RTMP_SetupURL(r *C_RTMP, addr string) (ok bool) {
|
func C_RTMP_SetupURL(r *C_RTMP, addr string) (err error) {
|
||||||
r.Link.protocol, r.Link.host, r.Link.port, r.Link.app, r.Link.playpath0, ok = C_RTMP_ParseURL(addr)
|
r.Link.protocol, r.Link.host, r.Link.port, r.Link.app, r.Link.playpath0, err = C_RTMP_ParseURL(addr)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return false
|
return nil
|
||||||
}
|
}
|
||||||
r.Link.playpath = r.Link.playpath0
|
r.Link.playpath = r.Link.playpath0
|
||||||
|
|
||||||
|
@ -269,32 +277,33 @@ func C_RTMP_SetupURL(r *C_RTMP, addr string) (ok bool) {
|
||||||
r.Link.port = 1935
|
r.Link.port = 1935
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// int RTMP_Connect1(RTMP* r, RTMPPacket* cp);
|
// int RTMP_Connect1(RTMP* r, RTMPPacket* cp);
|
||||||
// rtmp.c +978
|
// rtmp.c +978
|
||||||
func C_RTMP_Connect1(r *C_RTMP, cp *C_RTMPPacket) (ok bool) {
|
func C_RTMP_Connect1(r *C_RTMP, cp *C_RTMPPacket) error {
|
||||||
if debugMode {
|
if debugMode {
|
||||||
log.Println("... connected, handshaking...")
|
log.Println("... connected, handshaking...")
|
||||||
}
|
}
|
||||||
if !C_HandShake(r, 1) {
|
if !C_HandShake(r, 1) {
|
||||||
log.Println("C_RTMP_Connect1: handshake failed!")
|
log.Println("C_RTMP_Connect1: handshake failed!")
|
||||||
return false
|
return errHandshake
|
||||||
}
|
}
|
||||||
if debugMode {
|
if debugMode {
|
||||||
log.Println("... handshaked...")
|
log.Println("... handshaked...")
|
||||||
}
|
}
|
||||||
if !C_SendConnectPacket(r, cp) {
|
if !C_SendConnectPacket(r, cp) {
|
||||||
log.Println("RTMP connect failed!")
|
log.Println("RTMP connect failed!")
|
||||||
return false
|
return errConnSend
|
||||||
}
|
}
|
||||||
return true
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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) (playing bool) {
|
// Side effects: r.m_bPlaying is set true upon successful connection
|
||||||
|
func C_RTMP_ConnectStream(r *C_RTMP, seekTime int32) error {
|
||||||
var packet C_RTMPPacket
|
var packet C_RTMPPacket
|
||||||
|
|
||||||
if seekTime > 0 {
|
if seekTime > 0 {
|
||||||
|
@ -323,7 +332,11 @@ func C_RTMP_ConnectStream(r *C_RTMP, seekTime int32) (playing bool) {
|
||||||
C_RTMPPacket_Free(&packet)
|
C_RTMPPacket_Free(&packet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return r.m_bPlaying
|
|
||||||
|
if !r.m_bPlaying {
|
||||||
|
return errConnStream
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// int RTMP_ClientPacket()
|
// int RTMP_ClientPacket()
|
||||||
|
@ -836,6 +849,7 @@ func C_AV_erase(m []C_RTMP_METHOD, i int) []C_RTMP_METHOD {
|
||||||
|
|
||||||
// int HandleInvoke(RTMP* r, const char* body, unsigned int nBodySize);
|
// int HandleInvoke(RTMP* r, const char* body, unsigned int nBodySize);
|
||||||
// rtmp.c +2912
|
// rtmp.c +2912
|
||||||
|
// Side effects: r.m_bPlaying set to true upon av_NetStream_Publish_Start
|
||||||
func C_HandleInvoke(r *C_RTMP, body []byte) (ok bool) {
|
func C_HandleInvoke(r *C_RTMP, body []byte) (ok bool) {
|
||||||
if body[0] != 0x02 {
|
if body[0] != 0x02 {
|
||||||
// TODO use new logger here
|
// TODO use new logger here
|
||||||
|
|
|
@ -55,10 +55,7 @@ func C_RTMP_Connect(r *C_RTMP, cp *C_RTMPPacket) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
r.m_sb.timeout = r.Link.timeout
|
r.m_sb.timeout = r.Link.timeout
|
||||||
if !C_RTMP_Connect1(r, cp) {
|
return C_RTMP_Connect1(r, cp)
|
||||||
return errors.New("RTMP connection failed")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// int SocksNegotiate(RTMP* r);
|
// int SocksNegotiate(RTMP* r);
|
||||||
|
|
Loading…
Reference in New Issue