[opt] 支持pkg层面控制日志 #62

pull/134/head
q191201771 3 years ago
parent feb1be824d
commit 0f21334964

@ -20,7 +20,9 @@ image:
.PHONY: clean
clean:
rm -rf ./bin ./release ./logs ./lal_record
rm -rf ./bin ./release ./logs ./lal_record ./pkg/base/logs ./pkg/base/lal_record ./pkg/httpts/logs ./pkg/httpts/lal_record
rm -rf ./pkg/mpegts/logs ./pkg/mpegts/lal_record ./pkg/remux/logs ./pkg/remux/lal_record ./pkg/rtprtcp/logs ./pkg/rtprtcp/lal_record
rm -rf ./pkg/rtsp/logs ./pkg/rtsp/lal_record ./pkg/sdp/logs ./pkg/sdp/lal_record
.PHONY: all
all: build test

@ -2,4 +2,4 @@ module github.com/q191201771/lal
go 1.14
require github.com/q191201771/naza v0.29.0
require github.com/q191201771/naza v0.30.0

@ -1,2 +1,2 @@
github.com/q191201771/naza v0.29.0 h1:VvvJfYVkmQjszOXqhYyf2gGOCPl69woLCSWxNF0T//I=
github.com/q191201771/naza v0.29.0/go.mod h1:n+dpJjQSh90PxBwxBNuifOwQttywvSIN5TkWSSYCeBk=
github.com/q191201771/naza v0.30.0 h1:tfy1O0QRl3O80mH8PSAd2FhpZ5eL7coQtCF0HzjEO4Y=
github.com/q191201771/naza v0.30.0/go.mod h1:n+dpJjQSh90PxBwxBNuifOwQttywvSIN5TkWSSYCeBk=

