diff --git a/README.md b/README.md index 6640c6a1..910eef56 100644 --- a/README.md +++ b/README.md @@ -722,7 +722,7 @@ paths: # Codec. in case of secondary streams, it defaults to M-JPEG. rpiCameraCodec: auto # JPEG quality. - rpiCameraJPEGQuality: 60 + rpiCameraMJPEGQuality: 60 ``` The secondary stream is available in path `/secondary`. diff --git a/apidocs/openapi.yaml b/apidocs/openapi.yaml index a7fdee00..a939b26f 100644 --- a/apidocs/openapi.yaml +++ b/apidocs/openapi.yaml @@ -456,7 +456,7 @@ components: type: string rpiCameraLevel: type: string - rpiCameraJPEGQuality: + rpiCameraMJPEGQuality: type: integer # Hooks diff --git a/internal/conf/conf_test.go b/internal/conf/conf_test.go index cc200765..608fd1b5 100644 --- a/internal/conf/conf_test.go +++ b/internal/conf/conf_test.go @@ -79,7 +79,7 @@ func TestConfFromFile(t *testing.T) { RPICameraBitrate: 5000000, RPICameraProfile: "main", RPICameraLevel: "4.1", - RPICameraJPEGQuality: 60, + RPICameraMJPEGQuality: 60, RunOnDemandStartTimeout: 5 * Duration(time.Second), RunOnDemandCloseAfter: 10 * Duration(time.Second), }, pa) diff --git a/internal/conf/path.go b/internal/conf/path.go index a89719a2..47a9c6a0 100644 --- a/internal/conf/path.go +++ b/internal/conf/path.go @@ -157,48 +157,49 @@ type Path struct { SourceRedirect string `json:"sourceRedirect"` // Raspberry Pi Camera source - RPICameraCamID uint `json:"rpiCameraCamID"` - RPICameraSecondary bool `json:"rpiCameraSecondary"` - RPICameraWidth uint `json:"rpiCameraWidth"` - RPICameraHeight uint `json:"rpiCameraHeight"` - RPICameraHFlip bool `json:"rpiCameraHFlip"` - RPICameraVFlip bool `json:"rpiCameraVFlip"` - RPICameraBrightness float64 `json:"rpiCameraBrightness"` - RPICameraContrast float64 `json:"rpiCameraContrast"` - RPICameraSaturation float64 `json:"rpiCameraSaturation"` - RPICameraSharpness float64 `json:"rpiCameraSharpness"` - RPICameraExposure string `json:"rpiCameraExposure"` - RPICameraAWB string `json:"rpiCameraAWB"` - RPICameraAWBGains []float64 `json:"rpiCameraAWBGains"` - RPICameraDenoise string `json:"rpiCameraDenoise"` - RPICameraShutter uint `json:"rpiCameraShutter"` - RPICameraMetering string `json:"rpiCameraMetering"` - RPICameraGain float64 `json:"rpiCameraGain"` - RPICameraEV float64 `json:"rpiCameraEV"` - RPICameraROI string `json:"rpiCameraROI"` - RPICameraHDR bool `json:"rpiCameraHDR"` - RPICameraTuningFile string `json:"rpiCameraTuningFile"` - RPICameraMode string `json:"rpiCameraMode"` - RPICameraFPS float64 `json:"rpiCameraFPS"` - RPICameraAfMode string `json:"rpiCameraAfMode"` - RPICameraAfRange string `json:"rpiCameraAfRange"` - RPICameraAfSpeed string `json:"rpiCameraAfSpeed"` - RPICameraLensPosition float64 `json:"rpiCameraLensPosition"` - RPICameraAfWindow string `json:"rpiCameraAfWindow"` - RPICameraFlickerPeriod uint `json:"rpiCameraFlickerPeriod"` - RPICameraTextOverlayEnable bool `json:"rpiCameraTextOverlayEnable"` - RPICameraTextOverlay string `json:"rpiCameraTextOverlay"` - RPICameraCodec string `json:"rpiCameraCodec"` - RPICameraIDRPeriod uint `json:"rpiCameraIDRPeriod"` - RPICameraBitrate uint `json:"rpiCameraBitrate"` - RPICameraProfile string `json:"rpiCameraProfile"` - RPICameraLevel string `json:"rpiCameraLevel"` - RPICameraJPEGQuality uint `json:"rpiCameraJPEGQuality"` - RPICameraPrimaryName string `json:"-"` // filled by Check() - RPICameraSecondaryWidth uint `json:"-"` // filled by Check() - RPICameraSecondaryHeight uint `json:"-"` // filled by Check() - RPICameraSecondaryFPS float64 `json:"-"` // filled by Check() - RPICameraSecondaryJPEGQuality uint `json:"-"` // filled by Check() + RPICameraCamID uint `json:"rpiCameraCamID"` + RPICameraSecondary bool `json:"rpiCameraSecondary"` + RPICameraWidth uint `json:"rpiCameraWidth"` + RPICameraHeight uint `json:"rpiCameraHeight"` + RPICameraHFlip bool `json:"rpiCameraHFlip"` + RPICameraVFlip bool `json:"rpiCameraVFlip"` + RPICameraBrightness float64 `json:"rpiCameraBrightness"` + RPICameraContrast float64 `json:"rpiCameraContrast"` + RPICameraSaturation float64 `json:"rpiCameraSaturation"` + RPICameraSharpness float64 `json:"rpiCameraSharpness"` + RPICameraExposure string `json:"rpiCameraExposure"` + RPICameraAWB string `json:"rpiCameraAWB"` + RPICameraAWBGains []float64 `json:"rpiCameraAWBGains"` + RPICameraDenoise string `json:"rpiCameraDenoise"` + RPICameraShutter uint `json:"rpiCameraShutter"` + RPICameraMetering string `json:"rpiCameraMetering"` + RPICameraGain float64 `json:"rpiCameraGain"` + RPICameraEV float64 `json:"rpiCameraEV"` + RPICameraROI string `json:"rpiCameraROI"` + RPICameraHDR bool `json:"rpiCameraHDR"` + RPICameraTuningFile string `json:"rpiCameraTuningFile"` + RPICameraMode string `json:"rpiCameraMode"` + RPICameraFPS float64 `json:"rpiCameraFPS"` + RPICameraAfMode string `json:"rpiCameraAfMode"` + RPICameraAfRange string `json:"rpiCameraAfRange"` + RPICameraAfSpeed string `json:"rpiCameraAfSpeed"` + RPICameraLensPosition float64 `json:"rpiCameraLensPosition"` + RPICameraAfWindow string `json:"rpiCameraAfWindow"` + RPICameraFlickerPeriod uint `json:"rpiCameraFlickerPeriod"` + RPICameraTextOverlayEnable bool `json:"rpiCameraTextOverlayEnable"` + RPICameraTextOverlay string `json:"rpiCameraTextOverlay"` + RPICameraCodec string `json:"rpiCameraCodec"` + RPICameraIDRPeriod uint `json:"rpiCameraIDRPeriod"` + RPICameraBitrate uint `json:"rpiCameraBitrate"` + RPICameraProfile string `json:"rpiCameraProfile"` + RPICameraLevel string `json:"rpiCameraLevel"` + RPICameraJPEGQuality *uint `json:"rpiCameraJPEGQuality,omitempty"` // deprecated + RPICameraMJPEGQuality uint `json:"rpiCameraMJPEGQuality"` + RPICameraPrimaryName string `json:"-"` // filled by Check() + RPICameraSecondaryWidth uint `json:"-"` // filled by Check() + RPICameraSecondaryHeight uint `json:"-"` // filled by Check() + RPICameraSecondaryFPS float64 `json:"-"` // filled by Check() + RPICameraSecondaryMJPEGQuality uint `json:"-"` // filled by Check() // Hooks RunOnInit string `json:"runOnInit"` @@ -256,7 +257,7 @@ func (pconf *Path) setDefaults() { pconf.RPICameraBitrate = 5000000 pconf.RPICameraProfile = "main" pconf.RPICameraLevel = "4.1" - pconf.RPICameraJPEGQuality = 60 + pconf.RPICameraMJPEGQuality = 60 // Hooks pconf.RunOnDemandStartTimeout = 10 * Duration(time.Second) @@ -288,7 +289,7 @@ func (pconf Path) Clone() *Path { dest.RPICameraSecondaryWidth = pconf.RPICameraSecondaryWidth dest.RPICameraSecondaryHeight = pconf.RPICameraSecondaryHeight dest.RPICameraSecondaryFPS = pconf.RPICameraSecondaryFPS - dest.RPICameraSecondaryJPEGQuality = pconf.RPICameraSecondaryJPEGQuality + dest.RPICameraSecondaryMJPEGQuality = pconf.RPICameraSecondaryMJPEGQuality return &dest } @@ -506,6 +507,12 @@ func (pconf *Path) validate( return fmt.Errorf("invalid 'rpiCameraLevel' value") } + if pconf.RPICameraJPEGQuality != nil { + l.Log(logger.Warn, "parameter 'rpiCameraJPEGQuality' is deprecated"+ + " and has been replaced with 'rpiCameraMJPEGQuality'") + pconf.RPICameraMJPEGQuality = *pconf.RPICameraJPEGQuality + } + if !pconf.RPICameraSecondary { switch pconf.RPICameraCodec { case "auto", "hardwareH264", "softwareH264": @@ -557,7 +564,7 @@ func (pconf *Path) validate( primary.RPICameraSecondaryWidth = pconf.RPICameraWidth primary.RPICameraSecondaryHeight = pconf.RPICameraHeight primary.RPICameraSecondaryFPS = pconf.RPICameraFPS - primary.RPICameraSecondaryJPEGQuality = pconf.RPICameraJPEGQuality + primary.RPICameraSecondaryMJPEGQuality = pconf.RPICameraMJPEGQuality } default: diff --git a/internal/staticsources/rpicamera/source.go b/internal/staticsources/rpicamera/source.go index aa78ae84..a0a543b8 100644 --- a/internal/staticsources/rpicamera/source.go +++ b/internal/staticsources/rpicamera/source.go @@ -76,7 +76,7 @@ func paramsFromConf(logLevel conf.LogLevel, cnf *conf.Path) params { SecondaryWidth: uint32(cnf.RPICameraSecondaryWidth), SecondaryHeight: uint32(cnf.RPICameraSecondaryHeight), SecondaryFPS: float32(cnf.RPICameraSecondaryFPS), - SecondaryQuality: uint32(cnf.RPICameraSecondaryJPEGQuality), + SecondaryQuality: uint32(cnf.RPICameraSecondaryMJPEGQuality), } } diff --git a/mediamtx.yml b/mediamtx.yml index 890597c6..7bb19c87 100644 --- a/mediamtx.yml +++ b/mediamtx.yml @@ -611,7 +611,8 @@ pathDefaults: # format is the one of the strftime() function. rpiCameraTextOverlay: '%Y-%m-%d %H:%M:%S - MediaMTX' # Codec (auto, hardwareH264, softwareH264 or mjpeg). - # When auto, hardwareH264 is used if the Raspberry has a H264 encoder, otherwise softwareH264. + # When is "auto" and stream is primary, it defaults to hardwareH264 (if available) or softwareH264. + # When is "auto" and stream is secondary, it defaults to mjpeg. rpiCameraCodec: auto # Period between IDR frames (when codec is hardwareH264 or softwareH264). rpiCameraIDRPeriod: 60 @@ -621,8 +622,8 @@ pathDefaults: rpiCameraProfile: main # H264 level (4.0, 4.1 or 4.2). rpiCameraLevel: '4.1' - # JPEG quality. - rpiCameraJPEGQuality: 60 + # M-JPEG JPEG quality (when codec is mjpeg). + rpiCameraMJPEGQuality: 60 ############################################### # Default path settings -> Hooks