mirror of
https://github.com/pion/mediadevices.git
synced 2025-10-24 17:10:27 +08:00
codec/vaapi: calculate max bit-rate from BaseParam
This commit is contained in:
committed by
Lukas Herman
parent
a3c9949c90
commit
7bb7c9e927
@@ -67,7 +67,7 @@ func main() {
|
|||||||
// This example is using libva's hardware accelerated codec.
|
// This example is using libva's hardware accelerated codec.
|
||||||
// Set encoder parameters to prohibit bitrate overshoot as possible.
|
// Set encoder parameters to prohibit bitrate overshoot as possible.
|
||||||
cp.RateControlMode = vaapi.RateControlVBR
|
cp.RateControlMode = vaapi.RateControlVBR
|
||||||
cp.RateControl.BitsPerSecond = 400000
|
cp.BitRate = 400000
|
||||||
cp.RateControl.TargetPercentage = 95
|
cp.RateControl.TargetPercentage = 95
|
||||||
c.VideoEncoderBuilders = []codec.VideoEncoderBuilder{&cp}
|
c.VideoEncoderBuilders = []codec.VideoEncoderBuilder{&cp}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -27,13 +27,16 @@ type SequenceParamVP8 struct {
|
|||||||
// NewVP8Param returns default parameters of VP8 codec.
|
// NewVP8Param returns default parameters of VP8 codec.
|
||||||
func NewVP8Param() (ParamVP8, error) {
|
func NewVP8Param() (ParamVP8, error) {
|
||||||
return ParamVP8{
|
return ParamVP8{
|
||||||
|
BaseParams: codec.BaseParams{
|
||||||
|
BitRate: 320000,
|
||||||
|
KeyFrameInterval: 30,
|
||||||
|
},
|
||||||
Sequence: SequenceParamVP8{
|
Sequence: SequenceParamVP8{
|
||||||
ClampQindexLow: 9,
|
ClampQindexLow: 9,
|
||||||
ClampQindexHigh: 127,
|
ClampQindexHigh: 127,
|
||||||
},
|
},
|
||||||
RateControlMode: RateControlVBR,
|
RateControlMode: RateControlVBR,
|
||||||
RateControl: RateControlParam{
|
RateControl: RateControlParam{
|
||||||
BitsPerSecond: 400000,
|
|
||||||
TargetPercentage: 80,
|
TargetPercentage: 80,
|
||||||
WindowSize: 1500,
|
WindowSize: 1500,
|
||||||
InitialQP: 60,
|
InitialQP: 60,
|
||||||
@@ -62,10 +65,11 @@ type ParamVP9 struct {
|
|||||||
|
|
||||||
// RateControlParam represents VAEncMiscParameterRateControl.
|
// RateControlParam represents VAEncMiscParameterRateControl.
|
||||||
type RateControlParam struct {
|
type RateControlParam struct {
|
||||||
// BitsPerSecond is a maximum bit-rate.
|
// bitsPerSecond is a maximum bit-rate.
|
||||||
// This parameter overwrites prop.Codec.BitRate.
|
// This parameter is calculated from BaseParams.BitRate.
|
||||||
BitsPerSecond uint
|
bitsPerSecond uint
|
||||||
// TargetPercentage is a target bit-rate relative to BitsPerSecond.
|
// 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
|
TargetPercentage uint
|
||||||
// WindowSize is a rate control window size in milliseconds.
|
// WindowSize is a rate control window size in milliseconds.
|
||||||
WindowSize uint
|
WindowSize uint
|
||||||
@@ -96,9 +100,12 @@ const (
|
|||||||
// NewVP9Param returns default parameters of VP9 codec.
|
// NewVP9Param returns default parameters of VP9 codec.
|
||||||
func NewVP9Param() (ParamVP9, error) {
|
func NewVP9Param() (ParamVP9, error) {
|
||||||
return ParamVP9{
|
return ParamVP9{
|
||||||
|
BaseParams: codec.BaseParams{
|
||||||
|
BitRate: 320000,
|
||||||
|
KeyFrameInterval: 30,
|
||||||
|
},
|
||||||
RateControlMode: RateControlVBR,
|
RateControlMode: RateControlVBR,
|
||||||
RateControl: RateControlParam{
|
RateControl: RateControlParam{
|
||||||
BitsPerSecond: 400000,
|
|
||||||
TargetPercentage: 80,
|
TargetPercentage: 80,
|
||||||
WindowSize: 1500,
|
WindowSize: 1500,
|
||||||
InitialQP: 60,
|
InitialQP: 60,
|
||||||
|
|||||||
@@ -106,9 +106,8 @@ func newVP8Encoder(r video.Reader, p prop.Media, params ParamVP8) (io.ReadCloser
|
|||||||
p.FrameRate = 30
|
p.FrameRate = 30
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.RateControl.BitsPerSecond == 0 {
|
params.RateControl.bitsPerSecond =
|
||||||
params.RateControl.BitsPerSecond = uint(float32(params.BitRate) * 1.5)
|
uint(float32(params.BitRate) / (0.01 * float32(params.RateControl.TargetPercentage)))
|
||||||
}
|
|
||||||
|
|
||||||
// Parameters are from https://github.com/intel/libva-utils/blob/master/encode/vp8enc.c
|
// Parameters are from https://github.com/intel/libva-utils/blob/master/encode/vp8enc.c
|
||||||
e := &encoderVP8{
|
e := &encoderVP8{
|
||||||
@@ -119,7 +118,7 @@ func newVP8Encoder(r video.Reader, p prop.Media, params ParamVP8) (io.ReadCloser
|
|||||||
seqParam: C.VAEncSequenceParameterBufferVP8{
|
seqParam: C.VAEncSequenceParameterBufferVP8{
|
||||||
frame_width: C.uint(p.Width),
|
frame_width: C.uint(p.Width),
|
||||||
frame_height: C.uint(p.Height),
|
frame_height: C.uint(p.Height),
|
||||||
bits_per_second: C.uint(params.RateControl.BitsPerSecond),
|
bits_per_second: C.uint(params.RateControl.bitsPerSecond),
|
||||||
intra_period: C.uint(params.KeyFrameInterval),
|
intra_period: C.uint(params.KeyFrameInterval),
|
||||||
kf_max_dist: C.uint(params.KeyFrameInterval),
|
kf_max_dist: C.uint(params.KeyFrameInterval),
|
||||||
reference_frames: [4]C.VASurfaceID{
|
reference_frames: [4]C.VASurfaceID{
|
||||||
@@ -153,9 +152,9 @@ func newVP8Encoder(r video.Reader, p prop.Media, params ParamVP8) (io.ReadCloser
|
|||||||
_type: C.VAEncMiscParameterTypeHRD,
|
_type: C.VAEncMiscParameterTypeHRD,
|
||||||
},
|
},
|
||||||
data: C.VAEncMiscParameterHRD{
|
data: C.VAEncMiscParameterHRD{
|
||||||
initial_buffer_fullness: C.uint(params.RateControl.BitsPerSecond *
|
initial_buffer_fullness: C.uint(params.RateControl.bitsPerSecond *
|
||||||
params.RateControl.WindowSize / 2000),
|
params.RateControl.WindowSize / 2000),
|
||||||
buffer_size: C.uint(params.RateControl.BitsPerSecond *
|
buffer_size: C.uint(params.RateControl.bitsPerSecond *
|
||||||
params.RateControl.WindowSize / 1000),
|
params.RateControl.WindowSize / 1000),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -176,7 +175,7 @@ func newVP8Encoder(r video.Reader, p prop.Media, params ParamVP8) (io.ReadCloser
|
|||||||
initial_qp: C.uint(params.RateControl.InitialQP),
|
initial_qp: C.uint(params.RateControl.InitialQP),
|
||||||
min_qp: C.uint(params.RateControl.MinQP),
|
min_qp: C.uint(params.RateControl.MinQP),
|
||||||
max_qp: C.uint(params.RateControl.MaxQP),
|
max_qp: C.uint(params.RateControl.MaxQP),
|
||||||
bits_per_second: C.uint(params.RateControl.BitsPerSecond),
|
bits_per_second: C.uint(params.RateControl.bitsPerSecond),
|
||||||
target_percentage: C.uint(params.RateControl.TargetPercentage),
|
target_percentage: C.uint(params.RateControl.TargetPercentage),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -110,9 +110,8 @@ func newVP9Encoder(r video.Reader, p prop.Media, params ParamVP9) (io.ReadCloser
|
|||||||
p.FrameRate = 30
|
p.FrameRate = 30
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.RateControl.BitsPerSecond == 0 {
|
params.RateControl.bitsPerSecond =
|
||||||
params.RateControl.BitsPerSecond = uint(float32(params.BitRate) * 1.5)
|
uint(float32(params.BitRate) / (0.01 * float32(params.RateControl.TargetPercentage)))
|
||||||
}
|
|
||||||
|
|
||||||
// Parameters are from https://github.com/intel/libva-utils/blob/master/encode/vp9enc.c
|
// Parameters are from https://github.com/intel/libva-utils/blob/master/encode/vp9enc.c
|
||||||
e := &encoderVP9{
|
e := &encoderVP9{
|
||||||
@@ -123,7 +122,7 @@ func newVP9Encoder(r video.Reader, p prop.Media, params ParamVP9) (io.ReadCloser
|
|||||||
seqParam: C.VAEncSequenceParameterBufferVP9{
|
seqParam: C.VAEncSequenceParameterBufferVP9{
|
||||||
max_frame_width: 8192,
|
max_frame_width: 8192,
|
||||||
max_frame_height: 8192,
|
max_frame_height: 8192,
|
||||||
bits_per_second: C.uint(params.RateControl.BitsPerSecond),
|
bits_per_second: C.uint(params.RateControl.bitsPerSecond),
|
||||||
intra_period: C.uint(params.KeyFrameInterval),
|
intra_period: C.uint(params.KeyFrameInterval),
|
||||||
kf_min_dist: 1,
|
kf_min_dist: 1,
|
||||||
kf_max_dist: C.uint(params.KeyFrameInterval),
|
kf_max_dist: C.uint(params.KeyFrameInterval),
|
||||||
@@ -161,9 +160,9 @@ func newVP9Encoder(r video.Reader, p prop.Media, params ParamVP9) (io.ReadCloser
|
|||||||
_type: C.VAEncMiscParameterTypeHRD,
|
_type: C.VAEncMiscParameterTypeHRD,
|
||||||
},
|
},
|
||||||
data: C.VAEncMiscParameterHRD{
|
data: C.VAEncMiscParameterHRD{
|
||||||
initial_buffer_fullness: C.uint(params.RateControl.BitsPerSecond *
|
initial_buffer_fullness: C.uint(params.RateControl.bitsPerSecond *
|
||||||
params.RateControl.WindowSize / 2000),
|
params.RateControl.WindowSize / 2000),
|
||||||
buffer_size: C.uint(params.RateControl.BitsPerSecond *
|
buffer_size: C.uint(params.RateControl.bitsPerSecond *
|
||||||
params.RateControl.WindowSize / 1000),
|
params.RateControl.WindowSize / 1000),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -184,7 +183,7 @@ func newVP9Encoder(r video.Reader, p prop.Media, params ParamVP9) (io.ReadCloser
|
|||||||
initial_qp: C.uint(params.RateControl.InitialQP),
|
initial_qp: C.uint(params.RateControl.InitialQP),
|
||||||
min_qp: C.uint(params.RateControl.MinQP),
|
min_qp: C.uint(params.RateControl.MinQP),
|
||||||
max_qp: C.uint(params.RateControl.MaxQP),
|
max_qp: C.uint(params.RateControl.MaxQP),
|
||||||
bits_per_second: C.uint(params.RateControl.BitsPerSecond),
|
bits_per_second: C.uint(params.RateControl.bitsPerSecond),
|
||||||
target_percentage: C.uint(params.RateControl.TargetPercentage),
|
target_percentage: C.uint(params.RateControl.TargetPercentage),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user