@ -16,8 +16,6 @@ import (
"github.com/q191201771/lal/pkg/aac"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/assert"
)
@ -90,5 +88,5 @@ func TestMakeAudioDataSeqHeader(t *testing.T) {
func TestSequenceHeaderContext(t *testing.T) {
var shCtx aac.SequenceHeaderContext
shCtx.Unpack(goldenSh)
nazalog.Debugf("%+v", shCtx)
aac.Log.Debugf("%+v", shCtx)
}

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package aac
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -11,10 +11,8 @@ package avc
import (
"io"
"github.com/q191201771/naza/pkg/nazabytes"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazabytes"
"github.com/q191201771/naza/pkg/nazaerrors"
@ -36,7 +34,7 @@ var (
NaluStartCode3 = []byte{0x0, 0x0, 0x1}
NaluStartCode4 = []byte{0x0, 0x0, 0x0, 0x1}
// aud nalu
// AudNalu aud nalu
AudNalu = []byte{0x00, 0x00, 0x00, 0x01, 0x09, 0xf0}
)
@ -498,7 +496,7 @@ func IterateNaluAvcc(nals []byte, handler func(nal []byte)) error {
// length为0的直接过滤掉
if length == 0 {
nazalog.Warnf("avcc nalu length equal 0. nals=%s", nazabytes.Prefix(nals, 128))
Log.Warnf("avcc nalu length equal 0. nals=%s", nazabytes.Prefix(nals, 128))
continue
}
handler(nals[pos:epos])
@ -507,7 +505,7 @@ func IterateNaluAvcc(nals []byte, handler func(nal []byte)) error {
// 最后一个
if length == 0 {
nazalog.Warnf("avcc nalu length equal 0. nals=%s", nazabytes.Prefix(nals, 128))
Log.Warnf("avcc nalu length equal 0. nals=%s", nazabytes.Prefix(nals, 128))
continue
}
handler(nals[pos:epos])

@ -18,8 +18,6 @@ import (
"github.com/q191201771/naza/pkg/nazabits"
"github.com/q191201771/naza/pkg/nazaerrors"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/lal/pkg/avc"
"github.com/q191201771/naza/pkg/assert"
@ -36,7 +34,7 @@ func TestParseNaluType(t *testing.T) {
assert.Equal(t, out, actual)
b := avc.ParseNaluTypeReadable(in)
nazalog.Debug(b)
avc.Log.Debug(b)
}
}
@ -60,7 +58,7 @@ func TestParseSliceType(t *testing.T) {
b, err := avc.ParseSliceTypeReadable(item.in)
assert.Equal(t, nil, err)
nazalog.Debug(b)
avc.Log.Debug(b)
}
}
@ -138,7 +136,7 @@ func TestParseSps(t *testing.T) {
err = avc.ParseSps(nil, &ctx)
assert.Equal(t, true, nazaerrors.Is(err, nazabits.ErrNazaBits))
assert.IsNotNil(t, err)
nazalog.Debugf("error expected not nil, actual=%+v", err)
avc.Log.Debugf("error expected not nil, actual=%+v", err)
err = avc.ParseSps(goldenSps2, &ctx)
assert.Equal(t, nil, err)

@ -18,14 +18,13 @@ import (
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/nazabits"
"github.com/q191201771/naza/pkg/nazabytes"
"github.com/q191201771/naza/pkg/nazalog"
)
func ParseSps(payload []byte, ctx *Context) error {
br := nazabits.NewBitReader(payload)
var sps Sps
if err := parseSpsBasic(&br, &sps); err != nil {
nazalog.Errorf("parseSpsBasic failed. err=%+v, payload=%s", err, hex.Dump(nazabytes.Prefix(payload, 128)))
Log.Errorf("parseSpsBasic failed. err=%+v, payload=%s", err, hex.Dump(nazabytes.Prefix(payload, 128)))
return err
}
ctx.Profile = sps.ProfileIdc
@ -37,9 +36,9 @@ func ParseSps(payload []byte, ctx *Context) error {
if err := parseSpsGamma(&br, &sps); err != nil {
// 注意这里不将错误返回给上层因为可能是Beta自身解析的问题
nazalog.Errorf("parseSpsGamma failed. err=%+v, payload=%s", err, hex.Dump(nazabytes.Prefix(payload, 128)))
Log.Errorf("parseSpsGamma failed. err=%+v, payload=%s", err, hex.Dump(nazabytes.Prefix(payload, 128)))
}
nazalog.Debugf("sps=%+v", sps)
Log.Debugf("sps=%+v", sps)
ctx.Width = (sps.PicWidthInMbsMinusOne+1)*16 - (sps.FrameCropLeftOffset+sps.FrameCropRightOffset)*2
ctx.Height = (2-uint32(sps.FrameMbsOnlyFlag))*(sps.PicHeightInMapUnitsMinusOne+1)*16 - (sps.FrameCropTopOffset+sps.FrameCropBottomOffset)*2
@ -94,7 +93,7 @@ func TryParseSeqHeader(payload []byte) error {
b, err = br.ReadBytes(2)
dcr.PpsLength = bele.BeUint16(b)
nazalog.Debugf("%+v", dcr)
Log.Debugf("%+v", dcr)
// 5 + 5 + 1 + 2
var ctx Context

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package avc
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -14,7 +14,6 @@ import (
"time"
"github.com/q191201771/naza/pkg/bininfo"
"github.com/q191201771/naza/pkg/nazalog"
)
// base包提供被其他多个package依赖的基础内容自身不依赖任何package
@ -33,13 +32,13 @@ func ReadableNowTime() string {
func LogoutStartInfo() {
dir, _ := os.Getwd()
nazalog.Infof(" start: %s", startTime)
nazalog.Infof(" wd: %s", dir)
nazalog.Infof(" args: %s", strings.Join(os.Args, " "))
nazalog.Infof(" bininfo: %s", bininfo.StringifySingleLine())
nazalog.Infof(" version: %s", LalFullInfo)
nazalog.Infof(" github: %s", LalGithubSite)
nazalog.Infof(" doc: %s", LalDocSite)
Log.Infof(" start: %s", startTime)
Log.Infof(" wd: %s", dir)
Log.Infof(" args: %s", strings.Join(os.Args, " "))
Log.Infof(" bininfo: %s", bininfo.StringifySingleLine())
Log.Infof(" version: %s", LalFullInfo)
Log.Infof(" github: %s", LalGithubSite)
Log.Infof(" doc: %s", LalDocSite)
}
func init() {

@ -16,11 +16,11 @@ func TestHttpServerManager(t *testing.T) {
//var err error
//
//var fnFlv = func(writer http.ResponseWriter, request *http.Request) {
// nazalog.Debugf("> fnFlv")
// Log.Debugf("> fnFlv")
//}
//
//var fnTs = func(writer http.ResponseWriter, request *http.Request) {
// nazalog.Debugf("> fnTs")
// Log.Debugf("> fnTs")
//}
//
//sm := NewHttpServerManager()

@ -118,7 +118,7 @@ func (session *HttpSubSession) StreamName() string {
case ProtocolHttpts:
suffix = ".ts"
default:
Logger.Warnf("[%s] acquire stream name but protocol unknown.", session.Uk)
Log.Warnf("[%s] acquire stream name but protocol unknown.", session.Uk)
}
return strings.TrimSuffix(session.UrlCtx.LastItemOfPath, suffix)
}

@ -15,6 +15,7 @@ import (
)
type LogDump struct {
log nazalog.Logger
debugMaxNum int
debugCount int
@ -24,14 +25,15 @@ type LogDump struct {
//
// @param debugMaxNum: 日志最小级别为debug时使用debug打印日志次数的阈值
//
func NewLogDump(debugMaxNum int) LogDump {
func NewLogDump(log nazalog.Logger, debugMaxNum int) LogDump {
return LogDump{
log: log,
debugMaxNum: debugMaxNum,
}
}
func (ld *LogDump) ShouldDump() bool {
switch nazalog.GetOption().Level {
switch ld.log.GetOption().Level {
case nazalog.LevelTrace:
return true
case nazalog.LevelDebug:
@ -52,5 +54,5 @@ func (ld *LogDump) ShouldDump() bool {
// 这个hex.Dump调用
//
func (ld *LogDump) Outf(format string, v ...interface{}) {
nazalog.Out(nazalog.GetOption().Level, 3, fmt.Sprintf(format, v...))
ld.log.Out(ld.log.GetOption().Level, 3, fmt.Sprintf(format, v...))
}

@ -10,8 +10,6 @@ package base
import (
"net"
"github.com/q191201771/naza/pkg/nazalog"
)
// TODO(chef): feat 通过时间戳(目前是数据大小)来设定合并阈值
@ -47,7 +45,7 @@ func NewMergeWriter(onWritev OnWritev, size int) *MergeWriter {
// 注意,函数调用结束后,`b`内存块会被内部持有
//
func (w *MergeWriter) Write(b []byte) {
nazalog.Debugf("[%p] MergeWriter::Write. len=%d", w, len(b))
Log.Debugf("[%p] MergeWriter::Write. len=%d", w, len(b))
w.bs = append(w.bs, b)
w.currSize += len(b)
if w.currSize >= w.size {
@ -58,7 +56,7 @@ func (w *MergeWriter) Write(b []byte) {
// Flush 强制将内部缓冲的数据全部回调排空
//
func (w *MergeWriter) Flush() {
nazalog.Debugf("[%p] MergeWriter::Flush.", w)
Log.Debugf("[%p] MergeWriter::Flush.", w)
if w.currSize > 0 {
w.flush()
}
@ -74,7 +72,7 @@ func (w *MergeWriter) flush() {
n += len(v)
ns = append(ns, len(v))
}
nazalog.Debugf("[%p] MergeWriter::flush. len=%d(%v)", w, n, ns)
Log.Debugf("[%p] MergeWriter::flush. len=%d(%v)", w, n, ns)
w.onWritev(w.bs)
w.currSize = 0
w.bs = nil

@ -14,8 +14,6 @@ import (
"os"
"os/signal"
"syscall"
log "github.com/q191201771/naza/pkg/nazalog"
)
// RunSignalHandler 监听SIGUSR1和SIGUSR2信号并回调
@ -26,6 +24,6 @@ func RunSignalHandler(cb func()) {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGUSR1, syscall.SIGUSR2)
s := <-c
log.Infof("recv signal. s=%+v", s)
Log.Infof("recv signal. s=%+v", s)
cb()
}

@ -10,6 +10,4 @@ package base
import "github.com/q191201771/naza/pkg/nazalog"
var (
Logger = nazalog.GetGlobalLogger()
)
var Log = nazalog.GetGlobalLogger()

@ -173,7 +173,7 @@ func ParseVpsSpsPpsFromSeqHeaderWithoutMalloc(payload []byte) (vps, sps, pps []b
if payload[0] != 0x1c || payload[1] != 0x00 || payload[2] != 0 || payload[3] != 0 || payload[4] != 0 {
return nil, nil, nil, nazaerrors.Wrap(base.ErrHevc)
}
//nazalog.Debugf("%s", hex.Dump(payload))
//Log.Debugf("%s", hex.Dump(payload))
if len(payload) < 33 {
return nil, nil, nil, nazaerrors.Wrap(base.ErrHevc)

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package hevc
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -17,8 +17,6 @@ import (
"github.com/q191201771/lal/pkg/mpegts"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
)
// TODO chef: 转换TS流的功能通过回调供httpts使用也放在了Muxer中好处是hls和httpts可以共用一份TS流。
@ -120,20 +118,20 @@ func NewMuxer(streamName string, enable bool, config *MuxerConfig, observer Muxe
m.makeFrags()
streamer := NewStreamer(m)
m.streamer = streamer
nazalog.Infof("[%s] lifecycle new hls muxer. muxer=%p, streamName=%s", uk, m, streamName)
Log.Infof("[%s] lifecycle new hls muxer. muxer=%p, streamName=%s", uk, m, streamName)
return m
}
func (m *Muxer) Start() {
nazalog.Infof("[%s] start hls muxer.", m.UniqueKey)
Log.Infof("[%s] start hls muxer.", m.UniqueKey)
m.ensureDir()
}
func (m *Muxer) Dispose() {
nazalog.Infof("[%s] lifecycle dispose hls muxer.", m.UniqueKey)
Log.Infof("[%s] lifecycle dispose hls muxer.", m.UniqueKey)
m.streamer.FlushAudio()
if err := m.closeFragment(true); err != nil {
nazalog.Errorf("[%s] close fragment error. err=%+v", m.UniqueKey, err)
Log.Errorf("[%s] close fragment error. err=%+v", m.UniqueKey, err)
}
}
@ -158,18 +156,18 @@ func (m *Muxer) OnFrame(streamer *Streamer, frame *mpegts.Frame) {
// 为了考虑没有视频的情况也能切片所以这里判断spspps为空时也建议生成fragment
boundary = !streamer.VideoSeqHeaderCached()
if err := m.updateFragment(frame.Pts, boundary); err != nil {
nazalog.Errorf("[%s] update fragment error. err=%+v", m.UniqueKey, err)
Log.Errorf("[%s] update fragment error. err=%+v", m.UniqueKey, err)
return
}
if !m.opened {
nazalog.Warnf("[%s] OnFrame A not opened. boundary=%t", m.UniqueKey, boundary)
Log.Warnf("[%s] OnFrame A not opened. boundary=%t", m.UniqueKey, boundary)
return
}
//nazalog.Debugf("[%s] WriteFrame A. dts=%d, len=%d", m.UniqueKey, frame.DTS, len(frame.Raw))
//Log.Debugf("[%s] WriteFrame A. dts=%d, len=%d", m.UniqueKey, frame.DTS, len(frame.Raw))
} else {
//nazalog.Debugf("[%s] OnFrame V. dts=%d, len=%d", m.UniqueKey, frame.Dts, len(frame.Raw))
//Log.Debugf("[%s] OnFrame V. dts=%d, len=%d", m.UniqueKey, frame.Dts, len(frame.Raw))
// 收到视频可能触发建立fragment的条件是
// 关键帧数据 &&
// ((没有收到过音频seq header) || -> 只有视频
@ -178,22 +176,22 @@ func (m *Muxer) OnFrame(streamer *Streamer, frame *mpegts.Frame) {
// )
boundary = frame.Key && (!streamer.AudioSeqHeaderCached() || !m.opened || !streamer.AudioCacheEmpty())
if err := m.updateFragment(frame.Dts, boundary); err != nil {
nazalog.Errorf("[%s] update fragment error. err=%+v", m.UniqueKey, err)
Log.Errorf("[%s] update fragment error. err=%+v", m.UniqueKey, err)
return
}
if !m.opened {
nazalog.Warnf("[%s] OnFrame V not opened. boundary=%t, key=%t", m.UniqueKey, boundary, frame.Key)
Log.Warnf("[%s] OnFrame V not opened. boundary=%t, key=%t", m.UniqueKey, boundary, frame.Key)
return
}
//nazalog.Debugf("[%s] WriteFrame V. dts=%d, len=%d", m.UniqueKey, frame.Dts, len(frame.Raw))
//Log.Debugf("[%s] WriteFrame V. dts=%d, len=%d", m.UniqueKey, frame.Dts, len(frame.Raw))
}
mpegts.PackTsPacket(frame, func(packet []byte) {
if m.enable {
if err := m.fragment.WriteFile(packet); err != nil {
nazalog.Errorf("[%s] fragment write error. err=%+v", m.UniqueKey, err)
Log.Errorf("[%s] fragment write error. err=%+v", m.UniqueKey, err)
return
}
}
@ -231,7 +229,7 @@ func (m *Muxer) updateFragment(ts uint64, boundary bool) error {
//
maxfraglen := uint64(m.config.FragmentDurationMs * 90 * 10)
if (ts > m.fragTs && ts-m.fragTs > maxfraglen) || (m.fragTs > ts && m.fragTs-ts > negMaxfraglen) {
nazalog.Warnf("[%s] force fragment split. fragTs=%d, ts=%d", m.UniqueKey, m.fragTs, ts)
Log.Warnf("[%s] force fragment split. fragTs=%d, ts=%d", m.UniqueKey, m.fragTs, ts)
if err := m.closeFragment(false); err != nil {
return err
@ -343,7 +341,7 @@ func (m *Muxer) closeFragment(isLast bool) error {
if frag.filename != "" {
filenameWithPath := PathStrategy.GetTsFileNameWithPath(m.outPath, frag.filename)
if err := fslCtx.Remove(filenameWithPath); err != nil {
nazalog.Warnf("[%s] remove stale fragment file failed. filename=%s, err=%+v", m.UniqueKey, filenameWithPath, err)
Log.Warnf("[%s] remove stale fragment file failed. filename=%s, err=%+v", m.UniqueKey, filenameWithPath, err)
}
}
}
@ -371,7 +369,7 @@ func (m *Muxer) writeRecordPlaylist() {
content = bytes.TrimSuffix(content, []byte("#EXT-X-ENDLIST\n"))
content, err = updateTargetDurationInM3u8(content, int(m.recordMaxFragDuration))
if err != nil {
nazalog.Errorf("[%s] update target duration failed. err=%+v", m.UniqueKey, err)
Log.Errorf("[%s] update target duration failed. err=%+v", m.UniqueKey, err)
return
}
@ -400,7 +398,7 @@ func (m *Muxer) writeRecordPlaylist() {
}
if err := writeM3u8File(content, m.recordPlayListFilename, m.recordPlayListFilenameBak); err != nil {
nazalog.Errorf("[%s] write record m3u8 file error. err=%+v", m.UniqueKey, err)
Log.Errorf("[%s] write record m3u8 file error. err=%+v", m.UniqueKey, err)
}
}
@ -438,7 +436,7 @@ func (m *Muxer) writePlaylist(isLast bool) {
}
if err := writeM3u8File(buf.Bytes(), m.playlistFilename, m.playlistFilenameBak); err != nil {
nazalog.Errorf("[%s] write live m3u8 file error. err=%+v", m.UniqueKey, err)
Log.Errorf("[%s] write live m3u8 file error. err=%+v", m.UniqueKey, err)
}
}
@ -447,9 +445,9 @@ func (m *Muxer) ensureDir() {
return
}
//err := fslCtx.RemoveAll(m.outPath)
//nazalog.Assert(nil, err)
//Log.Assert(nil, err)
err := fslCtx.MkdirAll(m.outPath, 0777)
nazalog.Assert(nil, err)
Log.Assert(nil, err)
}
// ---------------------------------------------------------------------------------------------------------------------

@ -11,8 +11,6 @@ package hls_test
import (
"testing"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/hls"
@ -48,7 +46,7 @@ func TestDefaultPathStrategy_GetRequestInfo(t *testing.T) {
for k, v := range golden {
ctx, err := base.ParseUrl(k, -1)
nazalog.Assert(nil, err)
hls.Log.Assert(nil, err)
out := dps.GetRequestInfo(ctx, rootOutPath)
assert.Equal(t, v, out)
}

@ -12,8 +12,6 @@ import (
"net/http"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
)
type ServerHandler struct {
@ -29,14 +27,14 @@ func NewServerHandler(outPath string) *ServerHandler {
func (s *ServerHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
urlCtx, err := base.ParseUrl(base.ParseHttpRequest(req), 80)
if err != nil {
nazalog.Errorf("parse url. err=%+v", err)
Log.Errorf("parse url. err=%+v", err)
return
}
s.ServeHTTPWithUrlCtx(resp, urlCtx)
}
func (s *ServerHandler) ServeHTTPWithUrlCtx(resp http.ResponseWriter, urlCtx base.UrlContext) {
//nazalog.Debugf("%+v", req)
//Log.Debugf("%+v", req)
// TODO chef:
// - check appname in URI path
@ -45,17 +43,17 @@ func (s *ServerHandler) ServeHTTPWithUrlCtx(resp http.ResponseWriter, urlCtx bas
filetype := urlCtx.GetFileType()
ri := PathStrategy.GetRequestInfo(urlCtx, s.outPath)
//nazalog.Debugf("%+v", ri)
//Log.Debugf("%+v", ri)
if filename == "" || (filetype != "m3u8" && filetype != "ts") || ri.StreamName == "" || ri.FileNameWithPath == "" {
nazalog.Warnf("invalid hls request. url=%+v, request=%+v", urlCtx, ri)
Log.Warnf("invalid hls request. url=%+v, request=%+v", urlCtx, ri)
resp.WriteHeader(404)
return
}
content, err := ReadFile(ri.FileNameWithPath)
if err != nil {
nazalog.Warnf("read hls file failed. request=%+v, err=%+v", ri, err)
Log.Warnf("read hls file failed. request=%+v, err=%+v", ri, err)
resp.WriteHeader(404)
return
}

@ -18,7 +18,6 @@ import (
"github.com/q191201771/lal/pkg/mpegts"
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/nazabytes"
"github.com/q191201771/naza/pkg/nazalog"
)
type StreamerObserver interface {
@ -99,7 +98,7 @@ func (s *Streamer) feedVideo(msg base.RtmpMsg) {
// 此时打印错误并返回也不影响
//
if len(msg.Payload) <= 5 {
nazalog.Errorf("[%s] invalid video message length. header=%+v, payload=%s", s.UniqueKey, msg.Header, hex.Dump(msg.Payload))
Log.Errorf("[%s] invalid video message length. header=%+v, payload=%s", s.UniqueKey, msg.Header, hex.Dump(msg.Payload))
return
}
@ -114,12 +113,12 @@ func (s *Streamer) feedVideo(msg base.RtmpMsg) {
var err error
if msg.IsAvcKeySeqHeader() {
if s.spspps, err = avc.SpsPpsSeqHeader2Annexb(msg.Payload); err != nil {
nazalog.Errorf("[%s] cache spspps failed. err=%+v", s.UniqueKey, err)
Log.Errorf("[%s] cache spspps failed. err=%+v", s.UniqueKey, err)
}
return
} else if msg.IsHevcKeySeqHeader() {
if s.spspps, err = hevc.VpsSpsPpsSeqHeader2Annexb(msg.Payload); err != nil {
nazalog.Errorf("[%s] cache vpsspspps failed. err=%+v", s.UniqueKey, err)
Log.Errorf("[%s] cache vpsspspps failed. err=%+v", s.UniqueKey, err)
}
return
}
@ -134,7 +133,7 @@ func (s *Streamer) feedVideo(msg base.RtmpMsg) {
// msg中可能有多个NALU逐个获取
nals, err := avc.SplitNaluAvcc(msg.Payload[5:])
if err != nil {
nazalog.Errorf("[%s] iterate nalu failed. err=%+v, header=%+v, payload=%s", err, s.UniqueKey, msg.Header, hex.Dump(nazabytes.Prefix(msg.Payload, 32)))
Log.Errorf("[%s] iterate nalu failed. err=%+v, header=%+v, payload=%s", err, s.UniqueKey, msg.Header, hex.Dump(nazabytes.Prefix(msg.Payload, 32)))
return
}
for _, nal := range nals {
@ -146,7 +145,7 @@ func (s *Streamer) feedVideo(msg base.RtmpMsg) {
nalType = hevc.ParseNaluType(nal[0])
}
//nazalog.Debugf("[%s] naltype=%d, len=%d(%d), cts=%d, key=%t.", s.UniqueKey, nalType, nalBytes, len(msg.Payload), cts, msg.IsVideoKeyNalu())
//Log.Debugf("[%s] naltype=%d, len=%d(%d), cts=%d, key=%t.", s.UniqueKey, nalType, nalBytes, len(msg.Payload), cts, msg.IsVideoKeyNalu())
// 过滤掉原流中的sps pps aud
// sps pps前面已经缓存过了后面有自己的写入逻辑
@ -176,7 +175,7 @@ func (s *Streamer) feedVideo(msg base.RtmpMsg) {
case avc.NaluTypeIdrSlice:
if !spsppsSent {
if out, err = s.appendSpsPps(out); err != nil {
nazalog.Warnf("[%s] append spspps by not exist.", s.UniqueKey)
Log.Warnf("[%s] append spspps by not exist.", s.UniqueKey)
return
}
}
@ -190,7 +189,7 @@ func (s *Streamer) feedVideo(msg base.RtmpMsg) {
case hevc.NaluTypeSliceIdr, hevc.NaluTypeSliceIdrNlp, hevc.NaluTypeSliceCranut:
if !spsppsSent {
if out, err = s.appendSpsPps(out); err != nil {
nazalog.Warnf("[%s] append spspps by not exist.", s.UniqueKey)
Log.Warnf("[%s] append spspps by not exist.", s.UniqueKey)
return
}
}
@ -233,24 +232,24 @@ func (s *Streamer) feedVideo(msg base.RtmpMsg) {
func (s *Streamer) feedAudio(msg base.RtmpMsg) {
if len(msg.Payload) < 3 {
nazalog.Errorf("[%s] invalid audio message length. len=%d", s.UniqueKey, len(msg.Payload))
Log.Errorf("[%s] invalid audio message length. len=%d", s.UniqueKey, len(msg.Payload))
return
}
if msg.Payload[0]>>4 != base.RtmpSoundFormatAac {
return
}
//nazalog.Debugf("[%s] hls: feedAudio. dts=%d len=%d", s.UniqueKey, msg.Header.TimestampAbs, len(msg.Payload))
//Log.Debugf("[%s] hls: feedAudio. dts=%d len=%d", s.UniqueKey, msg.Header.TimestampAbs, len(msg.Payload))
if msg.Payload[1] == base.RtmpAacPacketTypeSeqHeader {
if err := s.cacheAacSeqHeader(msg); err != nil {
nazalog.Errorf("[%s] cache aac seq header failed. err=%+v", s.UniqueKey, err)
Log.Errorf("[%s] cache aac seq header failed. err=%+v", s.UniqueKey, err)
}
return
}
if !s.AudioSeqHeaderCached() {
nazalog.Warnf("[%s] feed audio message but aac seq header not exist.", s.UniqueKey)
Log.Warnf("[%s] feed audio message but aac seq header not exist.", s.UniqueKey)
return
}

@ -8,12 +8,17 @@
package hls
import "github.com/q191201771/naza/pkg/mock"
import (
"github.com/q191201771/naza/pkg/mock"
"github.com/q191201771/naza/pkg/nazalog"
)
var (
PathStrategy IPathStrategy = &DefaultPathStrategy{}
Clock = mock.NewStdClock()
Log = nazalog.GetGlobalLogger()
)
var (

@ -12,15 +12,13 @@ import (
"os"
"testing"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/assert"
)
func BenchmarkFlvFileReader(b *testing.B) {
const flvFile = "testdata/test.flv"
if _, err := os.Lstat(flvFile); err != nil {
nazalog.Warnf("lstat %s error. err=%+v", flvFile, err)
Log.Warnf("lstat %s error. err=%+v", flvFile, err)
return
}
@ -38,13 +36,13 @@ func BenchmarkFlvFileReader(b *testing.B) {
}
r.Dispose()
}
//nazalog.Debug(tmp)
//Log.Debug(tmp)
}
func BenchmarkCloneTag(b *testing.B) {
const flvFile = "testdata/test.flv"
if _, err := os.Lstat(flvFile); err != nil {
nazalog.Warnf("lstat %s error. err=%+v", flvFile, err)
Log.Warnf("lstat %s error. err=%+v", flvFile, err)
return
}

@ -22,7 +22,6 @@ import (
"github.com/q191201771/naza/pkg/nazahttp"
"github.com/q191201771/naza/pkg/connection"
"github.com/q191201771/naza/pkg/nazalog"
)
type PullSessionOption struct {
@ -65,7 +64,7 @@ func NewPullSession(modOptions ...ModPullSessionOption) *PullSession {
uniqueKey: uk,
option: option,
}
nazalog.Infof("[%s] lifecycle new httpflv PullSession. session=%p", uk, s)
Log.Infof("[%s] lifecycle new httpflv PullSession. session=%p", uk, s)
return s
}
@ -83,7 +82,7 @@ type OnReadFlvTag func(tag Tag)
// @param onReadFlvTag 读取到 flv tag 数据时回调。回调结束后PullSession 不会再使用这块 <tag> 数据。
//
func (session *PullSession) Pull(rawUrl string, onReadFlvTag OnReadFlvTag) error {
nazalog.Debugf("[%s] pull. url=%s", session.uniqueKey, rawUrl)
Log.Debugf("[%s] pull. url=%s", session.uniqueKey, rawUrl)
var (
ctx context.Context
@ -201,13 +200,13 @@ func (session *PullSession) pullContext(ctx context.Context, rawUrl string, onRe
if statusCode == "301" || statusCode == "302" {
url = headers.Get("Location")
if url == "" {
nazalog.Warnf("[%s] redirect but Location not found. headers=%+v", session.uniqueKey, headers)
Log.Warnf("[%s] redirect but Location not found. headers=%+v", session.uniqueKey, headers)
errChan <- nil
return
}
_ = session.conn.Close()
nazalog.Debugf("[%s] redirect to %s", session.uniqueKey, url)
Log.Debugf("[%s] redirect to %s", session.uniqueKey, url)
continue
}
@ -243,7 +242,7 @@ func (session *PullSession) connect(rawUrl string) (err error) {
return
}
nazalog.Debugf("[%s] > tcp connect. %s", session.uniqueKey, session.urlCtx.HostWithPort)
Log.Debugf("[%s] > tcp connect. %s", session.uniqueKey, session.urlCtx.HostWithPort)
var conn net.Conn
if session.urlCtx.Scheme == "https" {
@ -259,7 +258,7 @@ func (session *PullSession) connect(rawUrl string) (err error) {
return err
}
nazalog.Debugf("[%s] tcp connect succ. remote=%s", session.uniqueKey, conn.RemoteAddr().String())
Log.Debugf("[%s] tcp connect succ. remote=%s", session.uniqueKey, conn.RemoteAddr().String())
session.conn = connection.New(conn, func(option *connection.Option) {
option.ReadBufSize = readBufSize
@ -271,7 +270,7 @@ func (session *PullSession) connect(rawUrl string) (err error) {
func (session *PullSession) writeHttpRequest() error {
// # 发送 http GET 请求
nazalog.Debugf("[%s] > W http request. GET %s", session.uniqueKey, session.urlCtx.PathWithRawQuery)
Log.Debugf("[%s] > W http request. GET %s", session.uniqueKey, session.urlCtx.PathWithRawQuery)
req := fmt.Sprintf("GET %s HTTP/1.0\r\nUser-Agent: %s\r\nAccept: */*\r\nRange: byte=0-\r\nConnection: close\r\nHost: %s\r\nIcy-MetaData: 1\r\n\r\n",
session.urlCtx.PathWithRawQuery, base.LalHttpflvPullSessionUa, session.urlCtx.StdHost)
_, err := session.conn.Write([]byte(req))
@ -288,7 +287,7 @@ func (session *PullSession) readHttpRespHeader() (statusCode string, headers htt
return
}
nazalog.Debugf("[%s] < R http response header. statusLine=%s", session.uniqueKey, statusLine)
Log.Debugf("[%s] < R http response header. statusLine=%s", session.uniqueKey, statusLine)
return
}
@ -298,7 +297,7 @@ func (session *PullSession) readFlvHeader() ([]byte, error) {
if err != nil {
return flvHeader, err
}
nazalog.Debugf("[%s] < R http flv header.", session.uniqueKey)
Log.Debugf("[%s] < R http flv header.", session.uniqueKey)
// TODO chef: check flv header's value
return flvHeader, nil
@ -331,7 +330,7 @@ func (session *PullSession) runReadLoop(onReadFlvTag OnReadFlvTag) {
func (session *PullSession) dispose(err error) error {
var retErr error
session.disposeOnce.Do(func() {
nazalog.Infof("[%s] lifecycle dispose httpflv PullSession. err=%+v", session.uniqueKey, err)
Log.Infof("[%s] lifecycle dispose httpflv PullSession. err=%+v", session.uniqueKey, err)
if session.conn == nil {
retErr = base.ErrSessionNotStarted
return

@ -12,8 +12,6 @@ import (
"time"
"github.com/q191201771/naza/pkg/mock"
"github.com/q191201771/naza/pkg/nazalog"
)
var Clock = mock.NewStdClock()
@ -79,7 +77,7 @@ func (f *FlvFilePump) PumpWithTags(tags []Tag, onFlvTag OnPumpFlvTag) error {
// 循环一次,代表遍历文件一次
for roundIndex := 0; ; roundIndex++ {
nazalog.Debugf("new round. index=%d", roundIndex)
Log.Debugf("new round. index=%d", roundIndex)
hasReadThisBaseTs = false

@ -13,8 +13,6 @@ import (
"os"
"testing"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/lal/pkg/httpflv"
"github.com/q191201771/naza/pkg/assert"
"github.com/q191201771/naza/pkg/mock"
@ -30,7 +28,7 @@ func TestHttpflv(t *testing.T) {
func TestFlvFilePump(t *testing.T) {
const flvFile = "../../testdata/test.flv"
if _, err := os.Lstat(flvFile); err != nil {
nazalog.Warnf("lstat %s error. err=%+v", flvFile, err)
httpflv.Log.Warnf("lstat %s error. err=%+v", flvFile, err)
return
}

@ -14,8 +14,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/connection"
"github.com/q191201771/naza/pkg/nazalog"
)
var flvHttpResponseHeader []byte
@ -44,7 +42,7 @@ func NewSubSession(conn net.Conn, urlCtx base.UrlContext, isWebSocket bool, webs
IsFresh: true,
ShouldWaitVideoKeyFrame: true,
}
nazalog.Infof("[%s] lifecycle new httpflv SubSession. session=%p, remote addr=%s", uk, s, conn.RemoteAddr().String())
Log.Infof("[%s] lifecycle new httpflv SubSession. session=%p, remote addr=%s", uk, s, conn.RemoteAddr().String())
return s
}
@ -57,19 +55,19 @@ func (session *SubSession) RunLoop() error {
}
func (session *SubSession) Dispose() error {
nazalog.Infof("[%s] lifecycle dispose httpflv SubSession.", session.core.UniqueKey())
Log.Infof("[%s] lifecycle dispose httpflv SubSession.", session.core.UniqueKey())
return session.core.Dispose()
}
// ---------------------------------------------------------------------------------------------------------------------
func (session *SubSession) WriteHttpResponseHeader() {
nazalog.Debugf("[%s] > W http response header.", session.core.UniqueKey())
Log.Debugf("[%s] > W http response header.", session.core.UniqueKey())
session.core.WriteHttpResponseHeader(flvHttpResponseHeader)
}
func (session *SubSession) WriteFlvHeader() {
nazalog.Debugf("[%s] > W http flv header.", session.core.UniqueKey())
Log.Debugf("[%s] > W http flv header.", session.core.UniqueKey())
session.core.Write(FlvHeader)
}

@ -8,10 +8,14 @@
package httpflv
import "github.com/q191201771/naza/pkg/nazalog"
var (
SubSessionWriteChanSize = 1024 // SubSession发送数据时channel的大小
SubSessionWriteTimeoutMs = 10000
FlvHeader = []byte{0x46, 0x4c, 0x56, 0x01, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00}
Log = nazalog.GetGlobalLogger()
)
var readBufSize = 256 //16384 // ClientPullSession读取数据时

@ -13,7 +13,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/connection"
"github.com/q191201771/naza/pkg/nazalog"
)
var tsHttpResponseHeader []byte
@ -40,7 +39,7 @@ func NewSubSession(conn net.Conn, urlCtx base.UrlContext, isWebSocket bool, webs
}),
true,
}
nazalog.Infof("[%s] lifecycle new httpts SubSession. session=%p, remote addr=%s", uk, s, conn.RemoteAddr().String())
Log.Infof("[%s] lifecycle new httpts SubSession. session=%p, remote addr=%s", uk, s, conn.RemoteAddr().String())
return s
}
@ -53,14 +52,14 @@ func (session *SubSession) RunLoop() error {
}
func (session *SubSession) Dispose() error {
nazalog.Infof("[%s] lifecycle dispose httpts SubSession.", session.core.UniqueKey())
Log.Infof("[%s] lifecycle dispose httpts SubSession.", session.core.UniqueKey())
return session.core.Dispose()
}
// ---------------------------------------------------------------------------------------------------------------------
func (session *SubSession) WriteHttpResponseHeader() {
nazalog.Debugf("[%s] > W http response header.", session.core.UniqueKey())
Log.Debugf("[%s] > W http response header.", session.core.UniqueKey())
session.core.WriteHttpResponseHeader(tsHttpResponseHeader)
}

@ -8,7 +8,11 @@
package httpts
import "github.com/q191201771/naza/pkg/nazalog"
var (
SubSessionWriteChanSize = 1024
SubSessionWriteTimeoutMs = 10000
Log = nazalog.GetGlobalLogger()
)

@ -38,7 +38,6 @@ import (
"github.com/q191201771/lal/pkg/rtmp"
"github.com/q191201771/naza/pkg/assert"
"github.com/q191201771/naza/pkg/nazaatomic"
"github.com/q191201771/naza/pkg/nazalog"
)
// 开启了一个lalserver
@ -96,11 +95,11 @@ func (r RtspPullObserver) OnAvPacket(pkt base.AvPacket) {
func Entry(t *testing.T) {
if _, err := os.Lstat(confFile); err != nil {
nazalog.Warnf("lstat %s error. err=%+v", confFile, err)
Log.Warnf("lstat %s error. err=%+v", confFile, err)
return
}
if _, err := os.Lstat(rFlvFileName); err != nil {
nazalog.Warnf("lstat %s error. err=%+v", rFlvFileName, err)
Log.Warnf("lstat %s error. err=%+v", rFlvFileName, err)
return
}
@ -153,9 +152,9 @@ func Entry(t *testing.T) {
assert.Equal(tt, nil, err)
rtmpPullTagCount.Increment()
})
nazalog.Assert(nil, err)
Log.Assert(nil, err)
err = <-rtmpPullSession.WaitChan()
nazalog.Debug(err)
Log.Debug(err)
}()
go func() {
@ -167,9 +166,9 @@ func Entry(t *testing.T) {
assert.Equal(t, nil, err)
httpflvPullTagCount.Increment()
})
nazalog.Assert(nil, err)
Log.Assert(nil, err)
err = <-httpflvPullSession.WaitChan()
nazalog.Debug(err)
Log.Debug(err)
}()
time.Sleep(200 * time.Millisecond)
@ -184,7 +183,7 @@ func Entry(t *testing.T) {
option.PullTimeoutMs = 500
})
err := rtspPullSession.Pull(rtspPullUrl)
nazalog.Debug(err)
Log.Debug(err)
if rtspSdpCtx.RawSdp != nil {
break
}
@ -202,7 +201,7 @@ func Entry(t *testing.T) {
for _, tag := range tags {
assert.Equal(t, nil, err)
chunks := remux.FlvTag2RtmpChunks(tag)
//nazalog.Debugf("rtmp push: %d", fileTagCount.Load())
//Log.Debugf("rtmp push: %d", fileTagCount.Load())
err = pushSession.Write(chunks)
assert.Equal(t, nil, err)
}
@ -220,7 +219,7 @@ func Entry(t *testing.T) {
time.Sleep(10 * time.Millisecond)
}
nazalog.Debug("[innertest] start dispose.")
Log.Debug("[innertest] start dispose.")
pushSession.Dispose()
httpflvPullSession.Dispose()
@ -234,7 +233,7 @@ func Entry(t *testing.T) {
//_ = syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
sm.Dispose()
nazalog.Debugf("tag count. in=%d, out httpflv=%d, out rtmp=%d, out rtsp=%d",
Log.Debugf("tag count. in=%d, out httpflv=%d, out rtmp=%d, out rtsp=%d",
fileTagCount, httpflvPullTagCount.Load(), rtmpPullTagCount.Load(), rtspPullAvPacketCount.Load())
compareFile()
@ -269,11 +268,11 @@ func Entry(t *testing.T) {
func compareFile() {
r, err := ioutil.ReadFile(rFlvFileName)
assert.Equal(tt, nil, err)
nazalog.Debugf("%s filesize:%d", rFlvFileName, len(r))
Log.Debugf("%s filesize:%d", rFlvFileName, len(r))
w, err := ioutil.ReadFile(wFlvPullFileName)
assert.Equal(tt, nil, err)
nazalog.Debugf("%s filesize:%d", wFlvPullFileName, len(w))
Log.Debugf("%s filesize:%d", wFlvPullFileName, len(w))
res := bytes.Compare(r, w)
assert.Equal(tt, 0, res)
//err = os.Remove(wFlvPullFileName)
@ -281,7 +280,7 @@ func compareFile() {
w2, err := ioutil.ReadFile(wRtmpPullFileName)
assert.Equal(tt, nil, err)
nazalog.Debugf("%s filesize:%d", wRtmpPullFileName, len(w2))
Log.Debugf("%s filesize:%d", wRtmpPullFileName, len(w2))
res = bytes.Compare(r, w2)
assert.Equal(tt, 0, res)
//err = os.Remove(wRtmpPullFileName)
@ -293,30 +292,30 @@ func getAllHttpApi(addr string) {
var err error
b, err = httpGet(fmt.Sprintf("http://%s/api/list", addr))
nazalog.Assert(nil, err)
nazalog.Debugf("%s", string(b))
Log.Assert(nil, err)
Log.Debugf("%s", string(b))
b, err = httpGet(fmt.Sprintf("http://%s/api/stat/lal_info", addr))
nazalog.Assert(nil, err)
nazalog.Debugf("%s", string(b))
Log.Assert(nil, err)
Log.Debugf("%s", string(b))
b, err = httpGet(fmt.Sprintf("http://%s/api/stat/group?stream_name=innertest", addr))
nazalog.Assert(nil, err)
nazalog.Debugf("%s", string(b))
Log.Assert(nil, err)
Log.Debugf("%s", string(b))
b, err = httpGet(fmt.Sprintf("http://%s/api/stat/all_group", addr))
nazalog.Assert(nil, err)
nazalog.Debugf("%s", string(b))
Log.Assert(nil, err)
Log.Debugf("%s", string(b))
var acspr base.ApiCtrlStartPullReq
b, err = httpPost(fmt.Sprintf("http://%s/api/ctrl/start_pull", addr), &acspr)
nazalog.Assert(nil, err)
nazalog.Debugf("%s", string(b))
Log.Assert(nil, err)
Log.Debugf("%s", string(b))
var ackos base.ApiCtrlKickOutSession
b, err = httpPost(fmt.Sprintf("http://%s/api/ctrl/kick_out_session", addr), &ackos)
nazalog.Assert(nil, err)
nazalog.Debugf("%s", string(b))
Log.Assert(nil, err)
Log.Debugf("%s", string(b))
}
// TODO(chef): refactor 移入naza中

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package innertest
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -221,16 +221,16 @@ func LoadConfAndInitLog(confFile string) *Config {
cacheLog = append(cacheLog, fmt.Sprintf("log.assert_behavior=%s", config.LogConfig.AssertBehavior.ReadableString()))
}
if err := nazalog.Init(func(option *nazalog.Option) {
if err := Log.Init(func(option *nazalog.Option) {
*option = config.LogConfig
}); err != nil {
_, _ = fmt.Fprintf(os.Stderr, "initial log failed. err=%+v\n", err)
base.OsExitAndWaitPressIfWindows(1)
}
nazalog.Info("initial log succ.")
Log.Info("initial log succ.")
// 打印Logo
nazalog.Info(`
Log.Info(`
__ ___ __
/ / / | / /
/ / / /| | / /
@ -240,7 +240,7 @@ func LoadConfAndInitLog(confFile string) *Config {
// 检查配置版本号是否匹配
if config.ConfVersion != ConfVersion {
nazalog.Warnf("config version invalid. conf version of lalserver=%s, conf version of config file=%s",
Log.Warnf("config version invalid. conf version of lalserver=%s, conf version of config file=%s",
ConfVersion, config.ConfVersion)
}
@ -253,15 +253,15 @@ func LoadConfAndInitLog(confFile string) *Config {
"httpts.http_listen_addr", "httpts.https_listen_addr", "httpts.https_cert_file", "httpts.https_key_file",
)
if err != nil {
nazalog.Warnf("config nazajson collect not exist fields failed. err=%+v", err)
Log.Warnf("config nazajson collect not exist fields failed. err=%+v", err)
}
if len(notExistFields) != 0 {
nazalog.Warnf("config some fields do not exist which have been set to the zero value. fields=%+v", notExistFields)
Log.Warnf("config some fields do not exist which have been set to the zero value. fields=%+v", notExistFields)
}
// 日志字段检查,缺失的字段,打印前面设置的默认值
if len(cacheLog) > 0 {
nazalog.Warnf("config some log fields do not exist which have been set to default value. %s", strings.Join(cacheLog, ", "))
Log.Warnf("config some log fields do not exist which have been set to default value. %s", strings.Join(cacheLog, ", "))
}
// 如果具体的HTTP应用没有设置HTTP监听相关的配置则尝试使用全局配置
@ -271,39 +271,39 @@ func LoadConfAndInitLog(confFile string) *Config {
// 为缺失的字段中的一些特定字段,设置特定默认值
if config.HlsConfig.Enable && !j.Exist("hls.cleanup_mode") {
nazalog.Warnf("config hls.cleanup_mode not exist. set to default which is %d", defaultHlsCleanupMode)
Log.Warnf("config hls.cleanup_mode not exist. set to default which is %d", defaultHlsCleanupMode)
config.HlsConfig.CleanupMode = defaultHlsCleanupMode
}
if config.HlsConfig.Enable && !j.Exist("hls.delete_threshold") {
nazalog.Warnf("config hls.delete_threshold not exist. set to default same as hls.fragment_num which is %d",
Log.Warnf("config hls.delete_threshold not exist. set to default same as hls.fragment_num which is %d",
config.HlsConfig.FragmentNum)
config.HlsConfig.DeleteThreshold = config.HlsConfig.FragmentNum
}
if (config.HttpflvConfig.Enable || config.HttpflvConfig.EnableHttps) && !j.Exist("httpflv.url_pattern") {
nazalog.Warnf("config httpflv.url_pattern not exist. set to default wchich is %s", defaultHttpflvUrlPattern)
Log.Warnf("config httpflv.url_pattern not exist. set to default wchich is %s", defaultHttpflvUrlPattern)
config.HttpflvConfig.UrlPattern = defaultHttpflvUrlPattern
}
if (config.HttptsConfig.Enable || config.HttptsConfig.EnableHttps) && !j.Exist("httpts.url_pattern") {
nazalog.Warnf("config httpts.url_pattern not exist. set to default wchich is %s", defaultHttptsUrlPattern)
Log.Warnf("config httpts.url_pattern not exist. set to default wchich is %s", defaultHttptsUrlPattern)
config.HttptsConfig.UrlPattern = defaultHttptsUrlPattern
}
if (config.HlsConfig.Enable || config.HlsConfig.EnableHttps) && !j.Exist("hls.url_pattern") {
nazalog.Warnf("config hls.url_pattern not exist. set to default wchich is %s", defaultHlsUrlPattern)
Log.Warnf("config hls.url_pattern not exist. set to default wchich is %s", defaultHlsUrlPattern)
config.HttpflvConfig.UrlPattern = defaultHlsUrlPattern
}
// 对一些常见的格式错误做修复
// 确保url pattern以`/`开始,并以`/`结束
if urlPattern, changed := ensureStartAndEndWithSlash(config.HttpflvConfig.UrlPattern); changed {
nazalog.Warnf("fix config. httpflv.url_pattern %s -> %s", config.HttpflvConfig.UrlPattern, urlPattern)
Log.Warnf("fix config. httpflv.url_pattern %s -> %s", config.HttpflvConfig.UrlPattern, urlPattern)
config.HttpflvConfig.UrlPattern = urlPattern
}
if urlPattern, changed := ensureStartAndEndWithSlash(config.HttptsConfig.UrlPattern); changed {
nazalog.Warnf("fix config. httpts.url_pattern %s -> %s", config.HttptsConfig.UrlPattern, urlPattern)
Log.Warnf("fix config. httpts.url_pattern %s -> %s", config.HttptsConfig.UrlPattern, urlPattern)
config.HttpflvConfig.UrlPattern = urlPattern
}
if urlPattern, changed := ensureStartAndEndWithSlash(config.HlsConfig.UrlPattern); changed {
nazalog.Warnf("fix config. hls.url_pattern %s -> %s", config.HlsConfig.UrlPattern, urlPattern)
Log.Warnf("fix config. hls.url_pattern %s -> %s", config.HlsConfig.UrlPattern, urlPattern)
config.HttpflvConfig.UrlPattern = urlPattern
}
@ -318,7 +318,7 @@ func LoadConfAndInitLog(confFile string) *Config {
tlines = append(tlines, strings.TrimSpace(l))
}
compactRawContent := strings.Join(tlines, " ")
nazalog.Infof("load conf file succ. filename=%s, raw content=%s parsed=%+v", confFile, compactRawContent, config)
Log.Infof("load conf file succ. filename=%s, raw content=%s parsed=%+v", confFile, compactRawContent, config)
return config
}

@ -38,7 +38,6 @@ import (
"github.com/q191201771/lal/pkg/httpflv"
"github.com/q191201771/lal/pkg/rtmp"
"github.com/q191201771/naza/pkg/nazalog"
)
type GroupObserver interface {
@ -149,7 +148,7 @@ func NewGroup(appName string, streamName string, config *Config, observer GroupO
if config.RtmpConfig.MergeWriteSize > 0 {
g.rtmpMergeWriter = base.NewMergeWriter(g.writev2RtmpSubSessions, config.RtmpConfig.MergeWriteSize)
}
nazalog.Infof("[%s] lifecycle new group. group=%p, appName=%s, streamName=%s", uk, g, appName, streamName)
Log.Infof("[%s] lifecycle new group. group=%p, appName=%s, streamName=%s", uk, g, appName, streamName)
return g
}
@ -176,14 +175,14 @@ func (group *Group) Tick() {
if group.tickCount%checkSessionAliveIntervalSec == 0 {
if group.rtmpPubSession != nil {
if readAlive, _ := group.rtmpPubSession.IsAlive(); !readAlive {
nazalog.Warnf("[%s] session timeout. session=%s", group.UniqueKey, group.rtmpPubSession.UniqueKey())
Log.Warnf("[%s] session timeout. session=%s", group.UniqueKey, group.rtmpPubSession.UniqueKey())
group.rtmpPubSession.Dispose()
group.rtmp2RtspRemuxer = nil
}
}
if group.rtspPubSession != nil {
if readAlive, _ := group.rtspPubSession.IsAlive(); !readAlive {
nazalog.Warnf("[%s] session timeout. session=%s", group.UniqueKey, group.rtspPubSession.UniqueKey())
Log.Warnf("[%s] session timeout. session=%s", group.UniqueKey, group.rtspPubSession.UniqueKey())
group.rtspPubSession.Dispose()
group.rtspPubSession = nil
group.rtsp2RtmpRemuxer = nil
@ -191,35 +190,35 @@ func (group *Group) Tick() {
}
if group.pullProxy.pullSession != nil {
if readAlive, _ := group.pullProxy.pullSession.IsAlive(); !readAlive {
nazalog.Warnf("[%s] session timeout. session=%s", group.UniqueKey, group.pullProxy.pullSession.UniqueKey())
Log.Warnf("[%s] session timeout. session=%s", group.UniqueKey, group.pullProxy.pullSession.UniqueKey())
group.pullProxy.pullSession.Dispose()
group.delRtmpPullSession(group.pullProxy.pullSession)
}
}
for session := range group.rtmpSubSessionSet {
if _, writeAlive := session.IsAlive(); !writeAlive {
nazalog.Warnf("[%s] session timeout. session=%s", group.UniqueKey, session.UniqueKey())
Log.Warnf("[%s] session timeout. session=%s", group.UniqueKey, session.UniqueKey())
session.Dispose()
group.delRtmpSubSession(session)
}
}
for session := range group.httpflvSubSessionSet {
if _, writeAlive := session.IsAlive(); !writeAlive {
nazalog.Warnf("[%s] session timeout. session=%s", group.UniqueKey, session.UniqueKey())
Log.Warnf("[%s] session timeout. session=%s", group.UniqueKey, session.UniqueKey())
session.Dispose()
group.delHttpflvSubSession(session)
}
}
for session := range group.httptsSubSessionSet {
if _, writeAlive := session.IsAlive(); !writeAlive {
nazalog.Warnf("[%s] session timeout. session=%s", group.UniqueKey, session.UniqueKey())
Log.Warnf("[%s] session timeout. session=%s", group.UniqueKey, session.UniqueKey())
session.Dispose()
group.delHttptsSubSession(session)
}
}
for session := range group.rtspSubSessionSet {
if _, writeAlive := session.IsAlive(); !writeAlive {
nazalog.Warnf("[%s] session timeout. session=%s", group.UniqueKey, session.UniqueKey())
Log.Warnf("[%s] session timeout. session=%s", group.UniqueKey, session.UniqueKey())
session.Dispose()
group.delRtspSubSession(session)
}
@ -259,7 +258,7 @@ func (group *Group) Tick() {
// 值得一提如果是从其他协程回调回来的消息在使用Group中的资源前要判断资源是否存在以及可用。
//
func (group *Group) Dispose() {
nazalog.Infof("[%s] lifecycle dispose group.", group.UniqueKey)
Log.Infof("[%s] lifecycle dispose group.", group.UniqueKey)
group.exitChan <- struct{}{}
group.mutex.Lock()
@ -306,14 +305,14 @@ func (group *Group) Dispose() {
// ---------------------------------------------------------------------------------------------------------------------
func (group *Group) AddRtmpPubSession(session *rtmp.ServerSession) error {
nazalog.Debugf("[%s] [%s] add PubSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] add PubSession into group.", group.UniqueKey, session.UniqueKey())
group.mutex.Lock()
defer group.mutex.Unlock()
if group.hasInSession() {
// TODO(chef): [refactor] 打印in session
nazalog.Errorf("[%s] in stream already exist at group. add=%s", group.UniqueKey, session.UniqueKey())
Log.Errorf("[%s] in stream already exist at group. add=%s", group.UniqueKey, session.UniqueKey())
return base.ErrDupInStream
}
@ -343,13 +342,13 @@ func (group *Group) AddRtmpPubSession(session *rtmp.ServerSession) error {
// TODO chef: rtsp package中增加回调返回值判断如果是false将连接关掉
func (group *Group) AddRtspPubSession(session *rtsp.PubSession) error {
nazalog.Debugf("[%s] [%s] add RTSP PubSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] add RTSP PubSession into group.", group.UniqueKey, session.UniqueKey())
group.mutex.Lock()
defer group.mutex.Unlock()
if group.hasInSession() {
nazalog.Errorf("[%s] in stream already exist at group. wanna add=%s", group.UniqueKey, session.UniqueKey())
Log.Errorf("[%s] in stream already exist at group. wanna add=%s", group.UniqueKey, session.UniqueKey())
return base.ErrDupInStream
}
@ -365,13 +364,13 @@ func (group *Group) AddRtspPubSession(session *rtsp.PubSession) error {
}
func (group *Group) AddRtmpPullSession(session *rtmp.PullSession) bool {
nazalog.Debugf("[%s] [%s] add PullSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] add PullSession into group.", group.UniqueKey, session.UniqueKey())
group.mutex.Lock()
defer group.mutex.Unlock()
if group.hasInSession() {
nazalog.Errorf("[%s] in stream already exist. wanna add=%s", group.UniqueKey, session.UniqueKey())
Log.Errorf("[%s] in stream already exist. wanna add=%s", group.UniqueKey, session.UniqueKey())
return false
}
@ -404,7 +403,7 @@ func (group *Group) DelRtmpPullSession(session *rtmp.PullSession) {
// ---------------------------------------------------------------------------------------------------------------------
func (group *Group) AddRtmpSubSession(session *rtmp.ServerSession) {
nazalog.Debugf("[%s] [%s] add SubSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] add SubSession into group.", group.UniqueKey, session.UniqueKey())
group.mutex.Lock()
defer group.mutex.Unlock()
group.rtmpSubSessionSet[session] = struct{}{}
@ -421,7 +420,7 @@ func (group *Group) AddRtmpSubSession(session *rtmp.ServerSession) {
}
func (group *Group) AddHttpflvSubSession(session *httpflv.SubSession) {
nazalog.Debugf("[%s] [%s] add httpflv SubSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] add httpflv SubSession into group.", group.UniqueKey, session.UniqueKey())
session.WriteHttpResponseHeader()
session.WriteFlvHeader()
@ -440,7 +439,7 @@ func (group *Group) AddHttpflvSubSession(session *httpflv.SubSession) {
// 这里应该也要考虑触发hls muxer开启
// 也即HTTPTS sub需要使用hls muxerhls muxer开启和关闭都要考虑HTTPTS sub
func (group *Group) AddHttptsSubSession(session *httpts.SubSession) {
nazalog.Debugf("[%s] [%s] add httpts SubSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] add httpts SubSession into group.", group.UniqueKey, session.UniqueKey())
session.WriteHttpResponseHeader()
group.mutex.Lock()
@ -455,7 +454,7 @@ func (group *Group) HandleNewRtspSubSessionDescribe(session *rtsp.SubSession) (o
defer group.mutex.Unlock()
// TODO(chef): 应该有等待机制,而不是直接关闭
if group.sdpCtx == nil {
nazalog.Warnf("[%s] close rtsp subSession while describe but sdp not exist. [%s]",
Log.Warnf("[%s] close rtsp subSession while describe but sdp not exist. [%s]",
group.UniqueKey, session.UniqueKey())
return false, nil
}
@ -464,7 +463,7 @@ func (group *Group) HandleNewRtspSubSessionDescribe(session *rtsp.SubSession) (o
}
func (group *Group) HandleNewRtspSubSessionPlay(session *rtsp.SubSession) {
nazalog.Debugf("[%s] [%s] add rtsp SubSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] add rtsp SubSession into group.", group.UniqueKey, session.UniqueKey())
group.mutex.Lock()
defer group.mutex.Unlock()
@ -477,7 +476,7 @@ func (group *Group) HandleNewRtspSubSessionPlay(session *rtsp.SubSession) {
}
func (group *Group) AddRtmpPushSession(url string, session *rtmp.PushSession) {
nazalog.Debugf("[%s] [%s] add rtmp PushSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] add rtmp PushSession into group.", group.UniqueKey, session.UniqueKey())
group.mutex.Lock()
defer group.mutex.Unlock()
if group.url2PushProxy != nil {
@ -504,14 +503,14 @@ func (group *Group) DelHttptsSubSession(session *httpts.SubSession) {
}
func (group *Group) DelRtspSubSession(session *rtsp.SubSession) {
nazalog.Debugf("[%s] [%s] del rtsp SubSession from group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del rtsp SubSession from group.", group.UniqueKey, session.UniqueKey())
group.mutex.Lock()
defer group.mutex.Unlock()
delete(group.rtspSubSessionSet, session)
}
func (group *Group) DelRtmpPushSession(url string, session *rtmp.PushSession) {
nazalog.Debugf("[%s] [%s] del rtmp PushSession into group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del rtmp PushSession into group.", group.UniqueKey, session.UniqueKey())
group.mutex.Lock()
defer group.mutex.Unlock()
if group.url2PushProxy != nil {
@ -607,7 +606,7 @@ func (group *Group) KickOutSession(sessionId string) bool {
group.mutex.Lock()
defer group.mutex.Unlock()
nazalog.Infof("[%s] kick out session. session id=%s", group.UniqueKey, sessionId)
Log.Infof("[%s] kick out session. session id=%s", group.UniqueKey, sessionId)
if strings.HasPrefix(sessionId, base.UkPreRtmpServerSession) {
if group.rtmpPubSession != nil {
@ -639,7 +638,7 @@ func (group *Group) KickOutSession(sessionId string) bool {
} else if strings.HasPrefix(sessionId, base.UkPreRtspSubSession) {
// TODO chef: impl me
} else {
nazalog.Errorf("[%s] kick out session while session id format invalid. %s", group.UniqueKey, sessionId)
Log.Errorf("[%s] kick out session while session id format invalid. %s", group.UniqueKey, sessionId)
}
return false
@ -661,10 +660,10 @@ func (group *Group) StartPull(url string) {
// ---------------------------------------------------------------------------------------------------------------------
func (group *Group) delRtmpPubSession(session *rtmp.ServerSession) {
nazalog.Debugf("[%s] [%s] del rtmp PubSession from group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del rtmp PubSession from group.", group.UniqueKey, session.UniqueKey())
if session != group.rtmpPubSession {
nazalog.Warnf("[%s] del rtmp pub session but not match. del session=%s, group session=%p", group.UniqueKey, session.UniqueKey(), group.rtmpPubSession)
Log.Warnf("[%s] del rtmp pub session but not match. del session=%s, group session=%p", group.UniqueKey, session.UniqueKey(), group.rtmpPubSession)
return
}
@ -675,10 +674,10 @@ func (group *Group) delRtmpPubSession(session *rtmp.ServerSession) {
}
func (group *Group) delRtspPubSession(session *rtsp.PubSession) {
nazalog.Debugf("[%s] [%s] del rtsp PubSession from group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del rtsp PubSession from group.", group.UniqueKey, session.UniqueKey())
if session != group.rtspPubSession {
nazalog.Warnf("[%s] del rtmp pub session but not match. del session=%s, group session=%p", group.UniqueKey, session.UniqueKey(), group.rtmpPubSession)
Log.Warnf("[%s] del rtmp pub session but not match. del session=%s, group session=%p", group.UniqueKey, session.UniqueKey(), group.rtmpPubSession)
return
}
@ -689,7 +688,7 @@ func (group *Group) delRtspPubSession(session *rtsp.PubSession) {
}
func (group *Group) delRtmpPullSession(session *rtmp.PullSession) {
nazalog.Debugf("[%s] [%s] del rtmp PullSession from group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del rtmp PullSession from group.", group.UniqueKey, session.UniqueKey())
group.pullProxy.pullSession = nil
group.setPullingFlag(false)
@ -697,22 +696,22 @@ func (group *Group) delRtmpPullSession(session *rtmp.PullSession) {
}
func (group *Group) delRtmpSubSession(session *rtmp.ServerSession) {
nazalog.Debugf("[%s] [%s] del rtmp SubSession from group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del rtmp SubSession from group.", group.UniqueKey, session.UniqueKey())
delete(group.rtmpSubSessionSet, session)
}
func (group *Group) delHttpflvSubSession(session *httpflv.SubSession) {
nazalog.Debugf("[%s] [%s] del httpflv SubSession from group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del httpflv SubSession from group.", group.UniqueKey, session.UniqueKey())
delete(group.httpflvSubSessionSet, session)
}
func (group *Group) delHttptsSubSession(session *httpts.SubSession) {
nazalog.Debugf("[%s] [%s] del httpts SubSession from group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del httpts SubSession from group.", group.UniqueKey, session.UniqueKey())
delete(group.httptsSubSessionSet, session)
}
func (group *Group) delRtspSubSession(session *rtsp.SubSession) {
nazalog.Debugf("[%s] [%s] del rtsp SubSession from group.", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] del rtsp SubSession from group.", group.UniqueKey, session.UniqueKey())
delete(group.rtspSubSessionSet, session)
}
@ -744,7 +743,7 @@ func (group *Group) pushIfNeeded() {
if urlParam != "" {
urlWithParam += "?" + urlParam
}
nazalog.Infof("[%s] start relay push. url=%s", group.UniqueKey, urlWithParam)
Log.Infof("[%s] start relay push. url=%s", group.UniqueKey, urlWithParam)
go func(u, u2 string) {
pushSession := rtmp.NewPushSession(func(option *rtmp.PushSessionOption) {
@ -753,13 +752,13 @@ func (group *Group) pushIfNeeded() {
})
err := pushSession.Push(u2)
if err != nil {
nazalog.Errorf("[%s] relay push done. err=%v", pushSession.UniqueKey(), err)
Log.Errorf("[%s] relay push done. err=%v", pushSession.UniqueKey(), err)
group.DelRtmpPushSession(u, pushSession)
return
}
group.AddRtmpPushSession(u, pushSession)
err = <-pushSession.WaitChan()
nazalog.Infof("[%s] relay push done. err=%v", pushSession.UniqueKey(), err)
Log.Infof("[%s] relay push done. err=%v", pushSession.UniqueKey(), err)
group.DelRtmpPushSession(u, pushSession)
}(url, urlWithParam)
}
@ -805,7 +804,7 @@ func (group *Group) addIn() {
// 是否启动hls
if group.config.HlsConfig.Enable {
if group.hlsMuxer != nil {
nazalog.Errorf("[%s] hls muxer exist while addIn. muxer=%+v", group.UniqueKey, group.hlsMuxer)
Log.Errorf("[%s] hls muxer exist while addIn. muxer=%+v", group.UniqueKey, group.hlsMuxer)
}
enable := group.config.HlsConfig.Enable || group.config.HlsConfig.EnableHttps
group.hlsMuxer = hls.NewMuxer(group.streamName, enable, &group.config.HlsConfig.MuxerConfig, group)
@ -824,20 +823,20 @@ func (group *Group) addIn() {
filename := fmt.Sprintf("%s-%d.flv", group.streamName, now)
filenameWithPath := filepath.Join(group.config.RecordConfig.FlvOutPath, filename)
if group.recordFlv != nil {
nazalog.Errorf("[%s] record flv but already exist. new filename=%s, old filename=%s",
Log.Errorf("[%s] record flv but already exist. new filename=%s, old filename=%s",
group.UniqueKey, filenameWithPath, group.recordFlv.Name())
if err := group.recordFlv.Dispose(); err != nil {
nazalog.Errorf("[%s] record flv dispose error. err=%+v", group.UniqueKey, err)
Log.Errorf("[%s] record flv dispose error. err=%+v", group.UniqueKey, err)
}
}
group.recordFlv = &httpflv.FlvFileWriter{}
if err := group.recordFlv.Open(filenameWithPath); err != nil {
nazalog.Errorf("[%s] record flv open file failed. filename=%s, err=%+v",
Log.Errorf("[%s] record flv open file failed. filename=%s, err=%+v",
group.UniqueKey, filenameWithPath, err)
group.recordFlv = nil
}
if err := group.recordFlv.WriteFlvHeader(); err != nil {
nazalog.Errorf("[%s] record flv write flv header failed. filename=%s, err=%+v",
Log.Errorf("[%s] record flv write flv header failed. filename=%s, err=%+v",
group.UniqueKey, filenameWithPath, err)
group.recordFlv = nil
}
@ -848,15 +847,15 @@ func (group *Group) addIn() {
filename := fmt.Sprintf("%s-%d.ts", group.streamName, now)
filenameWithPath := filepath.Join(group.config.RecordConfig.MpegtsOutPath, filename)
if group.recordMpegts != nil {
nazalog.Errorf("[%s] record mpegts but already exist. new filename=%s, old filename=%s",
Log.Errorf("[%s] record mpegts but already exist. new filename=%s, old filename=%s",
group.UniqueKey, filenameWithPath, group.recordMpegts.Name())
if err := group.recordMpegts.Dispose(); err != nil {
nazalog.Errorf("[%s] record mpegts dispose error. err=%+v", group.UniqueKey, err)
Log.Errorf("[%s] record mpegts dispose error. err=%+v", group.UniqueKey, err)
}
}
group.recordMpegts = &mpegts.FileWriter{}
if err := group.recordMpegts.Create(filenameWithPath); err != nil {
nazalog.Errorf("[%s] record mpegts open file failed. filename=%s, err=%+v",
Log.Errorf("[%s] record mpegts open file failed. filename=%s, err=%+v",
group.UniqueKey, filenameWithPath, err)
group.recordFlv = nil
}
@ -885,7 +884,7 @@ func (group *Group) delIn() {
if group.config.RecordConfig.EnableFlv {
if group.recordFlv != nil {
if err := group.recordFlv.Dispose(); err != nil {
nazalog.Errorf("[%s] record flv dispose error. err=%+v", group.UniqueKey, err)
Log.Errorf("[%s] record flv dispose error. err=%+v", group.UniqueKey, err)
}
group.recordFlv = nil
}
@ -895,7 +894,7 @@ func (group *Group) delIn() {
if group.config.RecordConfig.EnableMpegts {
if group.recordMpegts != nil {
if err := group.recordMpegts.Dispose(); err != nil {
nazalog.Errorf("[%s] record mpegts dispose error. err=%+v", group.UniqueKey, err)
Log.Errorf("[%s] record mpegts dispose error. err=%+v", group.UniqueKey, err)
}
group.recordMpegts = nil
}
@ -951,7 +950,7 @@ func (group *Group) OnSdp(sdpCtx sdp.LogicContext) {
func (group *Group) OnAvPacket(pkt base.AvPacket) {
group.mutex.Lock()
defer group.mutex.Unlock()
//nazalog.Debugf("[%s] > Group::OnAvPacket. type=%s, ts=%d, len=%d", group.UniqueKey, pkt.PayloadType.ReadableString(), pkt.Timestamp, len(pkt.Payload))
//Log.Debugf("[%s] > Group::OnAvPacket. type=%s, ts=%d, len=%d", group.UniqueKey, pkt.PayloadType.ReadableString(), pkt.Timestamp, len(pkt.Payload))
group.rtsp2RtmpRemuxer.OnAvPacket(pkt)
}
@ -962,7 +961,7 @@ func (group *Group) OnPatPmt(b []byte) {
if group.recordMpegts != nil {
if err := group.recordMpegts.Write(b); err != nil {
nazalog.Errorf("[%s] record mpegts write fragment header error. err=%+v", group.UniqueKey, err)
Log.Errorf("[%s] record mpegts write fragment header error. err=%+v", group.UniqueKey, err)
}
}
}
@ -985,7 +984,7 @@ func (group *Group) OnTsPackets(rawFrame []byte, boundary bool) {
if group.recordMpegts != nil {
if err := group.recordMpegts.Write(rawFrame); err != nil {
nazalog.Errorf("[%s] record mpegts write error. err=%+v", group.UniqueKey, err)
Log.Errorf("[%s] record mpegts write error. err=%+v", group.UniqueKey, err)
}
}
}
@ -1003,7 +1002,7 @@ func (group *Group) broadcastByRtmpMsg(msg base.RtmpMsg) {
)
if len(msg.Payload) == 0 {
nazalog.Warnf("[%s] msg payload length is 0. %+v", group.UniqueKey, msg.Header)
Log.Warnf("[%s] msg payload length is 0. %+v", group.UniqueKey, msg.Header)
return
}
@ -1020,7 +1019,7 @@ func (group *Group) broadcastByRtmpMsg(msg base.RtmpMsg) {
// # 设置好用于发送的 rtmp 头部信息
currHeader := remux.MakeDefaultRtmpHeader(msg.Header)
if currHeader.MsgLen != uint32(len(msg.Payload)) {
nazalog.Errorf("[%s] diff. msgLen=%d, payload len=%d, %+v", group.UniqueKey, currHeader.MsgLen, len(msg.Payload), msg.Header)
Log.Errorf("[%s] diff. msgLen=%d, payload len=%d, %+v", group.UniqueKey, currHeader.MsgLen, len(msg.Payload), msg.Header)
}
// # 懒初始化rtmp chunk切片以及httpflv转换
@ -1033,15 +1032,15 @@ func (group *Group) broadcastByRtmpMsg(msg base.RtmpMsg) {
if session.IsFresh {
// TODO chef: 头信息和full gop也可以在SubSession刚加入时发送
if group.rtmpGopCache.Metadata != nil {
nazalog.Debugf("[%s] [%s] write metadata", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] write metadata", group.UniqueKey, session.UniqueKey())
_ = session.Write(group.rtmpGopCache.Metadata)
}
if group.rtmpGopCache.VideoSeqHeader != nil {
nazalog.Debugf("[%s] [%s] write vsh", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] write vsh", group.UniqueKey, session.UniqueKey())
_ = session.Write(group.rtmpGopCache.VideoSeqHeader)
}
if group.rtmpGopCache.AacSeqHeader != nil {
nazalog.Debugf("[%s] [%s] write ash", group.UniqueKey, session.UniqueKey())
Log.Debugf("[%s] [%s] write ash", group.UniqueKey, session.UniqueKey())
_ = session.Write(group.rtmpGopCache.AacSeqHeader)
}
gopCount := group.rtmpGopCache.GetGopCount()
@ -1049,7 +1048,7 @@ func (group *Group) broadcastByRtmpMsg(msg base.RtmpMsg) {
// GOP缓存中肯定包含了关键帧
session.ShouldWaitVideoKeyFrame = false
nazalog.Debugf("[%s] [%s] write gop cache. gop num=%d", group.UniqueKey, session.UniqueKey(), gopCount)
Log.Debugf("[%s] [%s] write gop cache. gop num=%d", group.UniqueKey, session.UniqueKey(), gopCount)
}
for i := 0; i < gopCount; i++ {
for _, item := range group.rtmpGopCache.GetGopDataAt(i) {
@ -1157,7 +1156,7 @@ func (group *Group) broadcastByRtmpMsg(msg base.RtmpMsg) {
// # 录制flv文件
if group.recordFlv != nil {
if err := group.recordFlv.WriteRaw(lrm2ft.Get()); err != nil {
nazalog.Errorf("[%s] record flv write error. err=%+v", group.UniqueKey, err)
Log.Errorf("[%s] record flv write error. err=%+v", group.UniqueKey, err)
}
}
@ -1317,7 +1316,7 @@ func (group *Group) pullIfNeeded() {
}
group.setPullingFlag(true)
nazalog.Infof("[%s] start relay pull. url=%s", group.UniqueKey, group.getPullUrl())
Log.Infof("[%s] start relay pull. url=%s", group.UniqueKey, group.getPullUrl())
go func() {
pullSession := rtmp.NewPullSession(func(option *rtmp.PullSessionOption) {
@ -1327,14 +1326,14 @@ func (group *Group) pullIfNeeded() {
// TODO(chef): 处理数据回调是否应该等待Add成功之后。避免竞态条件中途加入了其他in session
err := pullSession.Pull(group.getPullUrl(), group.OnReadRtmpAvMsg)
if err != nil {
nazalog.Errorf("[%s] relay pull fail. err=%v", pullSession.UniqueKey(), err)
Log.Errorf("[%s] relay pull fail. err=%v", pullSession.UniqueKey(), err)
group.DelRtmpPullSession(pullSession)
return
}
res := group.AddRtmpPullSession(pullSession)
if res {
err = <-pullSession.WaitChan()
nazalog.Infof("[%s] relay pull done. err=%v", pullSession.UniqueKey(), err)
Log.Infof("[%s] relay pull done. err=%v", pullSession.UniqueKey(), err)
group.DelRtmpPullSession(pullSession)
} else {
pullSession.Dispose()
@ -1350,7 +1349,7 @@ func (group *Group) pullIfNeeded() {
func (group *Group) stopPullIfNeeded() {
// 没有输出型的流了
if group.pullProxy.pullSession != nil && !group.hasOutSession() {
nazalog.Infof("[%s] stop pull since no sub session.", group.UniqueKey)
Log.Infof("[%s] stop pull since no sub session.", group.UniqueKey)
group.pullProxy.pullSession.Dispose()
}
}

@ -16,7 +16,6 @@ import (
"github.com/q191201771/naza/pkg/nazahttp"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
)
type HttpApiServer struct {
@ -37,7 +36,7 @@ func (h *HttpApiServer) Listen() (err error) {
if h.ln, err = net.Listen("tcp", h.addr); err != nil {
return
}
nazalog.Infof("start httpapi server listen. addr=%s", h.addr)
Log.Infof("start httpapi server listen. addr=%s", h.addr)
return
}
@ -106,13 +105,13 @@ func (h *HttpApiServer) ctrlStartPullHandler(w http.ResponseWriter, req *http.Re
err := nazahttp.UnmarshalRequestJsonBody(req, &info, "protocol", "addr", "app_name", "stream_name")
if err != nil {
nazalog.Warnf("http api start pull error. err=%+v", err)
Log.Warnf("http api start pull error. err=%+v", err)
v.ErrorCode = base.ErrorCodeParamMissing
v.Desp = base.DespParamMissing
feedback(v, w)
return
}
nazalog.Infof("http api start pull. req info=%+v", info)
Log.Infof("http api start pull. req info=%+v", info)
h.sm.CtrlStartPull(info)
v.ErrorCode = base.ErrorCodeSucc
@ -127,13 +126,13 @@ func (h *HttpApiServer) ctrlKickOutSessionHandler(w http.ResponseWriter, req *ht
err := nazahttp.UnmarshalRequestJsonBody(req, &info, "stream_name", "session_id")
if err != nil {
nazalog.Warnf("http api kick out session error. err=%+v", err)
Log.Warnf("http api kick out session error. err=%+v", err)
v.ErrorCode = base.ErrorCodeParamMissing
v.Desp = base.DespParamMissing
feedback(v, w)
return
}
nazalog.Infof("http api kick out session. req info=%+v", info)
Log.Infof("http api kick out session. req info=%+v", info)
resp := h.sm.CtrlKickOutSession(info)
feedback(resp, w)

@ -15,9 +15,9 @@ import (
func TestHttpApiServer(t *testing.T) {
//s := logic.NewHttpApiServer(":8083")
//if err := s.Listen(); err != nil {
// nazalog.Error(err)
// Log.Error(err)
// return
//}
//err := s.RunLoop()
//nazalog.Error(err)
//Log.Error(err)
}

@ -14,7 +14,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazahttp"
"github.com/q191201771/naza/pkg/nazalog"
)
// TODO(chef): refactor 配置参数供外部传入
@ -132,12 +131,12 @@ func (h *HttpNotify) asyncPost(url string, info interface{}) {
case h.taskQueue <- PostTask{url: url, info: info}:
// noop
default:
nazalog.Error("http notify queue full.")
Log.Error("http notify queue full.")
}
}
func (h *HttpNotify) post(url string, info interface{}) {
if _, err := nazahttp.PostJson(url, info, h.client); err != nil {
nazalog.Errorf("http notify post error. err=%+v", err)
Log.Errorf("http notify post error. err=%+v", err)
}
}

@ -15,7 +15,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/httpflv"
"github.com/q191201771/lal/pkg/httpts"
"github.com/q191201771/naza/pkg/nazalog"
)
type HttpServerHandlerObserver interface {
@ -45,17 +44,17 @@ func NewHttpServerHandler(observer HttpServerHandlerObserver) *HttpServerHandler
func (h *HttpServerHandler) ServeSubSession(writer http.ResponseWriter, req *http.Request) {
urlCtx, err := base.ParseUrl(base.ParseHttpRequest(req), 80)
if err != nil {
nazalog.Errorf("parse url. err=%+v", err)
Log.Errorf("parse url. err=%+v", err)
return
}
conn, bio, err := writer.(http.Hijacker).Hijack()
if err != nil {
nazalog.Errorf("hijack failed. err=%+v", err)
Log.Errorf("hijack failed. err=%+v", err)
return
}
if bio.Reader.Buffered() != 0 || bio.Writer.Buffered() != 0 {
nazalog.Errorf("hijack but buffer not empty. rb=%d, wb=%d", bio.Reader.Buffered(), bio.Writer.Buffered())
Log.Errorf("hijack but buffer not empty. rb=%d, wb=%d", bio.Reader.Buffered(), bio.Writer.Buffered())
}
var (
@ -69,28 +68,28 @@ func (h *HttpServerHandler) ServeSubSession(writer http.ResponseWriter, req *htt
if strings.HasSuffix(urlCtx.LastItemOfPath, ".flv") {
session := httpflv.NewSubSession(conn, urlCtx, isWebSocket, webSocketKey)
nazalog.Debugf("[%s] < read http request. url=%s", session.UniqueKey(), session.Url())
Log.Debugf("[%s] < read http request. url=%s", session.UniqueKey(), session.Url())
if err = h.observer.OnNewHttpflvSubSession(session); err != nil {
nazalog.Infof("[%s] dispose by observer. err=%+v", session.UniqueKey(), err)
Log.Infof("[%s] dispose by observer. err=%+v", session.UniqueKey(), err)
_ = session.Dispose()
return
}
err = session.RunLoop()
nazalog.Debugf("[%s] httpflv sub session loop done. err=%v", session.UniqueKey(), err)
Log.Debugf("[%s] httpflv sub session loop done. err=%v", session.UniqueKey(), err)
h.observer.OnDelHttpflvSubSession(session)
return
}
if strings.HasSuffix(urlCtx.LastItemOfPath, ".ts") {
session := httpts.NewSubSession(conn, urlCtx, isWebSocket, webSocketKey)
nazalog.Debugf("[%s] < read http request. url=%s", session.UniqueKey(), session.Url())
Log.Debugf("[%s] < read http request. url=%s", session.UniqueKey(), session.Url())
if err = h.observer.OnNewHttptsSubSession(session); err != nil {
nazalog.Infof("[%s] dispose by observer. err=%+v", session.UniqueKey(), err)
Log.Infof("[%s] dispose by observer. err=%+v", session.UniqueKey(), err)
_ = session.Dispose()
return
}
err = session.RunLoop()
nazalog.Debugf("[%s] httpts sub session loop done. err=%v", session.UniqueKey(), err)
Log.Debugf("[%s] httpts sub session loop done. err=%v", session.UniqueKey(), err)
h.observer.OnDelHttptsSubSession(session)
return
}

@ -31,7 +31,6 @@ import (
"github.com/q191201771/lal/pkg/httpflv"
"github.com/q191201771/lal/pkg/rtmp"
"github.com/q191201771/naza/pkg/nazalog"
//"github.com/felixge/fgprof"
)
@ -66,16 +65,16 @@ func NewServerManager(confFile string, modOption ...ModOption) *ServerManager {
base.LogoutStartInfo()
if sm.config.HlsConfig.Enable && sm.config.HlsConfig.UseMemoryAsDiskFlag {
nazalog.Infof("hls use memory as disk.")
Log.Infof("hls use memory as disk.")
hls.SetUseMemoryAsDiskFlag(true)
}
if sm.config.RecordConfig.EnableFlv {
if err := os.MkdirAll(sm.config.RecordConfig.FlvOutPath, 0777); err != nil {
nazalog.Errorf("record flv mkdir error. path=%s, err=%+v", sm.config.RecordConfig.FlvOutPath, err)
Log.Errorf("record flv mkdir error. path=%s, err=%+v", sm.config.RecordConfig.FlvOutPath, err)
}
if err := os.MkdirAll(sm.config.RecordConfig.MpegtsOutPath, 0777); err != nil {
nazalog.Errorf("record mpegts mkdir error. path=%s, err=%+v", sm.config.RecordConfig.MpegtsOutPath, err)
Log.Errorf("record mpegts mkdir error. path=%s, err=%+v", sm.config.RecordConfig.MpegtsOutPath, err)
}
}
@ -132,10 +131,10 @@ func (sm *ServerManager) RunLoop() error {
handler,
)
if err != nil {
nazalog.Errorf("add http listen for %s failed. addr=%s, pattern=%s, err=%+v", name, config.HttpListenAddr, config.UrlPattern, err)
Log.Errorf("add http listen for %s failed. addr=%s, pattern=%s, err=%+v", name, config.HttpListenAddr, config.UrlPattern, err)
return err
}
nazalog.Infof("add http listen for %s. addr=%s, pattern=%s", name, config.HttpListenAddr, config.UrlPattern)
Log.Infof("add http listen for %s. addr=%s, pattern=%s", name, config.HttpListenAddr, config.UrlPattern)
}
if config.EnableHttps {
err := sm.httpServerManager.AddListen(
@ -144,9 +143,9 @@ func (sm *ServerManager) RunLoop() error {
handler,
)
if err != nil {
nazalog.Errorf("add https listen for %s failed. addr=%s, pattern=%s, err=%+v", name, config.HttpsListenAddr, config.UrlPattern, err)
Log.Errorf("add https listen for %s failed. addr=%s, pattern=%s, err=%+v", name, config.HttpsListenAddr, config.UrlPattern, err)
} else {
nazalog.Infof("add https listen for %s. addr=%s, pattern=%s", name, config.HttpsListenAddr, config.UrlPattern)
Log.Infof("add https listen for %s. addr=%s, pattern=%s", name, config.HttpsListenAddr, config.UrlPattern)
}
}
return nil
@ -165,7 +164,7 @@ func (sm *ServerManager) RunLoop() error {
if sm.httpServerManager != nil {
go func() {
if err := sm.httpServerManager.RunLoop(); err != nil {
nazalog.Error(err)
Log.Error(err)
}
}()
}
@ -176,7 +175,7 @@ func (sm *ServerManager) RunLoop() error {
}
go func() {
if err := sm.rtmpServer.RunLoop(); err != nil {
nazalog.Error(err)
Log.Error(err)
}
}()
}
@ -187,7 +186,7 @@ func (sm *ServerManager) RunLoop() error {
}
go func() {
if err := sm.rtspServer.RunLoop(); err != nil {
nazalog.Error(err)
Log.Error(err)
}
}()
}
@ -198,7 +197,7 @@ func (sm *ServerManager) RunLoop() error {
}
go func() {
if err := sm.httpApiServer.RunLoop(); err != nil {
nazalog.Error(err)
Log.Error(err)
}
}()
}
@ -224,7 +223,7 @@ func (sm *ServerManager) RunLoop() error {
// 关闭空闲的group
sm.groupManager.Iterate(func(group *Group) bool {
if group.IsTotalEmpty() {
nazalog.Infof("erase empty group. [%s]", group.UniqueKey)
Log.Infof("erase empty group. [%s]", group.UniqueKey)
group.Dispose()
return false
}
@ -237,13 +236,13 @@ func (sm *ServerManager) RunLoop() error {
if sm.config.DebugConfig.LogGroupIntervalSec > 0 &&
count%uint32(sm.config.DebugConfig.LogGroupIntervalSec) == 0 {
groupNum := sm.groupManager.Len()
nazalog.Debugf("DEBUG_GROUP_LOG: group size=%d", groupNum)
Log.Debugf("DEBUG_GROUP_LOG: group size=%d", groupNum)
if sm.config.DebugConfig.LogGroupMaxGroupNum > 0 {
var loggedGroupCount int
sm.groupManager.Iterate(func(group *Group) bool {
loggedGroupCount++
if loggedGroupCount <= sm.config.DebugConfig.LogGroupMaxGroupNum {
nazalog.Debugf("DEBUG_GROUP_LOG: %d %s", loggedGroupCount, group.StringifyDebugStats(sm.config.DebugConfig.LogGroupMaxSubNumPerGroup))
Log.Debugf("DEBUG_GROUP_LOG: %d %s", loggedGroupCount, group.StringifyDebugStats(sm.config.DebugConfig.LogGroupMaxSubNumPerGroup))
}
return true
})
@ -265,7 +264,7 @@ func (sm *ServerManager) RunLoop() error {
}
func (sm *ServerManager) Dispose() {
nazalog.Debug("dispose server manager.")
Log.Debug("dispose server manager.")
// TODO(chef) add httpServer
@ -324,7 +323,7 @@ func (sm *ServerManager) CtrlStartPull(info base.ApiCtrlStartPullReq) {
defer sm.mutex.Unlock()
g := sm.getGroup(info.AppName, info.StreamName)
if g == nil {
nazalog.Warnf("group not exist, ignore start pull. streamName=%s", info.StreamName)
Log.Warnf("group not exist, ignore start pull. streamName=%s", info.StreamName)
return
}
var url string
@ -738,14 +737,14 @@ func (sm *ServerManager) CleanupHlsIfNeeded(appName string, streamName string, p
if g := sm.GetGroup(appName, streamName); g != nil {
if g.IsHlsMuxerAlive() {
nazalog.Warnf("cancel cleanup hls file path since hls muxer still alive. streamName=%s", streamName)
Log.Warnf("cancel cleanup hls file path since hls muxer still alive. streamName=%s", streamName)
return
}
}
nazalog.Infof("cleanup hls file path. streamName=%s, path=%s", streamName, outPath)
Log.Infof("cleanup hls file path. streamName=%s, path=%s", streamName, outPath)
if err := hls.RemoveAll(outPath); err != nil {
nazalog.Warnf("cleanup hls file path error. path=%s, err=%+v", outPath, err)
Log.Warnf("cleanup hls file path error. path=%s, err=%+v", outPath, err)
}
},
appName,
@ -785,12 +784,12 @@ func (sm *ServerManager) getGroup(appName string, streamName string) *Group {
func (sm *ServerManager) serveHls(writer http.ResponseWriter, req *http.Request) {
urlCtx, err := base.ParseUrl(base.ParseHttpRequest(req), 80)
if err != nil {
nazalog.Errorf("parse url. err=%+v", err)
Log.Errorf("parse url. err=%+v", err)
return
}
if urlCtx.GetFileType() == "m3u8" {
if err = sm.simpleAuthCtx.OnHls(urlCtx.GetFilenameWithoutType(), urlCtx.RawQuery); err != nil {
nazalog.Errorf("simple auth failed. err=%+v", err)
Log.Errorf("simple auth failed. err=%+v", err)
return
}
}
@ -799,13 +798,13 @@ func (sm *ServerManager) serveHls(writer http.ResponseWriter, req *http.Request)
}
func runWebPprof(addr string) {
nazalog.Infof("start web pprof listen. addr=%s", addr)
Log.Infof("start web pprof listen. addr=%s", addr)
//nazalog.Warn("start fgprof.")
//Log.Warn("start fgprof.")
//http.DefaultServeMux.Handle("/debug/fgprof", fgprof.Handler())
if err := http.ListenAndServe(addr, nil); err != nil {
nazalog.Error(err)
Log.Error(err)
return
}
}

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package logic
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -14,7 +14,6 @@ import (
"github.com/q191201771/lal/pkg/innertest"
"github.com/q191201771/lal/pkg/mpegts"
"github.com/q191201771/naza/pkg/nazalog"
)
func TestMpegts(t *testing.T) {
@ -23,12 +22,12 @@ func TestMpegts(t *testing.T) {
func TestParseFixedTsPacket(t *testing.T) {
h := mpegts.ParseTsPacketHeader(mpegts.FixedFragmentHeader)
nazalog.Debugf("%+v", h)
mpegts.Log.Debugf("%+v", h)
pat := mpegts.ParsePat(mpegts.FixedFragmentHeader[5:])
nazalog.Debugf("%+v", pat)
mpegts.Log.Debugf("%+v", pat)
h = mpegts.ParseTsPacketHeader(mpegts.FixedFragmentHeaderHevc[188:])
nazalog.Debugf("%+v", h)
mpegts.Log.Debugf("%+v", h)
pmt := mpegts.ParsePmt(mpegts.FixedFragmentHeader[188+5:])
nazalog.Debugf("%+v", pmt)
mpegts.Log.Debugf("%+v", pmt)
}

@ -10,7 +10,6 @@ package mpegts
import (
"github.com/q191201771/naza/pkg/nazabits"
"github.com/q191201771/naza/pkg/nazalog"
)
// ----------------------------------------
@ -79,7 +78,7 @@ func ParsePmt(b []byte) (pmt Pmt) {
_, _ = br.ReadBits8(4)
pmt.pil, _ = br.ReadBits16(12)
if pmt.pil != 0 {
nazalog.Warn(pmt.pil)
Log.Warn(pmt.pil)
_, _ = br.ReadBytes(uint(pmt.pil))
}
@ -91,7 +90,7 @@ func ParsePmt(b []byte) (pmt Pmt) {
_, _ = br.ReadBits8(4)
ppe.Length, _ = br.ReadBits16(12)
if ppe.Length != 0 {
nazalog.Warn(ppe.Length)
Log.Warn(ppe.Length)
_, _ = br.ReadBits32(uint(ppe.Length))
}
pmt.ProgramElements = append(pmt.ProgramElements, ppe)

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package mpegts
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -17,7 +17,6 @@ import (
"github.com/q191201771/lal/pkg/rtprtcp"
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/nazalog"
)
// AvPacket转换为RTMP
@ -76,14 +75,14 @@ func (r *AvPacket2RtmpRemuxer) InitWithAvConfig(asc, vps, sps, pps []byte) {
}
if r.audioType == base.AvPacketPtUnknown && r.videoType == base.AvPacketPtUnknown {
nazalog.Warn("has no audio or video")
Log.Warn("has no audio or video")
return
}
if r.audioType != base.AvPacketPtUnknown {
bAsh, err = aac.MakeAudioDataSeqHeaderWithAsc(asc)
if err != nil {
nazalog.Errorf("build aac seq header failed. err=%+v", err)
Log.Errorf("build aac seq header failed. err=%+v", err)
return
}
}
@ -92,13 +91,13 @@ func (r *AvPacket2RtmpRemuxer) InitWithAvConfig(asc, vps, sps, pps []byte) {
if r.videoType == base.AvPacketPtHevc {
bVsh, err = hevc.BuildSeqHeaderFromVpsSpsPps(vps, sps, pps)
if err != nil {
nazalog.Errorf("build hevc seq header failed. err=%+v", err)
Log.Errorf("build hevc seq header failed. err=%+v", err)
return
}
} else {
bVsh, err = avc.BuildSeqHeaderFromSpsPps(sps, pps)
if err != nil {
nazalog.Errorf("build avc seq header failed. err=%+v", err)
Log.Errorf("build avc seq header failed. err=%+v", err)
return
}
}
@ -122,7 +121,7 @@ func (r *AvPacket2RtmpRemuxer) FeedAvPacket(pkt base.AvPacket) {
case base.AvPacketPtHevc:
nals, err := avc.SplitNaluAvcc(pkt.Payload)
if err != nil {
nazalog.Errorf("iterate nalu failed. err=%+v", err)
Log.Errorf("iterate nalu failed. err=%+v", err)
return
}
@ -149,7 +148,7 @@ func (r *AvPacket2RtmpRemuxer) FeedAvPacket(pkt base.AvPacket) {
bVsh, err := avc.BuildSeqHeaderFromSpsPps(r.sps, r.pps)
if err != nil {
nazalog.Errorf("build avc seq header failed. err=%+v", err)
Log.Errorf("build avc seq header failed. err=%+v", err)
continue
}
r.emitRtmpAvMsg(false, bVsh, pkt.Timestamp)
@ -182,7 +181,7 @@ func (r *AvPacket2RtmpRemuxer) FeedAvPacket(pkt base.AvPacket) {
if len(r.vps) > 0 && len(r.sps) > 0 && len(r.pps) > 0 {
bVsh, err := hevc.BuildSeqHeaderFromVpsSpsPps(r.vps, r.sps, r.pps)
if err != nil {
nazalog.Errorf("build hevc seq header failed. err=%+v", err)
Log.Errorf("build hevc seq header failed. err=%+v", err)
continue
}
r.emitRtmpAvMsg(false, bVsh, pkt.Timestamp)
@ -217,7 +216,7 @@ func (r *AvPacket2RtmpRemuxer) FeedAvPacket(pkt base.AvPacket) {
copy(payload[2:], pkt.Payload)
r.emitRtmpAvMsg(true, payload, pkt.Timestamp)
default:
nazalog.Warnf("unsupported packet. type=%d", pkt.PayloadType)
Log.Warnf("unsupported packet. type=%d", pkt.PayloadType)
}
}
@ -237,7 +236,7 @@ func (r *AvPacket2RtmpRemuxer) emitRtmpAvMsg(isAudio bool, payload []byte, times
}
bMetadata, err := rtmp.BuildMetadata(-1, -1, audiocodecid, videocodecid)
if err != nil {
nazalog.Errorf("build metadata failed. err=%+v", err)
Log.Errorf("build metadata failed. err=%+v", err)
return
}
r.onRtmpAvMsg(base.RtmpMsg{

@ -14,7 +14,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/remux"
"github.com/q191201771/naza/pkg/nazalog"
)
// #85
@ -39,7 +38,7 @@ func TestCase1(t *testing.T) {
}
remuxer := remux.NewAvPacket2RtmpRemuxer(func(msg base.RtmpMsg) {
nazalog.Debugf("%+v", msg)
remux.Log.Debugf("%+v", msg)
})
for _, p := range golden {
remuxer.FeedAvPacket(p)
@ -78,7 +77,7 @@ func TestCase2(t *testing.T) {
}
remuxer := remux.NewAvPacket2RtmpRemuxer(func(msg base.RtmpMsg) {
nazalog.Debugf("%+v", msg)
remux.Log.Debugf("%+v", msg)
})
for _, p := range golden {
remuxer.FeedAvPacket(p)

@ -13,7 +13,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/rtmp"
"github.com/q191201771/naza/pkg/nazalog"
)
const (
@ -103,7 +102,7 @@ func (filter *DummyAudioFilter) handleAnalysisStage(msg base.RtmpMsg) {
}
// 达到阈值
nazalog.Debugf("[%s] start make dummy audio.", filter.uk)
Log.Debugf("[%s] start make dummy audio.", filter.uk)
filter.stage = dummyAudioFilterStageDummy
for i := range filter.earlyStageQueue {
filter.handleDummyStage(filter.earlyStageQueue[i])
@ -122,7 +121,7 @@ func (filter *DummyAudioFilter) handleNormalStage(msg base.RtmpMsg) {
func (filter *DummyAudioFilter) handleDummyStage(msg base.RtmpMsg) {
if msg.Header.MsgTypeId == base.RtmpTypeIdAudio {
// 由于我们已经开始制造静音包了,静音包的编码参数可能会和实际音频参数不一致,所以我们只能过滤掉原始的音频数据了
nazalog.Warnf("[%s] recv audio but we are making dummy audio.", filter.uk)
Log.Warnf("[%s] recv audio but we are making dummy audio.", filter.uk)
return
}

@ -17,7 +17,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/remux"
"github.com/q191201771/naza/pkg/assert"
"github.com/q191201771/naza/pkg/nazalog"
)
func TestDummyAudioFilter(t *testing.T) {
@ -116,7 +115,7 @@ func helperUnpackRtmpMsg(logstr string) base.RtmpMsg {
}
var fetchIntItemFn = func(str string, prefix string, suffix string) int {
ret, err := strconv.Atoi(fetchItemFn(str, prefix, suffix))
nazalog.Assert(nil, err)
remux.Log.Assert(nil, err)
return ret
}
@ -129,7 +128,7 @@ func helperUnpackRtmpMsg(logstr string) base.RtmpMsg {
hexStr := fetchItemFn(logstr, "payload=", "")
payload, err := hex.DecodeString(hexStr)
nazalog.Assert(nil, err)
remux.Log.Assert(nil, err)
return base.RtmpMsg{
Header: header,

@ -10,7 +10,6 @@ package remux
import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
)
// GopCache
@ -87,18 +86,18 @@ func (gc *GopCache) Feed(msg base.RtmpMsg, lg LazyGet) {
switch msg.Header.MsgTypeId {
case base.RtmpTypeIdMetadata:
gc.Metadata = lg()
nazalog.Debugf("[%s] cache %s metadata. size:%d", gc.uniqueKey, gc.t, len(gc.Metadata))
Log.Debugf("[%s] cache %s metadata. size:%d", gc.uniqueKey, gc.t, len(gc.Metadata))
return
case base.RtmpTypeIdAudio:
if msg.IsAacSeqHeader() {
gc.AacSeqHeader = lg()
nazalog.Debugf("[%s] cache %s aac seq header. size:%d", gc.uniqueKey, gc.t, len(gc.AacSeqHeader))
Log.Debugf("[%s] cache %s aac seq header. size:%d", gc.uniqueKey, gc.t, len(gc.AacSeqHeader))
return
}
case base.RtmpTypeIdVideo:
if msg.IsVideoKeySeqHeader() {
gc.VideoSeqHeader = lg()
nazalog.Debugf("[%s] cache %s video seq header. size:%d", gc.uniqueKey, gc.t, len(gc.VideoSeqHeader))
Log.Debugf("[%s] cache %s video seq header. size:%d", gc.uniqueKey, gc.t, len(gc.VideoSeqHeader))
return
}
}

@ -19,7 +19,6 @@ import (
"github.com/q191201771/lal/pkg/hevc"
"github.com/q191201771/lal/pkg/rtprtcp"
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/nazalog"
)
// TODO(chef): refactor 将analyze部分独立出来作为一个filter
@ -80,10 +79,10 @@ func (r *Rtmp2RtspRemuxer) FeedRtmpMsg(msg base.RtmpMsg) {
if msg.IsAvcKeySeqHeader() || msg.IsHevcKeySeqHeader() {
if msg.IsAvcKeySeqHeader() {
r.sps, r.pps, err = avc.ParseSpsPpsFromSeqHeader(msg.Payload)
nazalog.Assert(nil, err)
Log.Assert(nil, err)
} else if msg.IsHevcKeySeqHeader() {
r.vps, r.sps, r.pps, err = hevc.ParseVpsSpsPpsFromSeqHeader(msg.Payload)
nazalog.Assert(nil, err)
Log.Assert(nil, err)
}
r.doAnalyze()
return
@ -91,7 +90,7 @@ func (r *Rtmp2RtspRemuxer) FeedRtmpMsg(msg base.RtmpMsg) {
if msg.IsAacSeqHeader() {
if len(msg.Payload) < 3 {
nazalog.Warnf("aac seq header payload too short. len=%d, payload=%s", len(msg.Payload), hex.Dump(msg.Payload))
Log.Warnf("aac seq header payload too short. len=%d, payload=%s", len(msg.Payload), hex.Dump(msg.Payload))
return
}
r.asc = msg.Clone().Payload[2:]
@ -115,7 +114,7 @@ func (r *Rtmp2RtspRemuxer) FeedRtmpMsg(msg base.RtmpMsg) {
}
func (r *Rtmp2RtspRemuxer) doAnalyze() {
nazalog.Assert(false, r.analyzeDone)
Log.Assert(false, r.analyzeDone)
if r.isAnalyzeEnough() {
if r.sps != nil && r.pps != nil {
@ -131,7 +130,7 @@ func (r *Rtmp2RtspRemuxer) doAnalyze() {
// 回调sdp
ctx, err := sdp.Pack(r.vps, r.sps, r.pps, r.asc)
nazalog.Assert(nil, err)
Log.Assert(nil, err)
r.onSdp(ctx)
// 分析阶段缓存的数据
@ -189,11 +188,11 @@ func (r *Rtmp2RtspRemuxer) getAudioPacker() *rtprtcp.RtpPacker {
// TODO(chef): 如果rtmp不是以音视频头开始也可能收到了帧数据但是头不存在目前该remux没有做过多容错判断后续要加上或者在输入层保证
ascCtx, err := aac.NewAscContext(r.asc)
if err != nil {
nazalog.Errorf("parse asc failed. err=%+v", err)
Log.Errorf("parse asc failed. err=%+v", err)
}
clockRate, err := ascCtx.GetSamplingFrequency()
if err != nil {
nazalog.Errorf("get sampling frequency failed. err=%+v", err)
Log.Errorf("get sampling frequency failed. err=%+v", err)
}
pp := rtprtcp.NewRtpPackerPayloadAac()

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package remux
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -20,7 +20,6 @@ import (
"github.com/q191201771/naza/pkg/nazaerrors"
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/nazalog"
)
const (
@ -160,7 +159,7 @@ func (amf0) WriteObject(writer io.Writer, opa ObjectPairArray) error {
return err
}
default:
nazalog.Panicf("unknown value type. i=%d, v=%+v", i, opa[i].Value)
Log.Panicf("unknown value type. i=%d, v=%+v", i, opa[i].Value)
}
}
_, err := writer.Write(Amf0TypeMarkerObjectEndBytes)
@ -307,7 +306,7 @@ func (amf0) ReadObject(b []byte) (ObjectPairArray, int, error) {
}
index += l
default:
nazalog.Panicf("unknown type. vt=%d", vt)
Log.Panicf("unknown type. vt=%d", vt)
}
}
}
@ -366,7 +365,7 @@ func (amf0) ReadArray(b []byte) (ObjectPairArray, int, error) {
}
index += l
default:
nazalog.Panicf("unknown type. vt=%d", vt)
Log.Panicf("unknown type. vt=%d", vt)
}
}
@ -374,7 +373,7 @@ func (amf0) ReadArray(b []byte) (ObjectPairArray, int, error) {
index += 3
} else {
// 测试时发现Array最后也是以00 00 09结束不确定是否是标准规定的加个日志在这
nazalog.Warn("amf ReadArray without suffix Amf0TypeMarkerObjectEndBytes.")
Log.Warn("amf ReadArray without suffix Amf0TypeMarkerObjectEndBytes.")
}
return ops, index, nil
}

@ -17,8 +17,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
. "github.com/q191201771/lal/pkg/rtmp"
"github.com/q191201771/naza/pkg/assert"
"github.com/q191201771/naza/pkg/fake"
@ -118,7 +116,7 @@ func TestAmf0_ReadArray(t *testing.T) {
assert.Equal(t, 16, len(ops))
assert.Equal(t, 359, len(gold))
assert.Equal(t, 359, l)
nazalog.Debug(ops)
Log.Debug(ops)
}
func TestAmf0_ReadCase1(t *testing.T) {

@ -126,8 +126,8 @@ func (c *ChunkComposer) RunLoop(reader io.Reader, cb OnCompleteMessage) error {
case 3:
// noop
}
if nazalog.GetOption().Level == nazalog.LevelTrace {
nazalog.Tracef("[%p] RTMP_READ chunk.fmt=%d, csid=%d, header=%+v, timestamp=%d",
if Log.GetOption().Level == nazalog.LevelTrace {
Log.Tracef("[%p] RTMP_READ chunk.fmt=%d, csid=%d, header=%+v, timestamp=%d",
c, fmt, csid, stream.header, stream.timestamp)
}
@ -143,8 +143,8 @@ func (c *ChunkComposer) RunLoop(reader io.Reader, cb OnCompleteMessage) error {
return err
}
newTs := bele.BeUint32(bootstrap)
if nazalog.GetOption().Level == nazalog.LevelTrace {
nazalog.Tracef("[%p] RTMP_READ ext. ts=(%d,%d,%d)",
if Log.GetOption().Level == nazalog.LevelTrace {
Log.Tracef("[%p] RTMP_READ ext. ts=(%d,%d,%d)",
c, stream.timestamp, newTs, stream.header.TimestampAbs)
}
stream.timestamp = newTs
@ -188,8 +188,8 @@ func (c *ChunkComposer) RunLoop(reader io.Reader, cb OnCompleteMessage) error {
stream.header.TimestampAbs += stream.timestamp
}
absTsFlag = false
if nazalog.GetOption().Level == nazalog.LevelTrace {
nazalog.Tracef("[%p] RTMP_READ cb. fmt=%d, csid=%d, header=%+v, timestamp=%d, hex=%s",
if Log.GetOption().Level == nazalog.LevelTrace {
Log.Tracef("[%p] RTMP_READ cb. fmt=%d, csid=%d, header=%+v, timestamp=%d, hex=%s",
c, fmt, csid, stream.header, stream.timestamp, hex.Dump(nazabytes.Prefix(stream.msg.buff.Bytes(), 32)))
}

@ -20,7 +20,6 @@ import (
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/connection"
"github.com/q191201771/naza/pkg/nazalog"
)
// rtmp 客户端类型连接的底层实现
@ -122,13 +121,13 @@ func NewClientSession(t ClientSessionType, modOptions ...ModClientSessionOption)
debugLogReadUserCtrlMsgMax: 5,
hc: hc,
}
nazalog.Infof("[%s] lifecycle new rtmp ClientSession. session=%p", uk, s)
Log.Infof("[%s] lifecycle new rtmp ClientSession. session=%p", uk, s)
return s
}
// 阻塞直到收到服务端返回的 publish / play 对应结果的信令或者发生错误
func (s *ClientSession) Do(rawUrl string) error {
nazalog.Debugf("[%s] Do. url=%s", s.uniqueKey, rawUrl)
Log.Debugf("[%s] Do. url=%s", s.uniqueKey, rawUrl)
var (
ctx context.Context
@ -250,13 +249,13 @@ func (s *ClientSession) doContext(ctx context.Context, rawUrl string) error {
return
}
nazalog.Infof("[%s] > W SetChunkSize %d.", s.uniqueKey, LocalChunkSize)
Log.Infof("[%s] > W SetChunkSize %d.", s.uniqueKey, LocalChunkSize)
if err := s.packer.writeChunkSize(s.conn, LocalChunkSize); err != nil {
errChan <- err
return
}
nazalog.Infof("[%s] > W connect('%s'). tcUrl=%s", s.uniqueKey, s.appName(), s.tcUrl())
Log.Infof("[%s] > W connect('%s'). tcUrl=%s", s.uniqueKey, s.appName(), s.tcUrl())
if err := s.packer.writeConnect(s.conn, s.appName(), s.tcUrl(), s.t == CstPushSession); err != nil {
errChan <- err
return
@ -301,7 +300,7 @@ func (s *ClientSession) streamNameWithRawQuery() string {
}
func (s *ClientSession) tcpConnect() error {
nazalog.Infof("[%s] > tcp connect.", s.uniqueKey)
Log.Infof("[%s] > tcp connect.", s.uniqueKey)
var err error
s.stat.RemoteAddr = s.urlCtx.HostWithPort
@ -319,7 +318,7 @@ func (s *ClientSession) tcpConnect() error {
}
func (s *ClientSession) handshake() error {
nazalog.Infof("[%s] > W Handshake C0+C1.", s.uniqueKey)
Log.Infof("[%s] > W Handshake C0+C1.", s.uniqueKey)
if err := s.hc.WriteC0C1(s.conn); err != nil {
return err
}
@ -327,9 +326,9 @@ func (s *ClientSession) handshake() error {
if err := s.hc.ReadS0S1(s.conn); err != nil {
return err
}
nazalog.Infof("[%s] < R Handshake S0+S1.", s.uniqueKey)
Log.Infof("[%s] < R Handshake S0+S1.", s.uniqueKey)
nazalog.Infof("[%s] > W Handshake C2.", s.uniqueKey)
Log.Infof("[%s] > W Handshake C2.", s.uniqueKey)
if err := s.hc.WriteC2(s.conn); err != nil {
return err
}
@ -337,7 +336,7 @@ func (s *ClientSession) handshake() error {
if err := s.hc.ReadS2(s.conn); err != nil {
return err
}
nazalog.Infof("[%s] < R Handshake S2.", s.uniqueKey)
Log.Infof("[%s] < R Handshake S2.", s.uniqueKey)
return nil
}
@ -368,7 +367,7 @@ func (s *ClientSession) doMsg(stream *Stream) error {
case base.RtmpTypeIdVideo:
s.onReadRtmpAvMsg(stream.toAvMsg())
default:
nazalog.Errorf("[%s] read unknown message. typeid=%d, %s", s.uniqueKey, stream.header.MsgTypeId, stream.toDebugString())
Log.Errorf("[%s] read unknown message. typeid=%d, %s", s.uniqueKey, stream.header.MsgTypeId, stream.toDebugString())
panic(0)
}
return nil
@ -376,7 +375,7 @@ func (s *ClientSession) doMsg(stream *Stream) error {
func (s *ClientSession) doAck(stream *Stream) error {
seqNum := bele.BeUint32(stream.msg.buff.Bytes())
nazalog.Infof("[%s] < R Acknowledgement. ignore. sequence number=%d.", s.uniqueKey, seqNum)
Log.Infof("[%s] < R Acknowledgement. ignore. sequence number=%d.", s.uniqueKey, seqNum)
return nil
}
func (s *ClientSession) doUserControl(stream *Stream) error {
@ -389,7 +388,7 @@ func (s *ClientSession) doUserControl(stream *Stream) error {
s.debugLogReadUserCtrlMsgCount++
if s.debugLogReadUserCtrlMsgCount <= s.debugLogReadUserCtrlMsgMax {
nazalog.Warnf("[%s] read user control message, ignore. buf=%s",
Log.Warnf("[%s] read user control message, ignore. buf=%s",
s.uniqueKey, hex.Dump(stream.msg.buff.Peek(32)))
}
return nil
@ -403,7 +402,7 @@ func (s *ClientSession) doDataMessageAmf0(stream *Stream) error {
switch val {
case "|RtmpSampleAccess":
nazalog.Debugf("[%s] < R |RtmpSampleAccess, ignore.", s.uniqueKey)
Log.Debugf("[%s] < R |RtmpSampleAccess, ignore.", s.uniqueKey)
return nil
default:
}
@ -424,13 +423,13 @@ func (s *ClientSession) doCommandMessage(stream *Stream) error {
switch cmd {
case "onBWDone":
nazalog.Warnf("[%s] < R onBWDone. ignore.", s.uniqueKey)
Log.Warnf("[%s] < R onBWDone. ignore.", s.uniqueKey)
case "_result":
return s.doResultMessage(stream, tid)
case "onStatus":
return s.doOnStatusMessage(stream, tid)
default:
nazalog.Errorf("[%s] read unknown command message. cmd=%s, %s", s.uniqueKey, cmd, stream.toDebugString())
Log.Errorf("[%s] read unknown command message. cmd=%s, %s", s.uniqueKey, cmd, stream.toDebugString())
}
return nil
@ -452,18 +451,18 @@ func (s *ClientSession) doOnStatusMessage(stream *Stream, tid int) error {
case CstPushSession:
switch code {
case "NetStream.Publish.Start":
nazalog.Infof("[%s] < R onStatus('NetStream.Publish.Start').", s.uniqueKey)
Log.Infof("[%s] < R onStatus('NetStream.Publish.Start').", s.uniqueKey)
s.notifyDoResultSucc()
default:
nazalog.Warnf("[%s] read on status message but code field unknown. code=%s", s.uniqueKey, code)
Log.Warnf("[%s] read on status message but code field unknown. code=%s", s.uniqueKey, code)
}
case CstPullSession:
switch code {
case "NetStream.Play.Start":
nazalog.Infof("[%s] < R onStatus('NetStream.Play.Start').", s.uniqueKey)
Log.Infof("[%s] < R onStatus('NetStream.Play.Start').", s.uniqueKey)
s.notifyDoResultSucc()
default:
nazalog.Warnf("[%s] read on status message but code field unknown. code=%s", s.uniqueKey, code)
Log.Warnf("[%s] read on status message but code field unknown. code=%s", s.uniqueKey, code)
}
}
@ -487,13 +486,13 @@ func (s *ClientSession) doResultMessage(stream *Stream, tid int) error {
}
switch code {
case "NetConnection.Connect.Success":
nazalog.Infof("[%s] < R _result(\"NetConnection.Connect.Success\").", s.uniqueKey)
nazalog.Infof("[%s] > W createStream().", s.uniqueKey)
Log.Infof("[%s] < R _result(\"NetConnection.Connect.Success\").", s.uniqueKey)
Log.Infof("[%s] > W createStream().", s.uniqueKey)
if err := s.packer.writeCreateStream(s.conn); err != nil {
return err
}
default:
nazalog.Errorf("[%s] unknown code. code=%v", s.uniqueKey, code)
Log.Errorf("[%s] unknown code. code=%v", s.uniqueKey, code)
}
case tidClientCreateStream:
err := stream.msg.readNull()
@ -504,21 +503,21 @@ func (s *ClientSession) doResultMessage(stream *Stream, tid int) error {
if err != nil {
return err
}
nazalog.Infof("[%s] < R _result().", s.uniqueKey)
Log.Infof("[%s] < R _result().", s.uniqueKey)
switch s.t {
case CstPullSession:
nazalog.Infof("[%s] > W play('%s').", s.uniqueKey, s.streamNameWithRawQuery())
Log.Infof("[%s] > W play('%s').", s.uniqueKey, s.streamNameWithRawQuery())
if err := s.packer.writePlay(s.conn, s.streamNameWithRawQuery(), sid); err != nil {
return err
}
case CstPushSession:
nazalog.Infof("[%s] > W publish('%s').", s.uniqueKey, s.streamNameWithRawQuery())
Log.Infof("[%s] > W publish('%s').", s.uniqueKey, s.streamNameWithRawQuery())
if err := s.packer.writePublish(s.conn, s.appName(), s.streamNameWithRawQuery(), sid); err != nil {
return err
}
}
default:
nazalog.Errorf("[%s] unknown tid. tid=%d", s.uniqueKey, tid)
Log.Errorf("[%s] unknown tid. tid=%d", s.uniqueKey, tid)
}
return nil
}
@ -531,15 +530,15 @@ func (s *ClientSession) doProtocolControlMessage(stream *Stream) error {
switch stream.header.MsgTypeId {
case base.RtmpTypeIdWinAckSize:
s.peerWinAckSize = val
nazalog.Infof("[%s] < R Window Acknowledgement Size: %d", s.uniqueKey, s.peerWinAckSize)
Log.Infof("[%s] < R Window Acknowledgement Size: %d", s.uniqueKey, s.peerWinAckSize)
case base.RtmpTypeIdBandwidth:
// TODO chef: 是否需要关注这个信令
nazalog.Warnf("[%s] < R Set Peer Bandwidth. ignore.", s.uniqueKey)
Log.Warnf("[%s] < R Set Peer Bandwidth. ignore.", s.uniqueKey)
case base.RtmpTypeIdSetChunkSize:
// composer内部会自动更新peer chunk size.
nazalog.Infof("[%s] < R Set Chunk Size %d.", s.uniqueKey, val)
Log.Infof("[%s] < R Set Chunk Size %d.", s.uniqueKey, val)
default:
nazalog.Errorf("[%s] read unknown protocol control message. typeid=%d, %s", s.uniqueKey, stream.header.MsgTypeId, stream.toDebugString())
Log.Errorf("[%s] read unknown protocol control message. typeid=%d, %s", s.uniqueKey, stream.header.MsgTypeId, stream.toDebugString())
}
return nil
}
@ -547,7 +546,7 @@ func (s *ClientSession) doProtocolControlMessage(stream *Stream) error {
func (s *ClientSession) notifyDoResultSucc() {
// 碰上过对端服务器实现有问题对于play信令回复了两次相同的结果我们在这里忽略掉非第一次的回复
if s.hasNotifyDoResultSucc {
nazalog.Warnf("[%s] has notified do result succ already, ignore it", s.uniqueKey)
Log.Warnf("[%s] has notified do result succ already, ignore it", s.uniqueKey)
return
}
s.hasNotifyDoResultSucc = true
@ -563,7 +562,7 @@ func (s *ClientSession) notifyDoResultSucc() {
func (s *ClientSession) dispose(err error) error {
var retErr error
s.disposeOnce.Do(func() {
nazalog.Infof("[%s] lifecycle dispose rtmp ClientSession. err=%+v", s.uniqueKey, err)
Log.Infof("[%s] lifecycle dispose rtmp ClientSession. err=%+v", s.uniqueKey, err)
if s.conn == nil {
retErr = base.ErrSessionNotStarted
return

@ -19,7 +19,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/nazalog"
)
// https://pengrl.com/p/20027
@ -234,7 +233,7 @@ func parseChallenge(b []byte, peerKey []byte, key []byte) []byte {
//}
ver := bele.BeUint32(b[5:])
if ver == 0 {
nazalog.Debug("handshake simple mode.")
Log.Debug("handshake simple mode.")
return nil
}
@ -243,10 +242,10 @@ func parseChallenge(b []byte, peerKey []byte, key []byte) []byte {
offs = findDigest(b[1:], 8, peerKey)
}
if offs == -1 {
nazalog.Warn("get digest offs failed. roll back to try simple handshake.")
Log.Warn("get digest offs failed. roll back to try simple handshake.")
return nil
}
nazalog.Debug("handshake complex mode.")
Log.Debug("handshake complex mode.")
// use c0c1 digest to make a new digest
digest := makeDigest(b[1+offs:1+offs+keyLen], key)

@ -12,8 +12,6 @@ import (
"fmt"
"io"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/bele"
@ -323,7 +321,7 @@ func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) {
if nBytes := b.Len(); nBytes > 0 {
m, e := w.Write(b.Bytes())
if m > nBytes {
nazalog.Panicf("Buffer.WriteTo: invalid Write count. expected=%d, actual=%d", nBytes, m)
Log.Panicf("Buffer.WriteTo: invalid Write count. expected=%d, actual=%d", nBytes, m)
}
b.readPos += m
n = int64(m)
@ -356,7 +354,7 @@ func (b *Buffer) grow(n int) {
newLen = cap(b.core) * 2
}
buf := make([]byte, newLen)
nazalog.Debugf("Buffer::grow. need=%d, old len=%d, cap=%d, new len=%d", n, b.Len(), cap(b.core), newLen)
Log.Debugf("Buffer::grow. need=%d, old len=%d, cap=%d, new len=%d", n, b.Len(), cap(b.core), newLen)
copy(buf, b.core[b.readPos:b.writePos])
b.core = buf
b.readPos = 0

@ -15,7 +15,6 @@ import (
"github.com/q191201771/lal/pkg/rtmp"
"github.com/q191201771/naza/pkg/assert"
"github.com/q191201771/naza/pkg/nazalog"
)
func TestMetadata(t *testing.T) {
@ -24,7 +23,7 @@ func TestMetadata(t *testing.T) {
opa, err := rtmp.ParseMetadata(b)
assert.Equal(t, nil, err)
nazalog.Debugf("%+v", opa)
rtmp.Log.Debugf("%+v", opa)
assert.Equal(t, 5, len(opa))
v := opa.Find("width")

@ -10,8 +10,6 @@ package rtmp
import (
"net"
log "github.com/q191201771/naza/pkg/nazalog"
)
type ServerObserver interface {
@ -52,7 +50,7 @@ func (server *Server) Listen() (err error) {
if server.ln, err = net.Listen("tcp", server.addr); err != nil {
return
}
log.Infof("start rtmp server listen. addr=%s", server.addr)
Log.Infof("start rtmp server listen. addr=%s", server.addr)
return
}
@ -71,12 +69,12 @@ func (server *Server) Dispose() {
return
}
if err := server.ln.Close(); err != nil {
log.Error(err)
Log.Error(err)
}
}
func (server *Server) handleTcpConnect(conn net.Conn) {
log.Infof("accept a rtmp connection. remoteAddr=%s", conn.RemoteAddr().String())
Log.Infof("accept a rtmp connection. remoteAddr=%s", conn.RemoteAddr().String())
session := NewServerSession(server, conn)
_ = session.RunLoop()

@ -21,7 +21,6 @@ import (
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/connection"
"github.com/q191201771/naza/pkg/nazalog"
)
// TODO chef: 没有进化成Pub Sub时的超时释放
@ -109,7 +108,7 @@ func NewServerSession(observer ServerSessionObserver, conn net.Conn) *ServerSess
IsFresh: true,
ShouldWaitVideoKeyFrame: true,
}
nazalog.Infof("[%s] lifecycle new rtmp ServerSession. session=%p, remote addr=%s", uk, s, conn.RemoteAddr().String())
Log.Infof("[%s] lifecycle new rtmp ServerSession. session=%p, remote addr=%s", uk, s, conn.RemoteAddr().String())
return s
}
@ -207,9 +206,9 @@ func (s *ServerSession) handshake() error {
if err := s.hs.ReadC0C1(s.conn); err != nil {
return err
}
nazalog.Infof("[%s] < R Handshake C0+C1.", s.uniqueKey)
Log.Infof("[%s] < R Handshake C0+C1.", s.uniqueKey)
nazalog.Infof("[%s] > W Handshake S0+S1+S2.", s.uniqueKey)
Log.Infof("[%s] > W Handshake S0+S1+S2.", s.uniqueKey)
if err := s.hs.WriteS0S1S2(s.conn); err != nil {
return err
}
@ -217,7 +216,7 @@ func (s *ServerSession) handshake() error {
if err := s.hs.ReadC2(s.conn); err != nil {
return err
}
nazalog.Infof("[%s] < R Handshake C2.", s.uniqueKey)
Log.Infof("[%s] < R Handshake C2.", s.uniqueKey)
return nil
}
@ -245,7 +244,7 @@ func (s *ServerSession) doMsg(stream *Stream) error {
}
s.avObserver.OnReadRtmpAvMsg(stream.toAvMsg())
default:
nazalog.Warnf("[%s] read unknown message. typeid=%d, %s", s.uniqueKey, stream.header.MsgTypeId, stream.toDebugString())
Log.Warnf("[%s] read unknown message. typeid=%d, %s", s.uniqueKey, stream.header.MsgTypeId, stream.toDebugString())
}
return nil
@ -253,7 +252,7 @@ func (s *ServerSession) doMsg(stream *Stream) error {
func (s *ServerSession) doAck(stream *Stream) error {
seqNum := bele.BeUint32(stream.msg.buff.Bytes())
nazalog.Infof("[%s] < R Acknowledgement. ignore. sequence number=%d.", s.uniqueKey, seqNum)
Log.Infof("[%s] < R Acknowledgement. ignore. sequence number=%d.", s.uniqueKey, seqNum)
return nil
}
func (s *ServerSession) doUserControl(stream *Stream) error {
@ -277,7 +276,7 @@ func (s *ServerSession) doDataMessageAmf0(stream *Stream) error {
switch val {
case "|RtmpSampleAccess":
nazalog.Debugf("[%s] < R |RtmpSampleAccess, ignore.", s.uniqueKey)
Log.Debugf("[%s] < R |RtmpSampleAccess, ignore.", s.uniqueKey)
return nil
default:
}
@ -292,7 +291,7 @@ func (s *ServerSession) doDataMessageAmf0(stream *Stream) error {
//
//switch val {
//case "|RtmpSampleAccess":
// nazalog.Warnf("[%s] read data message, ignore it. val=%s", s.uniqueKey, val)
// Log.Warnf("[%s] read data message, ignore it. val=%s", s.uniqueKey, val)
// return nil
//case "@setDataFrame":
// // macos obs and ffmpeg
@ -304,13 +303,13 @@ func (s *ServerSession) doDataMessageAmf0(stream *Stream) error {
// return err
// }
// if val != "onMetaData" {
// nazalog.Errorf("[%s] read unknown data message. val=%s, %s", s.uniqueKey, val, stream.toDebugString())
// Log.Errorf("[%s] read unknown data message. val=%s, %s", s.uniqueKey, val, stream.toDebugString())
// return ErrRtmp
// }
//case "onMetaData":
// // noop
//default:
// nazalog.Errorf("[%s] read unknown data message. val=%s, %s", s.uniqueKey, val, stream.toDebugString())
// Log.Errorf("[%s] read unknown data message. val=%s, %s", s.uniqueKey, val, stream.toDebugString())
// return nil
//}
//
@ -346,9 +345,9 @@ func (s *ServerSession) doCommandMessage(stream *Stream) error {
case "getStreamLength":
fallthrough
case "deleteStream":
nazalog.Debugf("[%s] read command message, ignore it. cmd=%s, %s", s.uniqueKey, cmd, stream.toDebugString())
Log.Debugf("[%s] read command message, ignore it. cmd=%s, %s", s.uniqueKey, cmd, stream.toDebugString())
default:
nazalog.Errorf("[%s] read unknown command message. cmd=%s, %s", s.uniqueKey, cmd, stream.toDebugString())
Log.Errorf("[%s] read unknown command message. cmd=%s, %s", s.uniqueKey, cmd, stream.toDebugString())
}
return nil
}
@ -370,28 +369,28 @@ func (s *ServerSession) doConnect(tid int, stream *Stream) error {
}
s.tcUrl, err = val.FindString("tcUrl")
if err != nil {
nazalog.Warnf("[%s] tcUrl not exist.", s.uniqueKey)
Log.Warnf("[%s] tcUrl not exist.", s.uniqueKey)
}
nazalog.Infof("[%s] < R connect('%s'). tcUrl=%s", s.uniqueKey, s.appName, s.tcUrl)
Log.Infof("[%s] < R connect('%s'). tcUrl=%s", s.uniqueKey, s.appName, s.tcUrl)
s.observer.OnRtmpConnect(s, val)
nazalog.Infof("[%s] > W Window Acknowledgement Size %d.", s.uniqueKey, windowAcknowledgementSize)
Log.Infof("[%s] > W Window Acknowledgement Size %d.", s.uniqueKey, windowAcknowledgementSize)
if err := s.packer.writeWinAckSize(s.conn, windowAcknowledgementSize); err != nil {
return err
}
nazalog.Infof("[%s] > W Set Peer Bandwidth.", s.uniqueKey)
Log.Infof("[%s] > W Set Peer Bandwidth.", s.uniqueKey)
if err := s.packer.writePeerBandwidth(s.conn, peerBandwidth, peerBandwidthLimitTypeDynamic); err != nil {
return err
}
nazalog.Infof("[%s] > W SetChunkSize %d.", s.uniqueKey, LocalChunkSize)
Log.Infof("[%s] > W SetChunkSize %d.", s.uniqueKey, LocalChunkSize)
if err := s.packer.writeChunkSize(s.conn, LocalChunkSize); err != nil {
return err
}
nazalog.Infof("[%s] > W _result('NetConnection.Connect.Success').", s.uniqueKey)
Log.Infof("[%s] > W _result('NetConnection.Connect.Success').", s.uniqueKey)
oe, err := val.FindNumber("objectEncoding")
if oe != 0 && oe != 3 {
oe = 0
@ -403,8 +402,8 @@ func (s *ServerSession) doConnect(tid int, stream *Stream) error {
}
func (s *ServerSession) doCreateStream(tid int, stream *Stream) error {
nazalog.Infof("[%s] < R createStream().", s.uniqueKey)
nazalog.Infof("[%s] > W _result().", s.uniqueKey)
Log.Infof("[%s] < R createStream().", s.uniqueKey)
Log.Infof("[%s] > W _result().", s.uniqueKey)
if err := s.packer.writeCreateStreamResult(s.conn, tid); err != nil {
return err
}
@ -431,10 +430,10 @@ func (s *ServerSession) doPublish(tid int, stream *Stream) (err error) {
if err != nil {
return err
}
nazalog.Debugf("[%s] pubType=%s", s.uniqueKey, pubType)
nazalog.Infof("[%s] < R publish('%s')", s.uniqueKey, s.streamNameWithRawQuery)
Log.Debugf("[%s] pubType=%s", s.uniqueKey, pubType)
Log.Infof("[%s] < R publish('%s')", s.uniqueKey, s.streamNameWithRawQuery)
nazalog.Infof("[%s] > W onStatus('NetStream.Publish.Start').", s.uniqueKey)
Log.Infof("[%s] > W onStatus('NetStream.Publish.Start').", s.uniqueKey)
if err = s.packer.writeOnStatusPublish(s.conn, Msid1); err != nil {
return err
}
@ -466,7 +465,7 @@ func (s *ServerSession) doPlay(tid int, stream *Stream) (err error) {
s.url = fmt.Sprintf("%s/%s", s.tcUrl, s.streamNameWithRawQuery)
nazalog.Infof("[%s] < R play('%s').", s.uniqueKey, s.streamNameWithRawQuery)
Log.Infof("[%s] < R play('%s').", s.uniqueKey, s.streamNameWithRawQuery)
// TODO chef: start duration reset
if err := s.packer.writeStreamIsRecorded(s.conn, Msid1); err != nil {
@ -476,7 +475,7 @@ func (s *ServerSession) doPlay(tid int, stream *Stream) (err error) {
return err
}
nazalog.Infof("[%s] > W onStatus('NetStream.Play.Start').", s.uniqueKey)
Log.Infof("[%s] > W onStatus('NetStream.Play.Start').", s.uniqueKey)
if err := s.packer.writeOnStatusPlay(s.conn, Msid1); err != nil {
return err
}
@ -506,7 +505,7 @@ func (s *ServerSession) modConnProps() {
func (s *ServerSession) dispose(err error) error {
var retErr error
s.disposeOnce.Do(func() {
nazalog.Infof("[%s] lifecycle dispose rtmp ServerSession. err=%+v", s.uniqueKey, err)
Log.Infof("[%s] lifecycle dispose rtmp ServerSession. err=%+v", s.uniqueKey, err)
if s.conn == nil {
retErr = base.ErrSessionNotStarted
return

@ -15,7 +15,6 @@ import (
"github.com/q191201771/naza/pkg/nazabytes"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
)
// ----- Stream --------------------------------------------------------------------------------------------------------
@ -44,7 +43,7 @@ func (stream *Stream) toDebugString() string {
func (stream *Stream) toAvMsg() base.RtmpMsg {
// TODO chef: 考虑可能出现header中的len和buf的大小不一致的情况
if stream.header.MsgLen != uint32(stream.msg.buff.Len()) {
nazalog.Errorf("toAvMsg. headerMsgLen=%d, bufLen=%d", stream.header.MsgLen, stream.msg.buff.Len())
Log.Errorf("toAvMsg. headerMsgLen=%d, bufLen=%d", stream.header.MsgLen, stream.msg.buff.Len())
}
return base.RtmpMsg{
Header: stream.header,

@ -8,8 +8,14 @@
package rtmp
// TODO chef
// 一些更专业的配置项,暂时只在该源码文件中配置,不提供外部配置接口
import "github.com/q191201771/naza/pkg/nazalog"
// TODO chef 一些更专业的配置项,暂时只在该源码文件中配置,不提供外部配置接口
var (
Log = nazalog.GetGlobalLogger()
)
var (
readBufSize = 4096 // server session connection读缓冲的大小
wChanSize = 1024 // server session 发送数据时channel 的大小

@ -13,12 +13,11 @@ import (
"time"
"github.com/q191201771/lal/pkg/rtprtcp"
"github.com/q191201771/naza/pkg/nazalog"
)
func TestMswLsw2UnixNano(t *testing.T) {
u := rtprtcp.MswLsw2UnixNano(3805600902, 2181843386)
nazalog.Debug(u)
rtprtcp.Log.Debug(u)
tt := time.Unix(int64(u/1e9), int64(u%1e9))
nazalog.Debug(tt.String())
rtprtcp.Log.Debug(tt.String())
}

@ -8,8 +8,6 @@
package rtprtcp
import "github.com/q191201771/naza/pkg/nazalog"
type RtpPackerPayloadAac struct {
}
@ -31,7 +29,7 @@ func (r *RtpPackerPayloadAac) Pack(in []byte, maxSize int) (out [][]byte) {
// 第三部分是帧数据的数组
if len(in) > maxSize {
nazalog.Warnf("frame size bigger than rtp payload size while packing. len(in)=%d, maxSize=%d", len(in), maxSize)
Log.Warnf("frame size bigger than rtp payload size while packing. len(in)=%d, maxSize=%d", len(in), maxSize)
}
auHeadersLength := 2 // auHeaderSize * nbAuHeaders = 2 * 1

@ -13,7 +13,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/hevc"
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/nazalog"
)
// -----------------------------------
@ -127,7 +126,7 @@ func ParseRtpPacket(b []byte) (pkt RtpPacket, err error) {
func (p *RtpPacket) Body() []byte {
if p.Header.payloadOffset == 0 {
nazalog.Warnf("CHEFNOTICEME. payloadOffset=%d", p.Header.payloadOffset)
Log.Warnf("CHEFNOTICEME. payloadOffset=%d", p.Header.payloadOffset)
p.Header.payloadOffset = RtpFixedHeaderLength
}
return p.Raw[p.Header.payloadOffset:]

@ -10,7 +10,6 @@ package rtprtcp
import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
)
// 传入RTP包合成帧数据并回调返回
@ -71,7 +70,7 @@ func DefaultRtpUnpackerFactory(payloadType base.AvPacketPt, clockRate int, maxSi
case base.AvPacketPtHevc:
protocol = NewRtpUnpackerAvcHevc(payloadType, clockRate, onAvPacket)
default:
nazalog.Fatalf("payload type not support yet. payloadType=%d", payloadType)
Log.Fatalf("payload type not support yet. payloadType=%d", payloadType)
}
return NewRtpUnpackContainer(maxSize, protocol)
}

@ -10,7 +10,6 @@ package rtprtcp
import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
)
type RtpUnpackerAac struct {
@ -67,7 +66,7 @@ func (unpacker *RtpUnpackerAac) TryUnpackOne(list *RtpPacketList) (unpackedFlag
return false, 0
}
b := p.Packet.Raw[p.Packet.Header.payloadOffset:]
//nazalog.Debugf("%d, %d, %s", len(pkt.Raw), pkt.Header.timestamp, hex.Dump(b))
//Log.Debugf("%d, %d, %s", len(pkt.Raw), pkt.Header.timestamp, hex.Dump(b))
aus := parseAu(b)
@ -107,7 +106,7 @@ func (unpacker *RtpUnpackerAac) TryUnpackOne(list *RtpPacketList) (unpackedFlag
return false, 0
}
if p.Packet.Header.Timestamp != timestamp {
nazalog.Errorf("fragments of the same access shall have the same timestamp. first=%d, curr=%d",
Log.Errorf("fragments of the same access shall have the same timestamp. first=%d, curr=%d",
timestamp, p.Packet.Header.Timestamp)
return false, 0
}
@ -115,11 +114,11 @@ func (unpacker *RtpUnpackerAac) TryUnpackOne(list *RtpPacketList) (unpackedFlag
b = p.Packet.Raw[p.Packet.Header.payloadOffset:]
aus := parseAu(b)
if len(aus) != 1 {
nazalog.Errorf("shall be a single fragment. len(aus)=%d", len(aus))
Log.Errorf("shall be a single fragment. len(aus)=%d", len(aus))
return false, 0
}
if aus[0].size != totalSize {
nazalog.Errorf("fragments of the same access shall have the same size. first=%d, curr=%d",
Log.Errorf("fragments of the same access shall have the same size. first=%d, curr=%d",
totalSize, aus[0].size)
return false, 0
}
@ -142,7 +141,7 @@ func (unpacker *RtpUnpackerAac) TryUnpackOne(list *RtpPacketList) (unpackedFlag
list.Size -= packetCount
return true, p.Packet.Header.Seq
} else {
nazalog.Errorf("cache size bigger then total size. cacheSize=%d, totalSize=%d",
Log.Errorf("cache size bigger then total size. cacheSize=%d, totalSize=%d",
cacheSize, totalSize)
return false, 0
}
@ -190,7 +189,7 @@ func parseAu(b []byte) (ret []au) {
auSize /= 8
// 注意fragment时auIndex并不可靠。见TestAacCase1
//auIndex := b[pauh+1] & 0x7
//nazalog.Debugf("~ %d %d", auSize, auIndex)
//Log.Debugf("~ %d %d", auSize, auIndex)
ret = append(ret, au{
size: auSize,
@ -203,7 +202,7 @@ func parseAu(b []byte) (ret []au) {
if (nbAuHeaders > 1 && pau != uint32(len(b))) ||
(nbAuHeaders == 1 && pau < uint32(len(b))) {
nazalog.Warnf("rtp packet size invalid. nbAuHeaders=%d, pau=%d, len(b)=%d, auHeadersLength=%d", nbAuHeaders, pau, len(b), auHeadersLength)
Log.Warnf("rtp packet size invalid. nbAuHeaders=%d, pau=%d, len(b)=%d, auHeadersLength=%d", nbAuHeaders, pau, len(b), auHeadersLength)
}
return

@ -13,7 +13,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/hevc"
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/naza/pkg/nazalog"
)
type RtpUnpackerAvcHevc struct {
@ -72,7 +71,7 @@ func (unpacker *RtpUnpackerAvcHevc) TryUnpackOne(list *RtpPacketList) (unpackedF
totalSize := 0
for i := 0; i != len(buf); {
if len(buf)-i < 2 {
nazalog.Errorf("invalid STAP-A packet.")
Log.Errorf("invalid STAP-A packet.")
return false, 0
}
naluSize := int(bele.BeUint16(buf[i:]))
@ -179,7 +178,7 @@ func (unpacker *RtpUnpackerAvcHevc) TryUnpackOne(list *RtpPacketList) (unpackedF
return true, p.Packet.Header.Seq
} else {
// 不应该出现其他类型
nazalog.Errorf("invalid position type. position=%d, first=(h=%+v, pos=%d), prev=(h=%+v, pos=%d), p=(h=%+v, pos=%d)",
Log.Errorf("invalid position type. position=%d, first=(h=%+v, pos=%d), prev=(h=%+v, pos=%d), p=(h=%+v, pos=%d)",
p.Packet.positionType, first.Packet.Header, first.Packet.positionType, prev.Packet.Header, prev.Packet.positionType, p.Packet.Header, p.Packet.positionType)
return false, 0
}
@ -190,7 +189,7 @@ func (unpacker *RtpUnpackerAvcHevc) TryUnpackOne(list *RtpPacketList) (unpackedF
case PositionTypeFuaEnd:
// noop
default:
nazalog.Errorf("invalid position. pos=%d", first.Packet.positionType)
Log.Errorf("invalid position. pos=%d", first.Packet.positionType)
}
return false, 0
@ -262,7 +261,7 @@ func calcPositionIfNeededAvc(pkt *RtpPacket) {
} else if outerNaluType == NaluTypeAvcStapa {
pkt.positionType = PositionTypeStapa
} else {
nazalog.Errorf("unknown nalu type. outerNaluType=%d", outerNaluType)
Log.Errorf("unknown nalu type. outerNaluType=%d", outerNaluType)
}
return
@ -342,7 +341,7 @@ func calcPositionIfNeededHevc(pkt *RtpPacket) {
return
default:
// TODO chef: 没有实现 AP 48
nazalog.Errorf("unknown nalu type. outerNaluType=%d(%d), header=%+v, len=%d",
Log.Errorf("unknown nalu type. outerNaluType=%d(%d), header=%+v, len=%d",
b[0], outerNaluType, pkt.Header, len(pkt.Raw))
}

@ -12,8 +12,6 @@ import (
"encoding/hex"
"testing"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/bele"
"github.com/q191201771/lal/pkg/base"
@ -176,7 +174,7 @@ func testHelperAddPrefixLength(in []byte) (out []byte) {
func testHelperUnpack(payloadType base.AvPacketPt, clockRate int, maxSize int, rtpPackets []RtpPacket) []base.AvPacket {
var outPkts []base.AvPacket
unpacker := DefaultRtpUnpackerFactory(payloadType, clockRate, maxSize, func(pkt base.AvPacket) {
nazalog.Debugf("%s", hex.EncodeToString(pkt.Payload))
Log.Debugf("%s", hex.EncodeToString(pkt.Payload))
outPkts = append(outPkts, pkt)
})
for _, pkt := range rtpPackets {

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package rtprtcp
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -12,7 +12,6 @@ import (
"fmt"
"strings"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/nazamd5"
)
@ -51,7 +50,7 @@ func (a *Auth) FeedWwwAuthenticate(auths []string, username, password string) {
return
}
if !strings.HasPrefix(s, AuthTypeDigest) {
nazalog.Warnf("FeedWwwAuthenticate type invalid. v=%s", s)
Log.Warnf("FeedWwwAuthenticate type invalid. v=%s", s)
return
}
@ -61,17 +60,17 @@ func (a *Auth) FeedWwwAuthenticate(auths []string, username, password string) {
a.Algorithm = a.getV(s, `algorithm="`)
if a.Realm == "" {
nazalog.Warnf("FeedWwwAuthenticate realm invalid. v=%s", s)
Log.Warnf("FeedWwwAuthenticate realm invalid. v=%s", s)
}
if a.Nonce == "" {
nazalog.Warnf("FeedWwwAuthenticate realm invalid. v=%s", s)
Log.Warnf("FeedWwwAuthenticate realm invalid. v=%s", s)
}
if a.Algorithm == "" {
a.Algorithm = AuthAlgorithm
nazalog.Warnf("FeedWwwAuthenticate algorithm not found fallback to %s. v=%s", AuthAlgorithm, s)
Log.Warnf("FeedWwwAuthenticate algorithm not found fallback to %s. v=%s", AuthAlgorithm, s)
}
if a.Algorithm != AuthAlgorithm {
nazalog.Warnf("FeedWwwAuthenticate algorithm invalid, only support MD5. v=%s", s)
Log.Warnf("FeedWwwAuthenticate algorithm invalid, only support MD5. v=%s", s)
}
}

@ -11,7 +11,6 @@ package rtsp
import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/circularqueue"
"github.com/q191201771/naza/pkg/nazalog"
)
// 处理音频和视频的时间戳:
@ -44,14 +43,14 @@ func NewAvPacketQueue(onAvPacket OnAvPacket) *AvPacketQueue {
// 注意,调用方保证,音频相较于音频,视频相较于视频,时间戳是线性递增的。
func (a *AvPacketQueue) Feed(pkt base.AvPacket) {
//nazalog.Debugf("AVQ feed. t=%d, ts=%d", pkt.PayloadType, pkt.Timestamp)
//Log.Debugf("AVQ feed. t=%d, ts=%d", pkt.PayloadType, pkt.Timestamp)
switch pkt.PayloadType {
case base.AvPacketPtAvc:
fallthrough
case base.AvPacketPtHevc:
// 时间戳回退了
if int64(pkt.Timestamp) < a.videoBaseTs {
nazalog.Warnf("video ts rotate. pktTS=%d, audioBaseTs=%d, videoBaseTs=%d, audioQueue=%d, videoQueue=%d",
Log.Warnf("video ts rotate. pktTS=%d, audioBaseTs=%d, videoBaseTs=%d, audioQueue=%d, videoQueue=%d",
pkt.Timestamp, a.audioBaseTs, a.videoBaseTs, a.audioQueue.Size(), a.videoQueue.Size())
a.videoBaseTs = -1
a.audioBaseTs = -1
@ -67,7 +66,7 @@ func (a *AvPacketQueue) Feed(pkt base.AvPacket) {
_ = a.videoQueue.PushBack(pkt)
case base.AvPacketPtAac:
if int64(pkt.Timestamp) < a.audioBaseTs {
nazalog.Warnf("audio ts rotate. pktTS=%d, audioBaseTs=%d, videoBaseTs=%d, audioQueue=%d, videoQueue=%d",
Log.Warnf("audio ts rotate. pktTS=%d, audioBaseTs=%d, videoBaseTs=%d, audioQueue=%d, videoQueue=%d",
pkt.Timestamp, a.audioBaseTs, a.videoBaseTs, a.audioQueue.Size(), a.videoQueue.Size())
a.videoBaseTs = -1
a.audioBaseTs = -1
@ -97,14 +96,14 @@ func (a *AvPacketQueue) Feed(pkt base.AvPacket) {
// 如果视频满了,则全部输出
if a.videoQueue.Full() {
nazalog.Assert(true, a.audioQueue.Empty())
Log.Assert(true, a.audioQueue.Empty())
a.popAllVideo()
return
}
// 如果音频满了,则全部输出
if a.audioQueue.Full() {
nazalog.Assert(true, a.videoQueue.Empty())
Log.Assert(true, a.videoQueue.Empty())
a.popAllAudio()
return
}
@ -120,7 +119,7 @@ func (a *AvPacketQueue) PopAllByForce() {
}
// never reach here
nazalog.Assert(false, !a.audioQueue.Empty() && !a.videoQueue.Empty())
Log.Assert(false, !a.audioQueue.Empty() && !a.videoQueue.Empty())
}
func (a *AvPacketQueue) popAllAudio() {

@ -15,7 +15,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/assert"
"github.com/q191201771/naza/pkg/nazalog"
)
var (
@ -147,11 +146,11 @@ func TestAvPacketQueue(t *testing.T) {
}
for i := 0; i < len(in); i++ {
out, q := oneCase(t, in[:i+1], expects[i])
nazalog.Infof("-----%d", i)
nazalog.Infof("i:%s", packetsReadable(in[:i+1]))
nazalog.Infof("o:%s", packetsReadable(out))
nazalog.Infof("e:%s", packetsReadable(expects[i]))
nazalog.Infof("q:%s", packetsReadable(peekQueuePackets(q)))
Log.Infof("-----%d", i)
Log.Infof("i:%s", packetsReadable(in[:i+1]))
Log.Infof("o:%s", packetsReadable(out))
Log.Infof("e:%s", packetsReadable(expects[i]))
Log.Infof("q:%s", packetsReadable(peekQueuePackets(q)))
}
// case. 翻转2

@ -23,7 +23,6 @@ import (
"github.com/q191201771/lal/pkg/rtprtcp"
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/connection"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/nazanet"
)
@ -100,11 +99,11 @@ func NewBaseInSession(uniqueKey string, cmdSession IInterleavedPacketWriter) *Ba
},
cmdSession: cmdSession,
waitChan: make(chan error, 1),
dumpReadAudioRtp: base.NewLogDump(1),
dumpReadVideoRtp: base.NewLogDump(1),
dumpReadSr: base.NewLogDump(2),
dumpReadAudioRtp: base.NewLogDump(Log, 1),
dumpReadVideoRtp: base.NewLogDump(Log, 1),
dumpReadSr: base.NewLogDump(Log, 2),
}
nazalog.Infof("[%s] lifecycle new rtsp BaseInSession. session=%p", uniqueKey, s)
Log.Infof("[%s] lifecycle new rtsp BaseInSession. session=%p", uniqueKey, s)
return s
}
@ -122,12 +121,12 @@ func (session *BaseInSession) InitWithSdp(sdpCtx sdp.LogicContext) {
if session.sdpCtx.IsAudioUnpackable() {
session.audioUnpacker = rtprtcp.DefaultRtpUnpackerFactory(session.sdpCtx.GetAudioPayloadTypeBase(), session.sdpCtx.AudioClockRate, unpackerItemMaxSize, session.onAvPacketUnpacked)
} else {
nazalog.Warnf("[%s] audio unpacker not support for this type yet. logicCtx=%+v", session.uniqueKey, session.sdpCtx)
Log.Warnf("[%s] audio unpacker not support for this type yet. logicCtx=%+v", session.uniqueKey, session.sdpCtx)
}
if session.sdpCtx.IsVideoUnpackable() {
session.videoUnpacker = rtprtcp.DefaultRtpUnpackerFactory(session.sdpCtx.GetVideoPayloadTypeBase(), session.sdpCtx.VideoClockRate, unpackerItemMaxSize, session.onAvPacketUnpacked)
} else {
nazalog.Warnf("[%s] video unpacker not support this type yet. logicCtx=%+v", session.uniqueKey, session.sdpCtx)
Log.Warnf("[%s] video unpacker not support this type yet. logicCtx=%+v", session.uniqueKey, session.sdpCtx)
}
session.audioRrProducer = rtprtcp.NewRrProducer(session.sdpCtx.AudioClockRate)
@ -221,7 +220,7 @@ func (session *BaseInSession) HandleInterleavedPacket(b []byte, channel int) {
case session.videoRtcpChannel:
_ = session.handleRtcpPacket(b, nil)
default:
nazalog.Errorf("[%s] read interleaved packet but channel invalid. channel=%d", session.uniqueKey, channel)
Log.Errorf("[%s] read interleaved packet but channel invalid. channel=%d", session.uniqueKey, channel)
}
}
@ -303,7 +302,7 @@ func (session *BaseInSession) onReadRtpPacket(b []byte, rAddr *net.UDPAddr, err
// TODO(chef):
// read udp [::]:30008: use of closed network connection
// 可以退出loop看是在上层退还是下层退但是要注意每次read都判断的开销
nazalog.Warnf("[%s] read udp packet failed. err=%+v", session.uniqueKey, err)
Log.Warnf("[%s] read udp packet failed. err=%+v", session.uniqueKey, err)
return true
}
@ -314,7 +313,7 @@ func (session *BaseInSession) onReadRtpPacket(b []byte, rAddr *net.UDPAddr, err
// callback by UDPConnection
func (session *BaseInSession) onReadRtcpPacket(b []byte, rAddr *net.UDPAddr, err error) bool {
if err != nil {
nazalog.Warnf("[%s] read udp packet failed. err=%+v", session.uniqueKey, err)
Log.Warnf("[%s] read udp packet failed. err=%+v", session.uniqueKey, err)
return true
}
@ -327,7 +326,7 @@ func (session *BaseInSession) handleRtcpPacket(b []byte, rAddr *net.UDPAddr) err
session.currConnStat.ReadBytesSum.Add(uint64(len(b)))
if len(b) <= 0 {
nazalog.Errorf("[%s] handleRtcpPacket but length invalid. len=%d", session.uniqueKey, len(b))
Log.Errorf("[%s] handleRtcpPacket but length invalid. len=%d", session.uniqueKey, len(b))
return nazaerrors.Wrap(base.ErrRtsp)
}
@ -369,11 +368,11 @@ func (session *BaseInSession) handleRtcpPacket(b []byte, rAddr *net.UDPAddr) err
// noop
//
// ffmpeg推流时会在发送第一个RTP包之前就发送一个SR所以关闭这个警告日志
//nazalog.Warnf("[%s] read rtcp sr but senderSsrc invalid. senderSsrc=%d, audio=%d, video=%d",
//Log.Warnf("[%s] read rtcp sr but senderSsrc invalid. senderSsrc=%d, audio=%d, video=%d",
// p.uniqueKey, sr.SenderSsrc, p.audioSsrc, p.videoSsrc)
}
default:
nazalog.Warnf("[%s] handleRtcpPacket but type unknown. type=%d, len=%d, hex=%s",
Log.Warnf("[%s] handleRtcpPacket but type unknown. type=%d, len=%d, hex=%s",
session.uniqueKey, b[1], len(b), hex.Dump(nazabytes.Prefix(b, 32)))
return nazaerrors.Wrap(base.ErrRtsp)
}
@ -385,19 +384,19 @@ func (session *BaseInSession) handleRtpPacket(b []byte) error {
session.currConnStat.ReadBytesSum.Add(uint64(len(b)))
if len(b) < rtprtcp.RtpFixedHeaderLength {
nazalog.Errorf("[%s] handleRtpPacket but length invalid. len=%d", session.uniqueKey, len(b))
Log.Errorf("[%s] handleRtpPacket but length invalid. len=%d", session.uniqueKey, len(b))
return nazaerrors.Wrap(base.ErrRtsp)
}
packetType := int(b[1] & 0x7F)
if !session.sdpCtx.IsPayloadTypeOrigin(packetType) {
nazalog.Errorf("[%s] handleRtpPacket but type invalid. type=%d", session.uniqueKey, packetType)
Log.Errorf("[%s] handleRtpPacket but type invalid. type=%d", session.uniqueKey, packetType)
return nazaerrors.Wrap(base.ErrRtsp)
}
h, err := rtprtcp.ParseRtpHeader(b)
if err != nil {
nazalog.Errorf("[%s] handleRtpPacket invalid rtp packet. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] handleRtpPacket invalid rtp packet. err=%+v", session.uniqueKey, err)
return err
}
@ -446,7 +445,7 @@ func (session *BaseInSession) handleRtpPacket(b []byte) error {
func (session *BaseInSession) dispose(err error) error {
var retErr error
session.disposeOnce.Do(func() {
nazalog.Infof("[%s] lifecycle dispose rtsp BaseInSession. session=%p", session.uniqueKey, session)
Log.Infof("[%s] lifecycle dispose rtsp BaseInSession. session=%p", session.uniqueKey, session)
var e1, e2, e3, e4 error
if session.audioRtpConn != nil {
e1 = session.audioRtpConn.Dispose()

@ -23,7 +23,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/connection"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/nazanet"
)
@ -74,7 +73,7 @@ func NewBaseOutSession(uniqueKey string, cmdSession IInterleavedPacketWriter) *B
debugLogMaxCount: 3,
waitChan: make(chan error, 1),
}
nazalog.Infof("[%s] lifecycle new rtsp BaseOutSession. session=%p", uniqueKey, s)
Log.Infof("[%s] lifecycle new rtsp BaseOutSession. session=%p", uniqueKey, s)
return s
}
@ -138,13 +137,13 @@ func (session *BaseOutSession) HandleInterleavedPacket(b []byte, channel int) {
case session.audioRtpChannel:
fallthrough
case session.videoRtpChannel:
nazalog.Warnf("[%s] not supposed to read packet in rtp channel of BaseOutSession. channel=%d, len=%d", session.uniqueKey, channel, len(b))
Log.Warnf("[%s] not supposed to read packet in rtp channel of BaseOutSession. channel=%d, len=%d", session.uniqueKey, channel, len(b))
case session.audioRtcpChannel:
fallthrough
case session.videoRtcpChannel:
nazalog.Debugf("[%s] read interleaved rtcp packet. b=%s", session.uniqueKey, hex.Dump(nazabytes.Prefix(b, 32)))
Log.Debugf("[%s] read interleaved rtcp packet. b=%s", session.uniqueKey, hex.Dump(nazabytes.Prefix(b, 32)))
default:
nazalog.Errorf("[%s] read interleaved packet but channel invalid. channel=%d", session.uniqueKey, channel)
Log.Errorf("[%s] read interleaved packet but channel invalid. channel=%d", session.uniqueKey, channel)
}
}
@ -155,7 +154,7 @@ func (session *BaseOutSession) WriteRtpPacket(packet rtprtcp.RtpPacket) error {
t := int(packet.Header.PacketType)
if session.sdpCtx.IsAudioPayloadTypeOrigin(t) {
if session.loggedWriteAudioRtpCount < session.debugLogMaxCount {
nazalog.Debugf("[%s] LOGPACKET. write audio rtp=%+v", session.uniqueKey, packet.Header)
Log.Debugf("[%s] LOGPACKET. write audio rtp=%+v", session.uniqueKey, packet.Header)
session.loggedWriteAudioRtpCount++
}
@ -167,7 +166,7 @@ func (session *BaseOutSession) WriteRtpPacket(packet rtprtcp.RtpPacket) error {
}
} else if session.sdpCtx.IsVideoPayloadTypeOrigin(t) {
if session.loggedWriteVideoRtpCount < session.debugLogMaxCount {
nazalog.Debugf("[%s] LOGPACKET. write video rtp=%+v", session.uniqueKey, packet.Header)
Log.Debugf("[%s] LOGPACKET. write video rtp=%+v", session.uniqueKey, packet.Header)
session.loggedWriteVideoRtpCount++
}
@ -178,7 +177,7 @@ func (session *BaseOutSession) WriteRtpPacket(packet rtprtcp.RtpPacket) error {
err = session.cmdSession.WriteInterleavedPacket(packet.Raw, session.videoRtpChannel)
}
} else {
nazalog.Errorf("[%s] write rtp packet but type invalid. type=%d", session.uniqueKey, t)
Log.Errorf("[%s] write rtp packet but type invalid. type=%d", session.uniqueKey, t)
err = nazaerrors.Wrap(base.ErrRtsp)
}
@ -229,7 +228,7 @@ func (session *BaseOutSession) UniqueKey() string {
func (session *BaseOutSession) onReadRtpPacket(b []byte, rAddr *net.UDPAddr, err error) bool {
if session.loggedReadRtpCount.Load() < int32(session.debugLogMaxCount) {
nazalog.Debugf("[%s] LOGPACKET. read rtp=%s", session.uniqueKey, hex.Dump(nazabytes.Prefix(b, 32)))
Log.Debugf("[%s] LOGPACKET. read rtp=%s", session.uniqueKey, hex.Dump(nazabytes.Prefix(b, 32)))
session.loggedReadRtpCount.Increment()
}
return true
@ -239,7 +238,7 @@ func (session *BaseOutSession) onReadRtcpPacket(b []byte, rAddr *net.UDPAddr, er
// TODO chef: impl me
if session.loggedReadRtcpCount.Load() < int32(session.debugLogMaxCount) {
nazalog.Debugf("[%s] LOGPACKET. read rtcp=%s", session.uniqueKey, hex.Dump(nazabytes.Prefix(b, 32)))
Log.Debugf("[%s] LOGPACKET. read rtcp=%s", session.uniqueKey, hex.Dump(nazabytes.Prefix(b, 32)))
session.loggedReadRtcpCount.Increment()
}
return true
@ -248,7 +247,7 @@ func (session *BaseOutSession) onReadRtcpPacket(b []byte, rAddr *net.UDPAddr, er
func (session *BaseOutSession) dispose(err error) error {
var retErr error
session.disposeOnce.Do(func() {
nazalog.Infof("[%s] lifecycle dispose rtsp BaseOutSession. session=%p", session.uniqueKey, session)
Log.Infof("[%s] lifecycle dispose rtsp BaseOutSession. session=%p", session.uniqueKey, session)
var e1, e2, e3, e4 error
if session.audioRtpConn != nil {
e1 = session.audioRtpConn.Dispose()

@ -24,7 +24,6 @@ import (
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/connection"
"github.com/q191201771/naza/pkg/nazahttp"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/nazanet"
)
@ -100,7 +99,7 @@ func NewClientCommandSession(t ClientCommandSessionType, uniqueKey string, obser
observer: observer,
option: option,
}
nazalog.Infof("[%s] lifecycle new rtsp ClientCommandSession. session=%p", uniqueKey, s)
Log.Infof("[%s] lifecycle new rtsp ClientCommandSession. session=%p", uniqueKey, s)
return s
}
@ -275,7 +274,7 @@ func (session *ClientCommandSession) runReadLoop() {
// 对端支持get_parameter需要定时向对端发送get_parameter进行保活
nazalog.Debugf("[%s] start get_parameter timer.", session.uniqueKey)
Log.Debugf("[%s] start get_parameter timer.", session.uniqueKey)
var r = bufio.NewReader(session.conn)
t := time.NewTicker(writeGetParameterIntervalMs * time.Millisecond)
defer t.Stop()
@ -333,7 +332,7 @@ func (session *ClientCommandSession) connect(rawUrl string) (err error) {
return err
}
nazalog.Debugf("[%s] > tcp connect.", session.uniqueKey)
Log.Debugf("[%s] > tcp connect.", session.uniqueKey)
// # 建立连接
conn, err := net.Dial("tcp", session.urlCtx.HostWithPort)
@ -343,7 +342,7 @@ func (session *ClientCommandSession) connect(rawUrl string) (err error) {
session.conn = connection.New(conn, func(option *connection.Option) {
option.ReadBufSize = readBufSize
})
nazalog.Debugf("[%s] < tcp connect. laddr=%s, raddr=%s", session.uniqueKey, conn.LocalAddr().String(), conn.RemoteAddr().String())
Log.Debugf("[%s] < tcp connect. laddr=%s, raddr=%s", session.uniqueKey, conn.LocalAddr().String(), conn.RemoteAddr().String())
session.observer.OnConnectResult()
return nil
@ -448,7 +447,7 @@ func (session *ClientCommandSession) writeOneSetup(setupUri string) error {
return err
}
nazalog.Debugf("[%s] init conn. lRtpPort=%d, lRtcpPort=%d, rRtpPort=%d, rRtcpPort=%d",
Log.Debugf("[%s] init conn. lRtpPort=%d, lRtcpPort=%d, rRtpPort=%d, rRtcpPort=%d",
session.uniqueKey, lRtpPort, lRtcpPort, rRtpPort, rRtcpPort)
rtpConn, err := nazanet.NewUdpConnection(func(option *nazanet.UdpConnectionOption) {
@ -538,8 +537,8 @@ func (session *ClientCommandSession) writeCmd(method, uri string, headers map[st
}
req := PackRequest(method, uri, headers, body)
nazalog.Debugf("[%s] > write %s.", session.uniqueKey, method)
//nazalog.Debugf("[%s] > write %s. req=%s", session.uniqueKey, method, req)
Log.Debugf("[%s] > write %s.", session.uniqueKey, method)
//Log.Debugf("[%s] > write %s. req=%s", session.uniqueKey, method, req)
_, err := session.conn.Write([]byte(req))
return err
}
@ -556,7 +555,7 @@ func (session *ClientCommandSession) writeCmdReadResp(method, uri string, header
if err != nil {
return
}
nazalog.Debugf("[%s] < read response. version=%s, code=%s, reason=%s, headers=%+v, body=%s",
Log.Debugf("[%s] < read response. version=%s, code=%s, reason=%s, headers=%+v, body=%s",
session.uniqueKey, ctx.Version, ctx.StatusCode, ctx.Reason, ctx.Headers, string(ctx.Body))
if ctx.StatusCode != "401" {
@ -574,7 +573,7 @@ func (session *ClientCommandSession) writeCmdReadResp(method, uri string, header
func (session *ClientCommandSession) dispose(err error) error {
var retErr error
session.disposeOnce.Do(func() {
nazalog.Infof("[%s] lifecycle dispose rtsp ClientCommandSession. session=%p, err=%+v", session.uniqueKey, session, err)
Log.Infof("[%s] lifecycle dispose rtsp ClientCommandSession. session=%p, err=%+v", session.uniqueKey, session, err)
if session.conn == nil {
retErr = base.ErrSessionNotStarted
return

@ -14,7 +14,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/nazaerrors"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/nazanet"
)
@ -64,14 +63,14 @@ func NewPullSession(observer PullSessionObserver, modOptions ...ModPullSessionOp
baseInSession := NewBaseInSessionWithObserver(uk, s, observer)
s.baseInSession = baseInSession
s.cmdSession = cmdSession
nazalog.Infof("[%s] lifecycle new rtsp PullSession. session=%p", uk, s)
Log.Infof("[%s] lifecycle new rtsp PullSession. session=%p", uk, s)
return s
}
// Pull 阻塞直到和对端完成拉流前握手部分的工作也即收到RTSP Play response或者发生错误
//
func (session *PullSession) Pull(rawUrl string) error {
nazalog.Debugf("[%s] pull. url=%s", session.uniqueKey, rawUrl)
Log.Debugf("[%s] pull. url=%s", session.uniqueKey, rawUrl)
if err := session.cmdSession.Do(rawUrl); err != nil {
return err
}
@ -92,7 +91,7 @@ func (session *PullSession) Pull(rawUrl string) error {
_ = session.baseInSession.Dispose()
}
if cmdSessionDisposed {
nazalog.Errorf("[%s] cmd session disposed already.", session.uniqueKey)
Log.Errorf("[%s] cmd session disposed already.", session.uniqueKey)
}
cmdSessionDisposed = true
case err = <-session.baseInSession.WaitChan():
@ -101,7 +100,7 @@ func (session *PullSession) Pull(rawUrl string) error {
_ = session.cmdSession.Dispose()
}
if baseInSessionDisposed {
nazalog.Errorf("[%s] base in session disposed already.", session.uniqueKey)
Log.Errorf("[%s] base in session disposed already.", session.uniqueKey)
}
baseInSessionDisposed = true
} // select loop
@ -224,7 +223,7 @@ func (session *PullSession) WriteInterleavedPacket(packet []byte, channel int) e
func (session *PullSession) dispose(err error) error {
var retErr error
session.disposeOnce.Do(func() {
nazalog.Infof("[%s] lifecycle dispose rtsp PullSession. session=%p", session.uniqueKey, session)
Log.Infof("[%s] lifecycle dispose rtsp PullSession. session=%p", session.uniqueKey, session)
e1 := session.cmdSession.Dispose()
e2 := session.baseInSession.Dispose()
retErr = nazaerrors.CombineErrors(e1, e2)

@ -15,7 +15,6 @@ import (
"github.com/q191201771/lal/pkg/rtprtcp"
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/nazaerrors"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/nazanet"
)
@ -58,14 +57,14 @@ func NewPushSession(modOptions ...ModPushSessionOption) *PushSession {
baseOutSession := NewBaseOutSession(uk, s)
s.cmdSession = cmdSession
s.baseOutSession = baseOutSession
nazalog.Infof("[%s] lifecycle new rtsp PushSession. session=%p", uk, s)
Log.Infof("[%s] lifecycle new rtsp PushSession. session=%p", uk, s)
return s
}
// Push 阻塞直到和对端完成推流前握手部分的工作也即收到RTSP Record response或者发生错误
//
func (session *PushSession) Push(rawUrl string, sdpCtx sdp.LogicContext) error {
nazalog.Debugf("[%s] push. url=%s", session.uniqueKey, rawUrl)
Log.Debugf("[%s] push. url=%s", session.uniqueKey, rawUrl)
session.cmdSession.InitWithSdp(sdpCtx)
session.baseOutSession.InitWithSdp(sdpCtx)
if err := session.cmdSession.Do(rawUrl); err != nil {
@ -85,7 +84,7 @@ func (session *PushSession) Push(rawUrl string, sdpCtx sdp.LogicContext) error {
_ = session.baseOutSession.Dispose()
}
if cmdSessionDisposed {
nazalog.Errorf("[%s] cmd session disposed already.", session.uniqueKey)
Log.Errorf("[%s] cmd session disposed already.", session.uniqueKey)
}
cmdSessionDisposed = true
case err = <-session.baseOutSession.WaitChan():
@ -94,7 +93,7 @@ func (session *PushSession) Push(rawUrl string, sdpCtx sdp.LogicContext) error {
_ = session.cmdSession.Dispose()
}
if baseInSessionDisposed {
nazalog.Errorf("[%s] base in session disposed already.", session.uniqueKey)
Log.Errorf("[%s] base in session disposed already.", session.uniqueKey)
}
baseInSessionDisposed = true
} // select loop
@ -217,7 +216,7 @@ func (session *PushSession) WriteInterleavedPacket(packet []byte, channel int) e
func (session *PushSession) dispose(err error) error {
var retErr error
session.disposeOnce.Do(func() {
nazalog.Infof("[%s] lifecycle dispose rtsp PushSession. session=%p", session.uniqueKey, session)
Log.Infof("[%s] lifecycle dispose rtsp PushSession. session=%p", session.uniqueKey, session)
e1 := session.cmdSession.Dispose()
e2 := session.baseOutSession.Dispose()
retErr = nazaerrors.CombineErrors(e1, e2)

@ -10,8 +10,6 @@ package rtsp
import (
"net"
"github.com/q191201771/naza/pkg/nazalog"
)
type ServerObserver interface {
@ -70,7 +68,7 @@ func (s *Server) Listen() (err error) {
if err != nil {
return
}
nazalog.Infof("start rtsp server listen. addr=%s", s.addr)
Log.Infof("start rtsp server listen. addr=%s", s.addr)
return
}
@ -89,7 +87,7 @@ func (s *Server) Dispose() {
return
}
if err := s.ln.Close(); err != nil {
nazalog.Error(err)
Log.Error(err)
}
}
@ -122,7 +120,7 @@ func (s *Server) handleTcpConnect(conn net.Conn) {
s.observer.OnNewRtspSessionConnect(session)
err := session.RunLoop()
nazalog.Info(err)
Log.Info(err)
if session.pubSession != nil {
s.observer.OnDelRtspPubSession(session.pubSession)

@ -21,7 +21,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/nazahttp"
"github.com/q191201771/naza/pkg/nazalog"
)
type ServerCommandSessionObserver interface {
@ -71,7 +70,7 @@ func NewServerCommandSession(observer ServerCommandSessionObserver, conn net.Con
}),
}
nazalog.Infof("[%s] lifecycle new rtsp ServerSession. session=%p, laddr=%s, raddr=%s", uk, s, conn.LocalAddr().String(), conn.RemoteAddr().String())
Log.Infof("[%s] lifecycle new rtsp ServerSession. session=%p, laddr=%s, raddr=%s", uk, s, conn.LocalAddr().String(), conn.RemoteAddr().String())
return s
}
@ -80,7 +79,7 @@ func (session *ServerCommandSession) RunLoop() error {
}
func (session *ServerCommandSession) Dispose() error {
nazalog.Infof("[%s] lifecycle dispose rtsp ServerCommandSession. session=%p", session.uniqueKey, session)
Log.Infof("[%s] lifecycle dispose rtsp ServerCommandSession. session=%p", session.uniqueKey, session)
return session.conn.Close()
}
@ -148,7 +147,7 @@ Loop:
for {
isInterleaved, packet, channel, err := readInterleaved(r)
if err != nil {
nazalog.Errorf("[%s] read interleaved error. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] read interleaved error. err=%+v", session.uniqueKey, err)
break Loop
}
if isInterleaved {
@ -157,7 +156,7 @@ Loop:
} else if session.subSession != nil {
session.subSession.HandleInterleavedPacket(packet, int(channel))
} else {
nazalog.Errorf("[%s] read interleaved packet but pub or sub not exist.", session.uniqueKey)
Log.Errorf("[%s] read interleaved packet but pub or sub not exist.", session.uniqueKey)
break Loop
}
continue
@ -166,11 +165,11 @@ Loop:
// 读取一个message
requestCtx, err := nazahttp.ReadHttpRequestMessage(r)
if err != nil {
nazalog.Errorf("[%s] read rtsp message error. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] read rtsp message error. err=%+v", session.uniqueKey, err)
break Loop
}
nazalog.Debugf("[%s] read http request. method=%s, uri=%s, version=%s, headers=%+v, body=%s",
Log.Debugf("[%s] read http request. method=%s, uri=%s, version=%s, headers=%+v, body=%s",
session.uniqueKey, requestCtx.Method, requestCtx.Uri, requestCtx.Version, requestCtx.Headers, string(requestCtx.Body))
var handleMsgErr error
@ -198,44 +197,44 @@ Loop:
handleMsgErr = session.handleTeardown(requestCtx)
break Loop
default:
nazalog.Errorf("[%s] unknown rtsp message. method=%s", session.uniqueKey, requestCtx.Method)
Log.Errorf("[%s] unknown rtsp message. method=%s", session.uniqueKey, requestCtx.Method)
}
if handleMsgErr != nil {
nazalog.Errorf("[%s] handle rtsp message error. err=%+v, ctx=%+v", session.uniqueKey, handleMsgErr, requestCtx)
Log.Errorf("[%s] handle rtsp message error. err=%+v, ctx=%+v", session.uniqueKey, handleMsgErr, requestCtx)
break
}
}
_ = session.conn.Close()
nazalog.Debugf("[%s] < handleTcpConnect.", session.uniqueKey)
Log.Debugf("[%s] < handleTcpConnect.", session.uniqueKey)
return nil
}
func (session *ServerCommandSession) handleOptions(requestCtx nazahttp.HttpReqMsgCtx) error {
nazalog.Infof("[%s] < R OPTIONS", session.uniqueKey)
Log.Infof("[%s] < R OPTIONS", session.uniqueKey)
resp := PackResponseOptions(requestCtx.Headers.Get(HeaderCSeq))
_, err := session.conn.Write([]byte(resp))
return err
}
func (session *ServerCommandSession) handleAnnounce(requestCtx nazahttp.HttpReqMsgCtx) error {
nazalog.Infof("[%s] < R ANNOUNCE", session.uniqueKey)
Log.Infof("[%s] < R ANNOUNCE", session.uniqueKey)
urlCtx, err := base.ParseRtspUrl(requestCtx.Uri)
if err != nil {
nazalog.Errorf("[%s] parse presentation failed. uri=%s", session.uniqueKey, requestCtx.Uri)
Log.Errorf("[%s] parse presentation failed. uri=%s", session.uniqueKey, requestCtx.Uri)
return err
}
sdpCtx, err := sdp.ParseSdp2LogicContext(requestCtx.Body)
if err != nil {
nazalog.Errorf("[%s] parse sdp failed. err=%v", session.uniqueKey, err)
Log.Errorf("[%s] parse sdp failed. err=%v", session.uniqueKey, err)
return err
}
session.pubSession = NewPubSession(urlCtx, session)
nazalog.Infof("[%s] link new PubSession. [%s]", session.uniqueKey, session.pubSession.uniqueKey)
Log.Infof("[%s] link new PubSession. [%s]", session.uniqueKey, session.pubSession.uniqueKey)
session.pubSession.InitWithSdp(sdpCtx)
if err = session.observer.OnNewRtspPubSession(session.pubSession); err != nil {
@ -248,19 +247,19 @@ func (session *ServerCommandSession) handleAnnounce(requestCtx nazahttp.HttpReqM
}
func (session *ServerCommandSession) handleDescribe(requestCtx nazahttp.HttpReqMsgCtx) error {
nazalog.Infof("[%s] < R DESCRIBE", session.uniqueKey)
Log.Infof("[%s] < R DESCRIBE", session.uniqueKey)
urlCtx, err := base.ParseRtspUrl(requestCtx.Uri)
if err != nil {
nazalog.Errorf("[%s] parse presentation failed. uri=%s", session.uniqueKey, requestCtx.Uri)
Log.Errorf("[%s] parse presentation failed. uri=%s", session.uniqueKey, requestCtx.Uri)
return err
}
session.subSession = NewSubSession(urlCtx, session)
nazalog.Infof("[%s] link new SubSession. [%s]", session.uniqueKey, session.subSession.uniqueKey)
Log.Infof("[%s] link new SubSession. [%s]", session.uniqueKey, session.subSession.uniqueKey)
ok, rawSdp := session.observer.OnNewRtspSubSessionDescribe(session.subSession)
if !ok {
nazalog.Warnf("[%s] force close subSession.", session.uniqueKey)
Log.Warnf("[%s] force close subSession.", session.uniqueKey)
return base.ErrRtspClosedByObserver
}
@ -274,7 +273,7 @@ func (session *ServerCommandSession) handleDescribe(requestCtx nazahttp.HttpReqM
// 一次SETUP对应一路流音频或视频
func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgCtx) error {
nazalog.Infof("[%s] < R SETUP", session.uniqueKey)
Log.Infof("[%s] < R SETUP", session.uniqueKey)
remoteAddr := session.conn.RemoteAddr().String()
host, _, _ := net.SplitHostPort(remoteAddr)
@ -284,21 +283,21 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC
if strings.Contains(htv, TransportFieldInterleaved) {
rtpChannel, rtcpChannel, err := parseRtpRtcpChannel(htv)
if err != nil {
nazalog.Errorf("[%s] parse rtp rtcp channel error. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] parse rtp rtcp channel error. err=%+v", session.uniqueKey, err)
return err
}
if session.pubSession != nil {
if err := session.pubSession.SetupWithChannel(requestCtx.Uri, int(rtpChannel), int(rtcpChannel)); err != nil {
nazalog.Errorf("[%s] setup channel error. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] setup channel error. err=%+v", session.uniqueKey, err)
return err
}
} else if session.subSession != nil {
if err := session.subSession.SetupWithChannel(requestCtx.Uri, int(rtpChannel), int(rtcpChannel)); err != nil {
nazalog.Errorf("[%s] setup channel error. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] setup channel error. err=%+v", session.uniqueKey, err)
return err
}
} else {
nazalog.Errorf("[%s] setup but session not exist.", session.uniqueKey)
Log.Errorf("[%s] setup but session not exist.", session.uniqueKey)
return nazaerrors.Wrap(base.ErrRtsp)
}
@ -309,31 +308,31 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC
rRtpPort, rRtcpPort, err := parseClientPort(requestCtx.Headers.Get(HeaderTransport))
if err != nil {
nazalog.Errorf("[%s] parseClientPort failed. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] parseClientPort failed. err=%+v", session.uniqueKey, err)
return err
}
rtpConn, rtcpConn, lRtpPort, lRtcpPort, err := initConnWithClientPort(host, rRtpPort, rRtcpPort)
if err != nil {
nazalog.Errorf("[%s] initConnWithClientPort failed. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] initConnWithClientPort failed. err=%+v", session.uniqueKey, err)
return err
}
nazalog.Debugf("[%s] init conn. lRtpPort=%d, lRtcpPort=%d, rRtpPort=%d, rRtcpPort=%d",
Log.Debugf("[%s] init conn. lRtpPort=%d, lRtcpPort=%d, rRtpPort=%d, rRtcpPort=%d",
session.uniqueKey, lRtpPort, lRtcpPort, rRtpPort, rRtcpPort)
if session.pubSession != nil {
if err = session.pubSession.SetupWithConn(requestCtx.Uri, rtpConn, rtcpConn); err != nil {
nazalog.Errorf("[%s] setup conn error. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] setup conn error. err=%+v", session.uniqueKey, err)
return err
}
htv = fmt.Sprintf(HeaderTransportServerRecordTmpl, rRtpPort, rRtcpPort, lRtpPort, lRtcpPort)
} else if session.subSession != nil {
if err = session.subSession.SetupWithConn(requestCtx.Uri, rtpConn, rtcpConn); err != nil {
nazalog.Errorf("[%s] setup conn error. err=%+v", session.uniqueKey, err)
Log.Errorf("[%s] setup conn error. err=%+v", session.uniqueKey, err)
return err
}
htv = fmt.Sprintf(HeaderTransportServerPlayTmpl, rRtpPort, rRtcpPort, lRtpPort, lRtcpPort)
} else {
nazalog.Errorf("[%s] setup but session not exist.", session.uniqueKey)
Log.Errorf("[%s] setup but session not exist.", session.uniqueKey)
return nazaerrors.Wrap(base.ErrRtsp)
}
@ -343,14 +342,14 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC
}
func (session *ServerCommandSession) handleRecord(requestCtx nazahttp.HttpReqMsgCtx) error {
nazalog.Infof("[%s] < R RECORD", session.uniqueKey)
Log.Infof("[%s] < R RECORD", session.uniqueKey)
resp := PackResponseRecord(requestCtx.Headers.Get(HeaderCSeq))
_, err := session.conn.Write([]byte(resp))
return err
}
func (session *ServerCommandSession) handlePlay(requestCtx nazahttp.HttpReqMsgCtx) error {
nazalog.Infof("[%s] < R PLAY", session.uniqueKey)
Log.Infof("[%s] < R PLAY", session.uniqueKey)
// TODO(chef): [opt] 上层关闭可以考虑回复非200状态码再关闭
if err := session.observer.OnNewRtspSubSessionPlay(session.subSession); err != nil {
return err
@ -361,7 +360,7 @@ func (session *ServerCommandSession) handlePlay(requestCtx nazahttp.HttpReqMsgCt
}
func (session *ServerCommandSession) handleTeardown(requestCtx nazahttp.HttpReqMsgCtx) error {
nazalog.Infof("[%s] < R TEARDOWN", session.uniqueKey)
Log.Infof("[%s] < R TEARDOWN", session.uniqueKey)
resp := PackResponseTeardown(requestCtx.Headers.Get(HeaderCSeq))
_, err := session.conn.Write([]byte(resp))
return err

@ -14,8 +14,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/sdp"
"github.com/q191201771/naza/pkg/nazalog"
)
type PubSessionObserver interface {
@ -40,7 +38,7 @@ func NewPubSession(urlCtx base.UrlContext, cmdSession *ServerCommandSession) *Pu
}
baseInSession := NewBaseInSession(uk, s)
s.baseInSession = baseInSession
nazalog.Infof("[%s] lifecycle new rtsp PubSession. session=%p, streamName=%s", uk, s, urlCtx.LastItemOfPath)
Log.Infof("[%s] lifecycle new rtsp PubSession. session=%p, streamName=%s", uk, s, urlCtx.LastItemOfPath)
return s
}
@ -61,7 +59,7 @@ func (session *PubSession) SetupWithChannel(uri string, rtpChannel, rtcpChannel
}
func (session *PubSession) Dispose() error {
nazalog.Infof("[%s] lifecycle dispose rtsp PubSession. session=%p", session.uniqueKey, session)
Log.Infof("[%s] lifecycle dispose rtsp PubSession. session=%p", session.uniqueKey, session)
e1 := session.cmdSession.Dispose()
e2 := session.baseInSession.Dispose()
return nazaerrors.CombineErrors(e1, e2)

@ -14,7 +14,6 @@ import (
"github.com/q191201771/naza/pkg/nazaerrors"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/nazanet"
)
@ -38,7 +37,7 @@ func NewSubSession(urlCtx base.UrlContext, cmdSession *ServerCommandSession) *Su
}
baseOutSession := NewBaseOutSession(uk, s)
s.baseOutSession = baseOutSession
nazalog.Infof("[%s] lifecycle new rtsp SubSession. session=%p, streamName=%s", uk, s, urlCtx.LastItemOfPath)
Log.Infof("[%s] lifecycle new rtsp SubSession. session=%p, streamName=%s", uk, s, urlCtx.LastItemOfPath)
return s
}
@ -59,7 +58,7 @@ func (session *SubSession) WriteRtpPacket(packet rtprtcp.RtpPacket) {
}
func (session *SubSession) Dispose() error {
nazalog.Infof("[%s] lifecycle dispose rtsp SubSession. session=%p", session.uniqueKey, session)
Log.Infof("[%s] lifecycle dispose rtsp SubSession. session=%p", session.uniqueKey, session)
e1 := session.baseOutSession.Dispose()
e2 := session.cmdSession.Dispose()
return nazaerrors.CombineErrors(e1, e2)

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package rtsp
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()

@ -12,8 +12,6 @@ import (
"fmt"
"strings"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/lal/pkg/base"
)
@ -122,10 +120,10 @@ func ParseSdp2LogicContext(b []byte) (LogicContext, error) {
if md.AFmtPBase != nil {
ret.Asc, err = ParseAsc(md.AFmtPBase)
if err != nil {
nazalog.Warnf("parse asc from afmtp failed. err=%+v", err)
Log.Warnf("parse asc from afmtp failed. err=%+v", err)
}
} else {
nazalog.Warnf("aac afmtp not exist.")
Log.Warnf("aac afmtp not exist.")
}
} else {
ret.audioPayloadTypeBase = base.AvPacketPtUnknown
@ -142,20 +140,20 @@ func ParseSdp2LogicContext(b []byte) (LogicContext, error) {
if md.AFmtPBase != nil {
ret.Sps, ret.Pps, err = ParseSpsPps(md.AFmtPBase)
if err != nil {
nazalog.Warnf("parse sps pps from afmtp failed. err=%+v", err)
Log.Warnf("parse sps pps from afmtp failed. err=%+v", err)
}
} else {
nazalog.Warnf("avc afmtp not exist.")
Log.Warnf("avc afmtp not exist.")
}
case ARtpMapEncodingNameH265:
ret.videoPayloadTypeBase = base.AvPacketPtHevc
if md.AFmtPBase != nil {
ret.Vps, ret.Sps, ret.Pps, err = ParseVpsSpsPps(md.AFmtPBase)
if err != nil {
nazalog.Warnf("parse vps sps pps from afmtp failed. err=%+v", err)
Log.Warnf("parse vps sps pps from afmtp failed. err=%+v", err)
}
} else {
nazalog.Warnf("hevc afmtp not exist.")
Log.Warnf("hevc afmtp not exist.")
}
default:
ret.videoPayloadTypeBase = base.AvPacketPtUnknown

@ -15,8 +15,6 @@ import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/assert"
)
@ -48,7 +46,7 @@ var goldenPps = []byte{
func TestParseSdp2RawContext(t *testing.T) {
sdpCtx, err := ParseSdp2RawContext([]byte(goldenSdp))
assert.Equal(t, nil, err)
nazalog.Debugf("sdp=%+v", sdpCtx)
Log.Debugf("sdp=%+v", sdpCtx)
}
func TestParseARtpMap(t *testing.T) {
@ -145,9 +143,9 @@ func TestParseVpsSpsPps(t *testing.T) {
assert.Equal(t, nil, err)
vps, sps, pps, err := ParseVpsSpsPps(&f)
assert.Equal(t, nil, err)
nazalog.Debugf("%s", hex.Dump(vps))
nazalog.Debugf("%s", hex.Dump(sps))
nazalog.Debugf("%s", hex.Dump(pps))
Log.Debugf("%s", hex.Dump(vps))
Log.Debugf("%s", hex.Dump(sps))
Log.Debugf("%s", hex.Dump(pps))
}
func TestParseSdp2LogicContext(t *testing.T) {
@ -198,7 +196,7 @@ a=recvonly`
assert.IsNotNil(t, ctx.Vps)
assert.IsNotNil(t, ctx.Sps)
assert.IsNotNil(t, ctx.Pps)
nazalog.Debugf("%+v", ctx)
Log.Debugf("%+v", ctx)
}
func TestCase3(t *testing.T) {
@ -239,7 +237,7 @@ a=recvonly`
assert.Equal(t, nil, ctx.Vps)
assert.IsNotNil(t, ctx.Sps)
assert.IsNotNil(t, ctx.Pps)
nazalog.Debugf("%+v", ctx)
Log.Debugf("%+v", ctx)
}
func TestCase4(t *testing.T) {
@ -283,7 +281,7 @@ a=appversion:1.0`
assert.Equal(t, nil, ctx.Vps)
assert.IsNotNil(t, ctx.Sps)
assert.IsNotNil(t, ctx.Pps)
nazalog.Debugf("%+v", ctx)
Log.Debugf("%+v", ctx)
}
func TestCase5(t *testing.T) {
@ -314,7 +312,7 @@ a=recvonly`
assert.Equal(t, nil, ctx.Vps)
assert.IsNotNil(t, ctx.Sps)
assert.IsNotNil(t, ctx.Pps)
nazalog.Debugf("%+v", ctx)
Log.Debugf("%+v", ctx)
}
func TestCase6(t *testing.T) {
@ -358,7 +356,7 @@ a=appversion:1.0`
assert.Equal(t, nil, ctx.Pps)
assert.Equal(t, true, ctx.hasAudio)
assert.Equal(t, true, ctx.hasVideo)
nazalog.Debugf("%+v", ctx)
Log.Debugf("%+v", ctx)
}
// #85

@ -0,0 +1,13 @@
// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package sdp
import "github.com/q191201771/naza/pkg/nazalog"
var Log = nazalog.GetGlobalLogger()
Loading…
Cancel
Save