mirror of https://bitbucket.org/ausocean/av.git
input/gvctrl: moved unexported stuff from gvctrl.go to be more friendly to API users
This commit is contained in:
parent
cda7093c21
commit
b3c3b842c8
|
@ -34,65 +34,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type codec string
|
|
||||||
|
|
||||||
const (
|
|
||||||
codecH265 codec = "28"
|
|
||||||
codecH264 codec = "10"
|
|
||||||
codecMJPEG codec = "4"
|
|
||||||
)
|
|
||||||
|
|
||||||
type quality string
|
|
||||||
|
|
||||||
const (
|
|
||||||
qualityStandard quality = "0"
|
|
||||||
qualityFair quality = "1"
|
|
||||||
qualityGood quality = "2"
|
|
||||||
qualityGreat quality = "3"
|
|
||||||
qualityExcellent quality = "4"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
res256 = "4480256"
|
|
||||||
res360 = "6400360"
|
|
||||||
res720 = "12800720"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
defaultCodec = codecH264
|
|
||||||
defaultRes = "6400360" // 360p
|
|
||||||
defaultFrameRate = "25000" // 25 fps
|
|
||||||
defaultVBR = "0" // Variable bitrate off
|
|
||||||
defaultQuality = qualityGood
|
|
||||||
defaultVBRBitRate = "250000" // 512 kbps (lowest with 360p)
|
|
||||||
defaultCBRBitRate = "512000"
|
|
||||||
defaultRefresh = "2000" // 2 seconds
|
|
||||||
)
|
|
||||||
|
|
||||||
type settings struct {
|
|
||||||
codec codec
|
|
||||||
res string
|
|
||||||
frameRate string
|
|
||||||
vbr string
|
|
||||||
quality quality
|
|
||||||
vbrBitRate string
|
|
||||||
cbrBitRate string
|
|
||||||
refresh string
|
|
||||||
}
|
|
||||||
|
|
||||||
func newSettings() settings {
|
|
||||||
return settings{
|
|
||||||
codec: defaultCodec,
|
|
||||||
res: defaultRes,
|
|
||||||
frameRate: defaultFrameRate,
|
|
||||||
vbr: defaultVBR,
|
|
||||||
quality: defaultQuality,
|
|
||||||
vbrBitRate: defaultVBRBitRate,
|
|
||||||
cbrBitRate: defaultCBRBitRate,
|
|
||||||
refresh: defaultRefresh,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type option func(s settings) (settings, error)
|
type option func(s settings) (settings, error)
|
||||||
|
|
||||||
func Set(host string, options ...option) error {
|
func Set(host string, options ...option) error {
|
||||||
|
@ -144,14 +85,22 @@ func Set(host string, options ...option) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Codec(c codec) option {
|
type Codec string
|
||||||
|
|
||||||
|
const (
|
||||||
|
CodecH265 Codec = "28"
|
||||||
|
CodecH264 Codec = "10"
|
||||||
|
CodecMJPEG Codec = "4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CodecOut(c Codec) option {
|
||||||
return func(s settings) (settings, error) {
|
return func(s settings) (settings, error) {
|
||||||
switch c {
|
switch c {
|
||||||
case codecH265, codecH264, codecMJPEG:
|
case CodecH265, CodecH264, CodecMJPEG:
|
||||||
s.codec = c
|
s.codec = c
|
||||||
return s, nil
|
return s, nil
|
||||||
default:
|
default:
|
||||||
return s, fmt.Errorf("unknown codec: %v", c)
|
return s, fmt.Errorf("unknown Codec: %v", c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,14 +136,24 @@ func VariableBitRate(b bool) option {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func VBRQuality(q quality) option {
|
type Quality string
|
||||||
|
|
||||||
|
const (
|
||||||
|
QualityStandard Quality = "0"
|
||||||
|
QualityFair Quality = "1"
|
||||||
|
QualityGood Quality = "2"
|
||||||
|
QualityGreat Quality = "3"
|
||||||
|
QualityExcellent Quality = "4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func VBRQuality(q Quality) option {
|
||||||
return func(s settings) (settings, error) {
|
return func(s settings) (settings, error) {
|
||||||
switch q {
|
switch q {
|
||||||
case qualityStandard, qualityFair, qualityGood, qualityGreat, qualityExcellent:
|
case QualityStandard, QualityFair, QualityGood, QualityGreat, QualityExcellent:
|
||||||
s.quality = q
|
s.quality = q
|
||||||
return s, nil
|
return s, nil
|
||||||
default:
|
default:
|
||||||
return s, fmt.Errorf("invalid quality: %v", q)
|
return s, fmt.Errorf("invalid Quality: %v", q)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -297,7 +297,7 @@ func TestPopulateForm(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
in: settings{
|
in: settings{
|
||||||
codec: codecH265,
|
codec: CodecH265,
|
||||||
res: defaultRes,
|
res: defaultRes,
|
||||||
frameRate: defaultFrameRate,
|
frameRate: defaultFrameRate,
|
||||||
vbr: defaultVBR,
|
vbr: defaultVBR,
|
||||||
|
@ -310,7 +310,7 @@ func TestPopulateForm(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
in: settings{
|
in: settings{
|
||||||
codec: codecMJPEG,
|
codec: CodecMJPEG,
|
||||||
res: defaultRes,
|
res: defaultRes,
|
||||||
frameRate: defaultFrameRate,
|
frameRate: defaultFrameRate,
|
||||||
vbr: defaultVBR,
|
vbr: defaultVBR,
|
||||||
|
@ -323,7 +323,7 @@ func TestPopulateForm(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
in: settings{
|
in: settings{
|
||||||
codec: codecH264,
|
codec: CodecH264,
|
||||||
res: defaultRes,
|
res: defaultRes,
|
||||||
frameRate: defaultFrameRate,
|
frameRate: defaultFrameRate,
|
||||||
vbr: "1",
|
vbr: "1",
|
||||||
|
|
|
@ -34,6 +34,47 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
res256 = "4480256"
|
||||||
|
res360 = "6400360"
|
||||||
|
res720 = "12800720"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultCodec = CodecH264
|
||||||
|
defaultRes = "6400360" // 360p
|
||||||
|
defaultFrameRate = "25000" // 25 fps
|
||||||
|
defaultVBR = "0" // Variable bitrate off
|
||||||
|
defaultQuality = QualityGood
|
||||||
|
defaultVBRBitRate = "250000" // 512 kbps (lowest with 360p)
|
||||||
|
defaultCBRBitRate = "512000"
|
||||||
|
defaultRefresh = "2000" // 2 seconds
|
||||||
|
)
|
||||||
|
|
||||||
|
type settings struct {
|
||||||
|
codec Codec
|
||||||
|
res string
|
||||||
|
frameRate string
|
||||||
|
vbr string
|
||||||
|
quality Quality
|
||||||
|
vbrBitRate string
|
||||||
|
cbrBitRate string
|
||||||
|
refresh string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSettings() settings {
|
||||||
|
return settings{
|
||||||
|
codec: defaultCodec,
|
||||||
|
res: defaultRes,
|
||||||
|
frameRate: defaultFrameRate,
|
||||||
|
vbr: defaultVBR,
|
||||||
|
quality: defaultQuality,
|
||||||
|
vbrBitRate: defaultVBRBitRate,
|
||||||
|
cbrBitRate: defaultCBRBitRate,
|
||||||
|
refresh: defaultRefresh,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func md5Hex(s string) string {
|
func md5Hex(s string) string {
|
||||||
h := md5.New()
|
h := md5.New()
|
||||||
h.Write([]byte(s))
|
h.Write([]byte(s))
|
||||||
|
@ -63,7 +104,7 @@ func populateForm(s settings) url.Values {
|
||||||
f.Set("dwFrameRate", s.frameRate)
|
f.Set("dwFrameRate", s.frameRate)
|
||||||
f.Set("custom_qp_init", "25")
|
f.Set("custom_qp_init", "25")
|
||||||
|
|
||||||
if s.codec == codecMJPEG {
|
if s.codec == CodecMJPEG {
|
||||||
f.Set("vbr_enable", "1")
|
f.Set("vbr_enable", "1")
|
||||||
f.Set("dwVbrQuality", string(s.quality))
|
f.Set("dwVbrQuality", string(s.quality))
|
||||||
|
|
||||||
|
@ -97,11 +138,11 @@ func populateForm(s settings) url.Values {
|
||||||
}
|
}
|
||||||
|
|
||||||
f.Set("gop_N", s.refresh)
|
f.Set("gop_N", s.refresh)
|
||||||
if s.codec == codecMJPEG {
|
if s.codec == CodecMJPEG {
|
||||||
f.Set("gop_N", "1500")
|
f.Set("gop_N", "1500")
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.codec == codecH264 || s.codec == codecH265 {
|
if s.codec == CodecH264 || s.codec == CodecH265 {
|
||||||
f.Set("dwEncProfile", "1")
|
f.Set("dwEncProfile", "1")
|
||||||
f.Set("dwEncLevel", "31")
|
f.Set("dwEncLevel", "31")
|
||||||
f.Set("dwEntropy", "0")
|
f.Set("dwEntropy", "0")
|
||||||
|
|
Loading…
Reference in New Issue