mirror of https://github.com/stashapp/stash.git
79 lines
2.4 KiB
Go
79 lines
2.4 KiB
Go
|
package ffmpeg
|
||
|
|
||
|
import "fmt"
|
||
|
|
||
|
// VideoFilter represents video filter parameters to be passed to ffmpeg.
|
||
|
type VideoFilter string
|
||
|
|
||
|
// Args converts the video filter parameters to a slice of arguments to be passed to ffmpeg.
|
||
|
// Returns an empty slice if the filter is empty.
|
||
|
func (f VideoFilter) Args() []string {
|
||
|
if f == "" {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return []string{"-vf", string(f)}
|
||
|
}
|
||
|
|
||
|
// ScaleWidth returns a VideoFilter scaling the width to the given width, maintaining aspect ratio and a height as a multiple of 2.
|
||
|
func (f VideoFilter) ScaleWidth(w int) VideoFilter {
|
||
|
return f.ScaleDimensions(w, -2)
|
||
|
}
|
||
|
|
||
|
func (f VideoFilter) ScaleHeight(h int) VideoFilter {
|
||
|
return f.ScaleDimensions(-2, h)
|
||
|
}
|
||
|
|
||
|
// ScaleDimesions returns a VideoFilter scaling using w and h. Use -n to maintain aspect ratio and maintain as multiple of n.
|
||
|
func (f VideoFilter) ScaleDimensions(w, h int) VideoFilter {
|
||
|
return f.Append(fmt.Sprintf("scale=%v:%v", w, h))
|
||
|
}
|
||
|
|
||
|
// ScaleMaxSize returns a VideoFilter scaling to maxDimensions, maintaining aspect ratio using force_original_aspect_ratio=decrease.
|
||
|
func (f VideoFilter) ScaleMaxSize(maxDimensions int) VideoFilter {
|
||
|
return f.Append(fmt.Sprintf("scale=%v:%v:force_original_aspect_ratio=decrease", maxDimensions, maxDimensions))
|
||
|
}
|
||
|
|
||
|
// ScaleMax returns a VideoFilter scaling to maxSize. It will scale width if it is larger than height, otherwise it will scale height.
|
||
|
func (f VideoFilter) ScaleMax(inputWidth, inputHeight, maxSize int) VideoFilter {
|
||
|
// get the smaller dimension of the input
|
||
|
videoSize := inputHeight
|
||
|
if inputWidth < videoSize {
|
||
|
videoSize = inputWidth
|
||
|
}
|
||
|
|
||
|
// if maxSize is larger than the video dimension, then no-op
|
||
|
if maxSize >= videoSize || maxSize == 0 {
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
// we're setting either the width or height
|
||
|
// we'll set the smaller dimesion
|
||
|
if inputWidth > inputHeight {
|
||
|
// set the height
|
||
|
return f.ScaleDimensions(-2, maxSize)
|
||
|
}
|
||
|
|
||
|
return f.ScaleDimensions(maxSize, -2)
|
||
|
}
|
||
|
|
||
|
// Fps returns a VideoFilter setting the frames per second.
|
||
|
func (f VideoFilter) Fps(fps int) VideoFilter {
|
||
|
return f.Append(fmt.Sprintf("fps=%v", fps))
|
||
|
}
|
||
|
|
||
|
// Select returns a VideoFilter to select the given frame.
|
||
|
func (f VideoFilter) Select(frame int) VideoFilter {
|
||
|
return f.Append(fmt.Sprintf("select=eq(n\\,%d)", frame))
|
||
|
}
|
||
|
|
||
|
// Append returns a VideoFilter appending the given string.
|
||
|
func (f VideoFilter) Append(s string) VideoFilter {
|
||
|
// if filter is empty, then just set
|
||
|
if f == "" {
|
||
|
return VideoFilter(s)
|
||
|
}
|
||
|
|
||
|
return VideoFilter(fmt.Sprintf("%s,%s", f, s))
|
||
|
}
|