forked from gqf2008/babylon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rtmp_handler.go
96 lines (84 loc) · 2.41 KB
/
rtmp_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package rtmp
import (
"errors"
log "github.com/cihub/seelog"
)
type ServerHandler interface {
OnPublishing(s *RtmpNetStream) error
OnPlaying(s *RtmpNetStream) error
OnClosed(s *RtmpNetStream)
OnError(s *RtmpNetStream, err error)
}
type ClientHandler interface {
OnPublishStart(s *RtmpNetStream) error
OnPlayStart(s *RtmpNetStream) error
OnClosed(s *RtmpNetStream)
OnError(s *RtmpNetStream, err error)
}
type DefaultClientHandler struct {
}
func (this *DefaultClientHandler) OnPublishStart(s *RtmpNetStream) error {
return nil
}
func (this *DefaultClientHandler) OnPlayStart(s *RtmpNetStream) error {
if _, ok := find_broadcast(s.path); ok {
return errors.New("NetStream.Play.BadName")
}
start_broadcast(s, 5, 5)
return nil
}
func (this *DefaultClientHandler) OnClosed(s *RtmpNetStream) {
log.Infof("RtmpNetStream %s %s closed", s.conn.remoteAddr, s.path)
if d, ok := find_broadcast(s.path); ok {
if s.mode == MODE_PRODUCER {
d.stop()
} else if s.mode == MODE_CONSUMER {
d.removeConsumer(s)
}
}
}
func (this *DefaultClientHandler) OnError(s *RtmpNetStream, err error) {
log.Errorf("RtmpNetStream %s %s %+v", s.conn.remoteAddr, s.path, err)
s.Close()
}
type DefaultServerHandler struct {
}
func (p *DefaultServerHandler) OnPublishing(s *RtmpNetStream) error {
if _, ok := find_broadcast(s.path); ok {
return errors.New("NetStream.Publish.BadName")
}
start_broadcast(s, 5, 5)
return nil
}
func (p *DefaultServerHandler) OnPlaying(s *RtmpNetStream) error {
if d, ok := find_broadcast(s.path); ok {
d.addConsumer(s)
return nil
}
return errors.New("NetStream.Play.StreamNotFound")
}
func (p *DefaultServerHandler) OnClosed(s *RtmpNetStream) {
mode := "UNKNOWN"
if s.mode == MODE_CONSUMER {
mode = "CONSUMER"
} else if s.mode == MODE_PROXY {
mode = "PROXY"
} else if s.mode == MODE_CONSUMER|MODE_PRODUCER {
mode = "PRODUCER|CONSUMER"
}
log.Infof("RtmpNetStream %v %s %s closed", mode, s.conn.remoteAddr, s.path)
if d, ok := find_broadcast(s.path); ok {
if s.mode == MODE_PRODUCER {
d.stop()
} else if s.mode == MODE_CONSUMER {
d.removeConsumer(s)
} else if s.mode == MODE_CONSUMER|MODE_PRODUCER {
d.removeConsumer(s)
d.stop()
}
}
}
func (p *DefaultServerHandler) OnError(s *RtmpNetStream, err error) {
log.Errorf("RtmpNetStream %s %s %+v", s.conn.remoteAddr, s.path, err)
s.Close()
}