mirror of https://bitbucket.org/ausocean/av.git
Merged in use-go-errors (pull request #97)
Use Go errors for all rtmp functions. Approved-by: Saxon Milton <saxon.milton@gmail.com> Approved-by: Alan Noble <anoble@gmail.com>
This commit is contained in:
commit
705fedc532
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
481
rtmp/rtmp.go
481
rtmp/rtmp.go
File diff suppressed because it is too large
Load Diff
|
@ -138,13 +138,7 @@ type C_RTMPPacket struct {
|
||||||
|
|
||||||
// typedef struct RTMPSockBuf
|
// typedef struct RTMPSockBuf
|
||||||
// rtmp.h +127
|
// rtmp.h +127
|
||||||
type C_RTMPSockBuf struct {
|
// DELETED: subsumed by C_RTMP_LNK
|
||||||
conn *net.TCPConn
|
|
||||||
timeout int32
|
|
||||||
sb_size int
|
|
||||||
sb_start int
|
|
||||||
sb_buf [RTMP_BUFFER_CACHE_SIZE]byte // port const
|
|
||||||
}
|
|
||||||
|
|
||||||
// RTMPPacket_IsReady(a)
|
// RTMPPacket_IsReady(a)
|
||||||
// rtmp.h +142
|
// rtmp.h +142
|
||||||
|
@ -170,8 +164,9 @@ type C_RTMP_LNK struct {
|
||||||
lFlags int32
|
lFlags int32
|
||||||
swfAge int32
|
swfAge int32
|
||||||
protocol int32
|
protocol int32
|
||||||
timeout int32
|
timeout uint
|
||||||
port uint16
|
port uint16
|
||||||
|
conn *net.TCPConn
|
||||||
}
|
}
|
||||||
|
|
||||||
// typedef struct RTMPMethod
|
// typedef struct RTMPMethod
|
||||||
|
@ -213,6 +208,5 @@ type C_RTMP struct {
|
||||||
m_resplen int32
|
m_resplen int32
|
||||||
m_unackd int32
|
m_unackd int32
|
||||||
m_write C_RTMPPacket
|
m_write C_RTMPPacket
|
||||||
m_sb C_RTMPSockBuf
|
|
||||||
Link C_RTMP_LNK
|
Link C_RTMP_LNK
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ func (s *Session) Open() error {
|
||||||
return errors.New("rtmp: attempt to start already running session")
|
return errors.New("rtmp: attempt to start already running session")
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
s.rtmp, err = startSession(s.rtmp, s.url, uint32(s.timeout))
|
s.rtmp, err = startSession(s.rtmp, s.url, s.timeout)
|
||||||
if s.rtmp == nil {
|
if s.rtmp == nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -84,13 +84,14 @@ func (s *Session) Write(data []byte) (int, error) {
|
||||||
return 0, Err(3)
|
return 0, Err(3)
|
||||||
}
|
}
|
||||||
|
|
||||||
if C_RTMP_IsConnected(s.rtmp) == 0 {
|
if !C_RTMP_IsConnected(s.rtmp) {
|
||||||
//if C.RTMP_IsConnected(s.rtmp) == 0 {
|
|
||||||
return 0, Err(1)
|
return 0, Err(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if C_RTMP_Write(s.rtmp, data) == 0 {
|
err := C_RTMP_Write(s.rtmp, data)
|
||||||
|
if err != nil {
|
||||||
//if C.RTMP_Write(s.rtmp, (*byte)(unsafe.Pointer(&data[0])), int32(len(data))) == 0 {
|
//if C.RTMP_Write(s.rtmp, (*byte)(unsafe.Pointer(&data[0])), int32(len(data))) == 0 {
|
||||||
|
// TODO: propagate err
|
||||||
return 0, Err(2)
|
return 0, Err(2)
|
||||||
}
|
}
|
||||||
return len(data), nil
|
return len(data), nil
|
||||||
|
|
102
rtmp/socket.go
102
rtmp/socket.go
|
@ -1,102 +0,0 @@
|
||||||
/*
|
|
||||||
NAME
|
|
||||||
rtmp.go
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
See Readme.md
|
|
||||||
|
|
||||||
AUTHORS
|
|
||||||
Saxon Nelson-Milton <saxon@ausocean.org>
|
|
||||||
Dan Kortschak <dan@ausocean.org>
|
|
||||||
|
|
||||||
LICENSE
|
|
||||||
rtmp.go is Copyright (C) 2017 the Australian Ocean Lab (AusOcean)
|
|
||||||
|
|
||||||
It is free software: you can redistribute it and/or modify them
|
|
||||||
under the terms of the GNU General Public License as published by the
|
|
||||||
Free Software Foundation, either version 3 of the License, or (at your
|
|
||||||
option) any later version.
|
|
||||||
|
|
||||||
It is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with revid in gpl.txt. If not, see http://www.gnu.org/licenses.
|
|
||||||
|
|
||||||
Derived from librtmp under the GNU Lesser General Public License 2.1
|
|
||||||
Copyright (C) 2005-2008 Team XBMC http://www.xbmc.org
|
|
||||||
Copyright (C) 2008-2009 Andrej Stepanchuk
|
|
||||||
Copyright (C) 2009-2010 Howard Chu
|
|
||||||
*/
|
|
||||||
|
|
||||||
package rtmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// int RTMP_Connect(RTMP *r, RTMPPacket* cp);
|
|
||||||
// rtmp.c +1032
|
|
||||||
func C_RTMP_Connect(r *C_RTMP, cp *C_RTMPPacket) error {
|
|
||||||
if r.Link.host == "" {
|
|
||||||
return errors.New("Empty host")
|
|
||||||
}
|
|
||||||
addr, err := net.ResolveTCPAddr("tcp4", r.Link.host+":"+strconv.Itoa(int(r.Link.port)))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
r.m_sb.conn, err = net.DialTCP("tcp4", nil, addr)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
r.m_sb.timeout = r.Link.timeout
|
|
||||||
if !C_RTMP_Connect1(r, cp) {
|
|
||||||
return errors.New("RTMP connection failed")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// int SocksNegotiate(RTMP* r);
|
|
||||||
// rtmp.c +1062
|
|
||||||
// DELETED
|
|
||||||
|
|
||||||
// int RTMPSockBuf_Fill(RTMPSockBuf* sb);
|
|
||||||
// rtmp.c +4253
|
|
||||||
func C_RTMPSockBuf_Fill(sb *C_RTMPSockBuf) (int, error) {
|
|
||||||
if sb.sb_size == 0 {
|
|
||||||
sb.sb_start = 0
|
|
||||||
}
|
|
||||||
err := sb.conn.SetReadDeadline(time.Now().Add(time.Second * time.Duration(sb.timeout)))
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
n, err := sb.conn.Read(sb.sb_buf[sb.sb_start+sb.sb_size:])
|
|
||||||
sb.sb_size += n
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// int RTMPSockBuf_Send(RTMPSockBuf* sb, const char* buf, int len);
|
|
||||||
// rtmp.c +4297
|
|
||||||
// TODO replace send with golang net connection send
|
|
||||||
func C_RTMPSockBuf_Send(sb *C_RTMPSockBuf, buf []byte) (int, error) {
|
|
||||||
err := sb.conn.SetWriteDeadline(time.Now().Add(time.Second * time.Duration(sb.timeout)))
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return sb.conn.Write(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
// int
|
|
||||||
// RTMPSockBuf_Close(RTMPSockBuf *sb)
|
|
||||||
// rtmp.c +4369
|
|
||||||
func C_RTMPSockBuf_Close(sb *C_RTMPSockBuf) error {
|
|
||||||
if sb.conn == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return sb.conn.Close()
|
|
||||||
}
|
|
Loading…
Reference in New Issue