codec/vaapi: calculate max bit-rate from BaseParam

This commit is contained in:
Atsushi Watanabe
2020-03-21 14:30:41 +09:00
committed by Lukas Herman
parent a3c9949c90
commit 7bb7c9e927
4 changed files with 26 additions and 21 deletions

View File

@@ -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}
}, },

View File

@@ -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,

View File

@@ -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),
}, },
}, },

View File

@@ -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),
}, },
}, },