Files
mediadevices/pkg/codec/vaapi/params.go
Lukas Herman abdd96e6b2 Replace Name with RTPCodec in codec builder
Allowing users to implement RTPCodec will give users freedom to have
a custom encoder with custom RTP payload.
2020-10-08 11:33:38 -04:00

124 lines
3.6 KiB
Go

package vaapi
import (
"github.com/pion/mediadevices/pkg/codec"
"github.com/pion/mediadevices/pkg/io/video"
"github.com/pion/mediadevices/pkg/prop"
)
// ParamsVP8 stores VP8 encoding parameters.
type ParamsVP8 struct {
codec.BaseParams
Sequence SequenceParamVP8
RateControlMode RateControlMode
RateControl RateControlParam
}
// SequenceParamVP8 represents VAEncSequenceParameterBufferVP8 and other parameter buffers.
type SequenceParamVP8 struct {
ErrorResilient bool
ClampQindexHigh uint
ClampQindexLow uint
}
// NewVP8Params returns default parameters of VP8 codec.
func NewVP8Params() (ParamsVP8, error) {
return ParamsVP8{
BaseParams: codec.BaseParams{
BitRate: 320000,
KeyFrameInterval: 30,
},
Sequence: SequenceParamVP8{
ClampQindexLow: 9,
ClampQindexHigh: 127,
},
RateControlMode: RateControlVBR,
RateControl: RateControlParam{
TargetPercentage: 80,
WindowSize: 1500,
InitialQP: 60,
MinQP: 9,
MaxQP: 127,
},
}, nil
}
// RTPCodec represents the codec metadata
func (p *ParamsVP8) RTPCodec() *codec.RTPCodec {
return codec.NewRTPVP8Codec(90000)
}
// BuildVideoEncoder builds VP8 encoder with given params
func (p *ParamsVP8) BuildVideoEncoder(r video.Reader, property prop.Media) (codec.ReadCloser, error) {
return newVP8Encoder(r, property, *p)
}
// ParamsVP9 represents VAEncSequenceParameterBufferVP9 and other parameter buffers.
type ParamsVP9 struct {
codec.BaseParams
RateControlMode RateControlMode
RateControl RateControlParam
}
// RateControlParam represents VAEncMiscParameterRateControl.
type RateControlParam struct {
// bitsPerSecond is a maximum bit-rate.
// This parameter is calculated from BaseParams.BitRate.
bitsPerSecond uint
// TargetPercentage is a target bit-rate relative to the maximum bit-rate.
// BaseParams.BitRate / (TargetPercentage * 0.01) will be the maximum bit-rate.
TargetPercentage uint
// WindowSize is a rate control window size in milliseconds.
WindowSize uint
InitialQP uint
MinQP uint
MaxQP uint
}
// RateControlMode represents rate control mode.
// Note that supported mode depends on the codec and acceleration hardware.
type RateControlMode uint
// List of the RateControlMode.
const (
RateControlCBR RateControlMode = 0x00000002
RateControlVBR RateControlMode = 0x00000004
RateControlVCM RateControlMode = 0x00000008
RateControlCQP RateControlMode = 0x00000010
RateControlVBRConstrained RateControlMode = 0x00000020
RateControlICQ RateControlMode = 0x00000040
RateControlMB RateControlMode = 0x00000080
RateControlCFS RateControlMode = 0x00000100
RateControlParallel RateControlMode = 0x00000200
RateControlQVBR RateControlMode = 0x00000400
RateControlAVBR RateControlMode = 0x00000800
)
// NewVP9Params returns default parameters of VP9 codec.
func NewVP9Params() (ParamsVP9, error) {
return ParamsVP9{
BaseParams: codec.BaseParams{
BitRate: 320000,
KeyFrameInterval: 30,
},
RateControlMode: RateControlVBR,
RateControl: RateControlParam{
TargetPercentage: 80,
WindowSize: 1500,
InitialQP: 60,
MinQP: 9,
MaxQP: 127,
},
}, nil
}
// RTPCodec represents the codec metadata
func (p *ParamsVP9) RTPCodec() *codec.RTPCodec {
return codec.NewRTPVP9Codec(90000)
}
// BuildVideoEncoder builds VP9 encoder with given params
func (p *ParamsVP9) BuildVideoEncoder(r video.Reader, property prop.Media) (codec.ReadCloser, error) {
return newVP9Encoder(r, property, *p)
}