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.
// Set encoder parameters to prohibit bitrate overshoot as possible.
cp.RateControlMode = vaapi.RateControlVBR
cp.RateControl.BitsPerSecond = 400000
cp.BitRate = 400000
cp.RateControl.TargetPercentage = 95
c.VideoEncoderBuilders = []codec.VideoEncoderBuilder{&cp}
},

View File

@@ -27,13 +27,16 @@ type SequenceParamVP8 struct {
// NewVP8Param returns default parameters of VP8 codec.
func NewVP8Param() (ParamVP8, error) {
return ParamVP8{
BaseParams: codec.BaseParams{
BitRate: 320000,
KeyFrameInterval: 30,
},
Sequence: SequenceParamVP8{
ClampQindexLow: 9,
ClampQindexHigh: 127,
},
RateControlMode: RateControlVBR,
RateControl: RateControlParam{
BitsPerSecond: 400000,
TargetPercentage: 80,
WindowSize: 1500,
InitialQP: 60,
@@ -62,10 +65,11 @@ type ParamVP9 struct {
// RateControlParam represents VAEncMiscParameterRateControl.
type RateControlParam struct {
// BitsPerSecond is a maximum bit-rate.
// This parameter overwrites prop.Codec.BitRate.
BitsPerSecond uint
// TargetPercentage is a target bit-rate relative to BitsPerSecond.
// 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
@@ -96,9 +100,12 @@ const (
// NewVP9Param returns default parameters of VP9 codec.
func NewVP9Param() (ParamVP9, error) {
return ParamVP9{
BaseParams: codec.BaseParams{
BitRate: 320000,
KeyFrameInterval: 30,
},
RateControlMode: RateControlVBR,
RateControl: RateControlParam{
BitsPerSecond: 400000,
TargetPercentage: 80,
WindowSize: 1500,
InitialQP: 60,

View File

@@ -106,9 +106,8 @@ func newVP8Encoder(r video.Reader, p prop.Media, params ParamVP8) (io.ReadCloser
p.FrameRate = 30
}
if params.RateControl.BitsPerSecond == 0 {
params.RateControl.BitsPerSecond = uint(float32(params.BitRate) * 1.5)
}
params.RateControl.bitsPerSecond =
uint(float32(params.BitRate) / (0.01 * float32(params.RateControl.TargetPercentage)))
// Parameters are from https://github.com/intel/libva-utils/blob/master/encode/vp8enc.c
e := &encoderVP8{
@@ -119,7 +118,7 @@ func newVP8Encoder(r video.Reader, p prop.Media, params ParamVP8) (io.ReadCloser
seqParam: C.VAEncSequenceParameterBufferVP8{
frame_width: C.uint(p.Width),
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),
kf_max_dist: C.uint(params.KeyFrameInterval),
reference_frames: [4]C.VASurfaceID{
@@ -153,9 +152,9 @@ func newVP8Encoder(r video.Reader, p prop.Media, params ParamVP8) (io.ReadCloser
_type: C.VAEncMiscParameterTypeHRD,
},
data: C.VAEncMiscParameterHRD{
initial_buffer_fullness: C.uint(params.RateControl.BitsPerSecond *
initial_buffer_fullness: C.uint(params.RateControl.bitsPerSecond *
params.RateControl.WindowSize / 2000),
buffer_size: C.uint(params.RateControl.BitsPerSecond *
buffer_size: C.uint(params.RateControl.bitsPerSecond *
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),
min_qp: C.uint(params.RateControl.MinQP),
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),
},
},

View File

@@ -110,9 +110,8 @@ func newVP9Encoder(r video.Reader, p prop.Media, params ParamVP9) (io.ReadCloser
p.FrameRate = 30
}
if params.RateControl.BitsPerSecond == 0 {
params.RateControl.BitsPerSecond = uint(float32(params.BitRate) * 1.5)
}
params.RateControl.bitsPerSecond =
uint(float32(params.BitRate) / (0.01 * float32(params.RateControl.TargetPercentage)))
// Parameters are from https://github.com/intel/libva-utils/blob/master/encode/vp9enc.c
e := &encoderVP9{
@@ -123,7 +122,7 @@ func newVP9Encoder(r video.Reader, p prop.Media, params ParamVP9) (io.ReadCloser
seqParam: C.VAEncSequenceParameterBufferVP9{
max_frame_width: 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),
kf_min_dist: 1,
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,
},
data: C.VAEncMiscParameterHRD{
initial_buffer_fullness: C.uint(params.RateControl.BitsPerSecond *
initial_buffer_fullness: C.uint(params.RateControl.bitsPerSecond *
params.RateControl.WindowSize / 2000),
buffer_size: C.uint(params.RateControl.BitsPerSecond *
buffer_size: C.uint(params.RateControl.bitsPerSecond *
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),
min_qp: C.uint(params.RateControl.MinQP),
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),
},
},