mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
01. Support GB config as StreamCaster. 02. Support disable GB by --gb28181=off. 03. Add utests for SIP examples. 04. Wireshark plugin to decode TCP/9000 as rtp.rfc4571 05. Support MPEGPS program stream codec. 06. Add utest for PS stream codec. 07. Decode MPEGPS packet stream. 08. Carry RTP and PS packet as helper in PS message. 09. Support recover from error mode. 10. Support process by a pack of PS/TS messages. 11. Add statistic for recovered and msgs dropped. 12. Recover from err position fastly. 13. Define state machine for GB session. 14. Bind context to GB session. 15. Re-invite when media disconnected. 16. Update GitHub actions with GB28181. 17. Support parse CANDIDATE by env or pip. 18. Support mux GB28181 to RTMP. 19. Support regression test by srs-bench.
285 lines
5.3 KiB
Go
285 lines
5.3 KiB
Go
package ansi
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
black = iota
|
|
red
|
|
green
|
|
yellow
|
|
blue
|
|
magenta
|
|
cyan
|
|
white
|
|
defaultt = 9
|
|
|
|
normalIntensityFG = 30
|
|
highIntensityFG = 90
|
|
normalIntensityBG = 40
|
|
highIntensityBG = 100
|
|
|
|
start = "\033["
|
|
bold = "1;"
|
|
blink = "5;"
|
|
underline = "4;"
|
|
inverse = "7;"
|
|
strikethrough = "9;"
|
|
|
|
// Reset is the ANSI reset escape sequence
|
|
Reset = "\033[0m"
|
|
// DefaultBG is the default background
|
|
DefaultBG = "\033[49m"
|
|
// DefaultFG is the default foreground
|
|
DefaultFG = "\033[39m"
|
|
)
|
|
|
|
// Black FG
|
|
var Black string
|
|
|
|
// Red FG
|
|
var Red string
|
|
|
|
// Green FG
|
|
var Green string
|
|
|
|
// Yellow FG
|
|
var Yellow string
|
|
|
|
// Blue FG
|
|
var Blue string
|
|
|
|
// Magenta FG
|
|
var Magenta string
|
|
|
|
// Cyan FG
|
|
var Cyan string
|
|
|
|
// White FG
|
|
var White string
|
|
|
|
// LightBlack FG
|
|
var LightBlack string
|
|
|
|
// LightRed FG
|
|
var LightRed string
|
|
|
|
// LightGreen FG
|
|
var LightGreen string
|
|
|
|
// LightYellow FG
|
|
var LightYellow string
|
|
|
|
// LightBlue FG
|
|
var LightBlue string
|
|
|
|
// LightMagenta FG
|
|
var LightMagenta string
|
|
|
|
// LightCyan FG
|
|
var LightCyan string
|
|
|
|
// LightWhite FG
|
|
var LightWhite string
|
|
|
|
var (
|
|
plain = false
|
|
// Colors maps common color names to their ANSI color code.
|
|
Colors = map[string]int{
|
|
"black": black,
|
|
"red": red,
|
|
"green": green,
|
|
"yellow": yellow,
|
|
"blue": blue,
|
|
"magenta": magenta,
|
|
"cyan": cyan,
|
|
"white": white,
|
|
"default": defaultt,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
for i := 0; i < 256; i++ {
|
|
Colors[strconv.Itoa(i)] = i
|
|
}
|
|
|
|
Black = ColorCode("black")
|
|
Red = ColorCode("red")
|
|
Green = ColorCode("green")
|
|
Yellow = ColorCode("yellow")
|
|
Blue = ColorCode("blue")
|
|
Magenta = ColorCode("magenta")
|
|
Cyan = ColorCode("cyan")
|
|
White = ColorCode("white")
|
|
LightBlack = ColorCode("black+h")
|
|
LightRed = ColorCode("red+h")
|
|
LightGreen = ColorCode("green+h")
|
|
LightYellow = ColorCode("yellow+h")
|
|
LightBlue = ColorCode("blue+h")
|
|
LightMagenta = ColorCode("magenta+h")
|
|
LightCyan = ColorCode("cyan+h")
|
|
LightWhite = ColorCode("white+h")
|
|
}
|
|
|
|
// ColorCode returns the ANSI color color code for style.
|
|
func ColorCode(style string) string {
|
|
return colorCode(style).String()
|
|
}
|
|
|
|
// Gets the ANSI color code for a style.
|
|
func colorCode(style string) *bytes.Buffer {
|
|
buf := bytes.NewBufferString("")
|
|
if plain || style == "" {
|
|
return buf
|
|
}
|
|
if style == "reset" {
|
|
buf.WriteString(Reset)
|
|
return buf
|
|
} else if style == "off" {
|
|
return buf
|
|
}
|
|
|
|
foregroundBackground := strings.Split(style, ":")
|
|
foreground := strings.Split(foregroundBackground[0], "+")
|
|
fgKey := foreground[0]
|
|
fg := Colors[fgKey]
|
|
fgStyle := ""
|
|
if len(foreground) > 1 {
|
|
fgStyle = foreground[1]
|
|
}
|
|
|
|
bg, bgStyle := "", ""
|
|
|
|
if len(foregroundBackground) > 1 {
|
|
background := strings.Split(foregroundBackground[1], "+")
|
|
bg = background[0]
|
|
if len(background) > 1 {
|
|
bgStyle = background[1]
|
|
}
|
|
}
|
|
|
|
buf.WriteString(start)
|
|
base := normalIntensityFG
|
|
if len(fgStyle) > 0 {
|
|
if strings.Contains(fgStyle, "b") {
|
|
buf.WriteString(bold)
|
|
}
|
|
if strings.Contains(fgStyle, "B") {
|
|
buf.WriteString(blink)
|
|
}
|
|
if strings.Contains(fgStyle, "u") {
|
|
buf.WriteString(underline)
|
|
}
|
|
if strings.Contains(fgStyle, "i") {
|
|
buf.WriteString(inverse)
|
|
}
|
|
if strings.Contains(fgStyle, "s") {
|
|
buf.WriteString(strikethrough)
|
|
}
|
|
if strings.Contains(fgStyle, "h") {
|
|
base = highIntensityFG
|
|
}
|
|
}
|
|
|
|
// if 256-color
|
|
n, err := strconv.Atoi(fgKey)
|
|
if err == nil {
|
|
fmt.Fprintf(buf, "38;5;%d;", n)
|
|
} else {
|
|
fmt.Fprintf(buf, "%d;", base+fg)
|
|
}
|
|
|
|
base = normalIntensityBG
|
|
if len(bg) > 0 {
|
|
if strings.Contains(bgStyle, "h") {
|
|
base = highIntensityBG
|
|
}
|
|
// if 256-color
|
|
n, err := strconv.Atoi(bg)
|
|
if err == nil {
|
|
fmt.Fprintf(buf, "48;5;%d;", n)
|
|
} else {
|
|
fmt.Fprintf(buf, "%d;", base+Colors[bg])
|
|
}
|
|
}
|
|
|
|
// remove last ";"
|
|
buf.Truncate(buf.Len() - 1)
|
|
buf.WriteRune('m')
|
|
return buf
|
|
}
|
|
|
|
// Color colors a string based on the ANSI color code for style.
|
|
func Color(s, style string) string {
|
|
if plain || len(style) < 1 {
|
|
return s
|
|
}
|
|
buf := colorCode(style)
|
|
buf.WriteString(s)
|
|
buf.WriteString(Reset)
|
|
return buf.String()
|
|
}
|
|
|
|
// ColorFunc creates a closure to avoid computation ANSI color code.
|
|
func ColorFunc(style string) func(string) string {
|
|
if style == "" {
|
|
return func(s string) string {
|
|
return s
|
|
}
|
|
}
|
|
color := ColorCode(style)
|
|
return func(s string) string {
|
|
if plain || s == "" {
|
|
return s
|
|
}
|
|
buf := bytes.NewBufferString(color)
|
|
buf.WriteString(s)
|
|
buf.WriteString(Reset)
|
|
result := buf.String()
|
|
return result
|
|
}
|
|
}
|
|
|
|
// DisableColors disables ANSI color codes. The default is false (colors are on).
|
|
func DisableColors(disable bool) {
|
|
plain = disable
|
|
if plain {
|
|
Black = ""
|
|
Red = ""
|
|
Green = ""
|
|
Yellow = ""
|
|
Blue = ""
|
|
Magenta = ""
|
|
Cyan = ""
|
|
White = ""
|
|
LightBlack = ""
|
|
LightRed = ""
|
|
LightGreen = ""
|
|
LightYellow = ""
|
|
LightBlue = ""
|
|
LightMagenta = ""
|
|
LightCyan = ""
|
|
LightWhite = ""
|
|
} else {
|
|
Black = ColorCode("black")
|
|
Red = ColorCode("red")
|
|
Green = ColorCode("green")
|
|
Yellow = ColorCode("yellow")
|
|
Blue = ColorCode("blue")
|
|
Magenta = ColorCode("magenta")
|
|
Cyan = ColorCode("cyan")
|
|
White = ColorCode("white")
|
|
LightBlack = ColorCode("black+h")
|
|
LightRed = ColorCode("red+h")
|
|
LightGreen = ColorCode("green+h")
|
|
LightYellow = ColorCode("yellow+h")
|
|
LightBlue = ColorCode("blue+h")
|
|
LightMagenta = ColorCode("magenta+h")
|
|
LightCyan = ColorCode("cyan+h")
|
|
LightWhite = ColorCode("white+h")
|
|
}
|
|
}
|