mirror of
https://github.com/m1k1o/neko.git
synced 2025-06-06 04:42:47 +02:00
adaptive fps moved to pipeline creation.
This commit is contained in:
parent
c45a315d9b
commit
4094639ea9
7 changed files with 40 additions and 65 deletions
|
@ -22,7 +22,7 @@ type CaptureManagerCtx struct {
|
|||
|
||||
func New(desktop types.DesktopManager, config *config.Capture) *CaptureManagerCtx {
|
||||
logger := log.With().Str("module", "capture").Logger()
|
||||
manager := &CaptureManagerCtx{
|
||||
return &CaptureManagerCtx{
|
||||
logger: logger,
|
||||
desktop: desktop,
|
||||
|
||||
|
@ -34,13 +34,15 @@ func New(desktop types.DesktopManager, config *config.Capture) *CaptureManagerCt
|
|||
return NewAudioPipeline(config.AudioCodec, config.AudioDevice, config.AudioPipeline, config.AudioBitrate)
|
||||
}, "audio"),
|
||||
video: streamSinkNew(config.VideoCodec, func() (string, error) {
|
||||
return NewVideoPipeline(config.VideoCodec, config.Display, config.VideoPipeline, config.VideoMaxFPS, config.VideoBitrate, config.VideoHWEnc)
|
||||
// use screen fps as default
|
||||
fps := desktop.GetScreenSize().Rate
|
||||
// if max fps is set, cap it to that value
|
||||
if config.VideoMaxFPS > 0 && config.VideoMaxFPS < fps {
|
||||
fps = config.VideoMaxFPS
|
||||
}
|
||||
return NewVideoPipeline(config.VideoCodec, config.Display, config.VideoPipeline, fps, config.VideoBitrate, config.VideoHWEnc)
|
||||
}, "video"),
|
||||
}
|
||||
|
||||
manager.Video().SetAdaptiveFramerate(config.VideoAdaptiveFramerate)
|
||||
|
||||
return manager
|
||||
}
|
||||
|
||||
func (manager *CaptureManagerCtx) Start() {
|
||||
|
@ -54,7 +56,7 @@ func (manager *CaptureManagerCtx) Start() {
|
|||
for {
|
||||
_, ok := <-manager.desktop.GetBeforeScreenSizeChangeChannel()
|
||||
if !ok {
|
||||
manager.logger.Info().Msg("Before screen size change channel was closed")
|
||||
manager.logger.Info().Msg("before screen size change channel was closed")
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -70,14 +72,13 @@ func (manager *CaptureManagerCtx) Start() {
|
|||
|
||||
go func() {
|
||||
for {
|
||||
framerate, ok := <-manager.desktop.GetAfterScreenSizeChangeChannel()
|
||||
_, ok := <-manager.desktop.GetAfterScreenSizeChangeChannel()
|
||||
if !ok {
|
||||
manager.logger.Info().Msg("After screen size change channel was closed")
|
||||
manager.logger.Info().Msg("after screen size change channel was closed")
|
||||
return
|
||||
}
|
||||
|
||||
if manager.video.Started() {
|
||||
manager.video.SetChangeFramerate(framerate)
|
||||
err := manager.video.createPipeline()
|
||||
if err != nil && !errors.Is(err, types.ErrCapturePipelineAlreadyExists) {
|
||||
manager.logger.Panic().Err(err).Msg("unable to recreate video pipeline")
|
||||
|
|
|
@ -2,8 +2,6 @@ package capture
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"sync"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
|
@ -18,16 +16,13 @@ type StreamSinkManagerCtx struct {
|
|||
logger zerolog.Logger
|
||||
mu sync.Mutex
|
||||
|
||||
codec codec.RTPCodec
|
||||
pipeline *gst.Pipeline
|
||||
pipelineMu sync.Mutex
|
||||
pipelineFn func() (string, error)
|
||||
adaptiveFramerate bool
|
||||
codec codec.RTPCodec
|
||||
pipeline *gst.Pipeline
|
||||
pipelineMu sync.Mutex
|
||||
pipelineFn func() (string, error)
|
||||
|
||||
listeners int
|
||||
listenersMu sync.Mutex
|
||||
|
||||
changeFramerate int16
|
||||
}
|
||||
|
||||
func streamSinkNew(codec codec.RTPCodec, pipelineFn func() (string, error), video_id string) *StreamSinkManagerCtx {
|
||||
|
@ -37,11 +32,9 @@ func streamSinkNew(codec codec.RTPCodec, pipelineFn func() (string, error), vide
|
|||
Str("video_id", video_id).Logger()
|
||||
|
||||
manager := &StreamSinkManagerCtx{
|
||||
logger: logger,
|
||||
codec: codec,
|
||||
pipelineFn: pipelineFn,
|
||||
changeFramerate: 0,
|
||||
adaptiveFramerate: false,
|
||||
logger: logger,
|
||||
codec: codec,
|
||||
pipelineFn: pipelineFn,
|
||||
}
|
||||
|
||||
return manager
|
||||
|
@ -141,11 +134,6 @@ func (manager *StreamSinkManagerCtx) createPipeline() error {
|
|||
return err
|
||||
}
|
||||
|
||||
if manager.changeFramerate > 0 && manager.adaptiveFramerate {
|
||||
m1 := regexp.MustCompile(`framerate=\d+/1`)
|
||||
pipelineStr = m1.ReplaceAllString(pipelineStr, "framerate="+strconv.FormatInt(int64(manager.changeFramerate), 10)+"/1")
|
||||
}
|
||||
|
||||
manager.logger.Info().
|
||||
Str("codec", manager.codec.Name).
|
||||
Str("src", pipelineStr).
|
||||
|
@ -187,11 +175,3 @@ func (manager *StreamSinkManagerCtx) GetSampleChannel() chan types.Sample {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (manager *StreamSinkManagerCtx) SetChangeFramerate(rate int16) {
|
||||
manager.changeFramerate = rate
|
||||
}
|
||||
|
||||
func (manager *StreamSinkManagerCtx) SetAdaptiveFramerate(allow bool) {
|
||||
manager.adaptiveFramerate = allow
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue