mirror of
https://github.com/pion/mediadevices.git
synced 2025-10-05 08:36:55 +08:00

Allowing users to implement RTPCodec will give users freedom to have a custom encoder with custom RTP payload.
124 lines
3.6 KiB
Go
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)
|
|
}
|