int level;
int qmin;
int qmax;
+ int super_frame;
} tvh_codec_profile_vaapi_t;
#if defined(__linux__)
.type = PT_BOOL,
.id = "low_power", // Don't change
.name = N_("Low Power"),
- .desc = N_("Set low power mode.[if disabled will not send paramter to libav]"),
+ .desc = N_("Set low power mode.[if disabled will not send parameter to libav, if enabled codec will disable B frames]"),
.group = 3,
.opts = PO_EXPERT,
.get_opts = codec_profile_class_get_opts,
.type = PT_INT,
.id = "desired_b_depth", // Don't change
.name = N_("Maximum B-frame"),
- .desc = N_("Maximum B-frame reference depth (from 1 to 4) (default 1)"),
+ .desc = N_("Maximum B-frame reference depth (from 1 to 3) (default 1)"),
.group = 3,
.get_opts = codec_profile_class_get_opts,
.off = offsetof(tvh_codec_profile_vaapi_t, desired_b_depth),
- .intextra = INTEXTRA_RANGE(0, 4, 1),
+ .intextra = INTEXTRA_RANGE(0, 3, 1),
.def.i = 1,
},
{
int int_bitrate = (int)((double)(self->bit_rate) * 1024.0 * (1.0 + (self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480.0)));
int int_buffer_size = (int)((double)(self->bit_rate) * 2048.0 * self->buff_factor * (1.0 + self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480));
int int_max_bitrate = (int)((double)(self->max_bit_rate) * 1024.0 * (1.0 + (self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480.0)));
- tvherror(LS_VAAPI, "Bitrate = %d bps; Buffer size = %d bps; Max bitrate = %d bps", int_bitrate, int_buffer_size, int_max_bitrate);
+ tvhinfo(LS_VAAPI, "Bitrate = %d kbps; Buffer size = %d kbps; Max bitrate = %d kbps", int_bitrate / 1024, int_buffer_size / 1024, int_max_bitrate / 1024);
// https://wiki.libav.org/Hardware/vaapi
// https://blog.wmspanel.com/2017/03/vaapi-libva-support-nimble-streamer.html
// to find available parameters use:
case 0:
// Uncontrained --> will allow any combination of parameters (valid or invalid)
// this mode is usefull fur future platform and for debugging.
- if (self->desired_b_depth) {
+ if ((self->low_power == 0) && (self->desired_b_depth)) {
AV_DICT_SET_INT(opts, "b_depth", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ // max_b_frames
+ AV_DICT_SET_INT(opts, "bf", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
}
if (self->bit_rate) {
AV_DICT_SET_INT(opts, "b", int_bitrate, AV_DICT_DONT_OVERWRITE);
break;
case 1:
// Intel
- if (self->desired_b_depth) {
+ if ((self->low_power == 0) && (self->desired_b_depth)) {
AV_DICT_SET_INT(opts, "b_depth", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ // max_b_frames
+ AV_DICT_SET_INT(opts, "bf", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
}
switch (self->rc_mode) {
case -1:
int int_bitrate = (int)((double)(self->bit_rate) * 1024.0 * (1.0 + (self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480.0)));
int int_buffer_size = (int)((double)(self->bit_rate) * 2048.0 * self->buff_factor * (1.0 + self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480));
int int_max_bitrate = (int)((double)(self->max_bit_rate) * 1024.0 * (1.0 + (self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480.0)));
- tvherror(LS_VAAPI, "Bitrate = %d bps; Buffer size = %d bps; Max bitrate = %d bps", int_bitrate, int_buffer_size, int_max_bitrate);
+ tvhinfo(LS_VAAPI, "Bitrate = %d kbps; Buffer size = %d kbps; Max bitrate = %d kbps", int_bitrate / 1024, int_buffer_size / 1024, int_max_bitrate / 1024);
// https://wiki.libav.org/Hardware/vaapi
// to find available parameters use:
// ffmpeg -hide_banner -h encoder=hevc_vaapi
case 0:
// Unconstrained --> will allow any combination of parameters (valid or invalid)
// this mode is usefull fur future platform and for debugging.
- if (self->desired_b_depth) {
+ if ((self->low_power == 0) && (self->desired_b_depth)) {
AV_DICT_SET_INT(opts, "b_depth", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ // max_b_frames
+ AV_DICT_SET_INT(opts, "bf", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
}
if (self->bit_rate) {
AV_DICT_SET_INT(opts, "b", int_bitrate, AV_DICT_DONT_OVERWRITE);
break;
case 1:
// Intel
- if (self->desired_b_depth) {
+ if ((self->low_power == 0) && (self->desired_b_depth)) {
AV_DICT_SET_INT(opts, "b_depth", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ // max_b_frames
+ AV_DICT_SET_INT(opts, "bf", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
}
switch (self->rc_mode) {
case -1:
int int_bitrate = (int)((double)(self->bit_rate) * 1024.0 * (1.0 + (self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480.0)));
int int_buffer_size = (int)((double)(self->bit_rate) * 2048.0 * self->buff_factor * (1.0 + self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480));
int int_max_bitrate = (int)((double)(self->max_bit_rate) * 1024.0 * (1.0 + (self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480.0)));
- tvherror(LS_VAAPI, "Bitrate = %d bps; Buffer size = %d bps; Max bitrate = %d bps", int_bitrate, int_buffer_size, int_max_bitrate);
+ tvhinfo(LS_VAAPI, "Bitrate = %d kbps; Buffer size = %d kbps; Max bitrate = %d kbps", int_bitrate / 1024, int_buffer_size / 1024, int_max_bitrate / 1024);
// https://wiki.libav.org/Hardware/vaapi
// to find available parameters use:
// ffmpeg -hide_banner -h encoder=vp8_vaapi
case 0:
// Unconstrained --> will allow any combination of parameters (valid or invalid)
// this mode is usefull fur future platform and for debugging.
- if (self->desired_b_depth) {
+ if ((self->low_power == 0) && (self->desired_b_depth)) {
AV_DICT_SET_INT(opts, "b_depth", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ // max_b_frames
+ AV_DICT_SET_INT(opts, "bf", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
}
if (self->bit_rate) {
AV_DICT_SET_INT(opts, "b", int_bitrate, AV_DICT_DONT_OVERWRITE);
break;
case 1:
// Intel
- if (self->desired_b_depth) {
+ if ((self->low_power == 0) && (self->desired_b_depth)) {
AV_DICT_SET_INT(opts, "b_depth", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ // max_b_frames
+ AV_DICT_SET_INT(opts, "bf", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
}
if (self->quality >= 0) {
AV_DICT_SET_INT(opts, "global_quality", self->quality, AV_DICT_DONT_OVERWRITE);
int int_bitrate = (int)((double)(self->bit_rate) * 1024.0 * (1.0 + (self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480.0)));
int int_buffer_size = (int)((double)(self->bit_rate) * 2048.0 * self->buff_factor * (1.0 + self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480));
int int_max_bitrate = (int)((double)(self->max_bit_rate) * 1024.0 * (1.0 + (self->bit_rate_scale_factor * ((double)(self->size.den) - 480.0) / 480.0)));
- tvherror(LS_VAAPI, "Bitrate = %d bps; Buffer size = %d bps; Max bitrate = %d bps", int_bitrate, int_buffer_size, int_max_bitrate);
+ tvhinfo(LS_VAAPI, "Bitrate = %d kbps; Buffer size = %d kbps; Max bitrate = %d kbps", int_bitrate / 1024, int_buffer_size / 1024, int_max_bitrate / 1024);
// https://wiki.libav.org/Hardware/vaapi
// to find available parameters use:
// ffmpeg -hide_banner -h encoder=vp9_vaapi
case 0:
// Unconstrained --> will allow any combination of parameters (valid or invalid)
// this mode is usefull fur future platform and for debugging.
- if (self->desired_b_depth) {
+ if ((self->low_power == 0) && (self->desired_b_depth)) {
AV_DICT_SET_INT(opts, "b_depth", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ // max_b_frames
+ AV_DICT_SET_INT(opts, "bf", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ }
+ if (self->super_frame) {
// according to example from https://trac.ffmpeg.org/wiki/Hardware/VAAPI
// -bsf:v vp9_raw_reorder,vp9_superframe
AV_DICT_SET(opts, "bsf", "vp9_raw_reorder,vp9_superframe", AV_DICT_DONT_OVERWRITE);
break;
case 1:
// Intel
- if (self->desired_b_depth) {
+ if ((self->low_power == 0) && (self->desired_b_depth)) {
AV_DICT_SET_INT(opts, "b_depth", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ // max_b_frames
+ AV_DICT_SET_INT(opts, "bf", self->desired_b_depth, AV_DICT_DONT_OVERWRITE);
+ }
+ if (self->super_frame) {
// according to example from https://trac.ffmpeg.org/wiki/Hardware/VAAPI
// -bsf:v vp9_raw_reorder,vp9_superframe
AV_DICT_SET(opts, "bsf", "vp9_raw_reorder,vp9_superframe", AV_DICT_DONT_OVERWRITE);
.intextra = INTEXTRA_RANGE(-1, 15, 1),
.def.i = 4,
},
+ {
+ .type = PT_BOOL,
+ .id = "super_frame", // Don't change
+ .name = N_("Super Frame"),
+ .desc = N_("Enable Super Frame for vp9 encoder.[default disabled]"),
+ .group = 5,
+ .opts = PO_EXPERT,
+ .get_opts = codec_profile_class_get_opts,
+ .off = offsetof(tvh_codec_profile_vaapi_t, super_frame),
+ .def.i = 0,
+ },
{}
}
},
var bit_rate_scale_factor_field = form.findField('bit_rate_scale_factor');
var qp_field = form.findField('qp');
var low_power_field = form.findField('low_power');
+ var desired_b_depth_field = form.findField('desired_b_depth');
var platform = platform_field.getValue();
switch (platform) {
bit_rate_scale_factor_field.setDisabled(false);
qp_field.setDisabled(false);
low_power_field.setDisabled(false);
+ desired_b_depth_field.setDisabled(false);
break;
case 1:
// Intel
+ // low_power is disabling Max B frame
+ desired_b_depth_field.setDisabled(low_power_field.getValue());
var rc_mode = rc_mode_field.getValue();
switch (rc_mode) {
case -1:
// AMD --> will allow any combination of parameters
// I am unable to confirm this platform because I don't have the HW
// Is only going to override bf to 0 (as highlited by the previous implementation)
+ // NOTE: filters to be added later
bit_rate_field.setDisabled(false);
max_bit_rate_field.setDisabled(false);
buff_factor_field.setDisabled(false);
bit_rate_scale_factor_field.setDisabled(false);
qp_field.setDisabled(false);
+ low_power_field.setDisabled(false);
+ desired_b_depth_field.setDisabled(false);
break;
default:
}
var platform_field = form.findField('platform');
var rc_mode_field = form.findField('rc_mode');
+ var low_power_field = form.findField('low_power');
// first time we have to call this manually
updateFilters(form);
// on platform change
- platform_field.on('select', function(spinner) {
+ platform_field.on('select', function(combo, record, index) {
updateFilters(form);
});
// on rc_mode change
- rc_mode_field.on('select', function(spinner) {
+ rc_mode_field.on('select', function(combo, record, index) {
+ updateFilters(form);
+ });
+ // on low_power change
+ low_power_field.on('check', function(checkbox, value) {
updateFilters(form);
});
},
var bit_rate_scale_factor_field = form.findField('bit_rate_scale_factor');
var qp_field = form.findField('qp');
var low_power_field = form.findField('low_power');
+ var desired_b_depth_field = form.findField('desired_b_depth');
var platform = platform_field.getValue();
switch (platform) {
bit_rate_scale_factor_field.setDisabled(false);
qp_field.setDisabled(false);
low_power_field.setDisabled(false);
+ desired_b_depth_field.setDisabled(false);
break;
case 1:
// Intel
+ // low_power is disabling Max B frame
+ desired_b_depth_field.setDisabled(low_power_field.getValue());
var rc_mode = rc_mode_field.getValue();
switch (rc_mode) {
case -1:
// AMD --> will allow any combination of parameters
// I am unable to confirm this platform because I don't have the HW
// Is only going to override bf to 0 (as highlited by the previous implementation)
+ // NOTE: filters to be added later
bit_rate_field.setDisabled(false);
max_bit_rate_field.setDisabled(false);
buff_factor_field.setDisabled(false);
bit_rate_scale_factor_field.setDisabled(false);
qp_field.setDisabled(false);
+ low_power_field.setDisabled(false);
+ desired_b_depth_field.setDisabled(false);
break;
default:
}
var platform_field = form.findField('platform');
var rc_mode_field = form.findField('rc_mode');
+ var low_power_field = form.findField('low_power');
// first time we have to call this manually
updateFilters(form);
// on platform change
- platform_field.on('select', function(spinner) {
+ platform_field.on('select', function(combo, record, index) {
updateFilters(form);
});
// on rc_mode change
- rc_mode_field.on('select', function(spinner) {
+ rc_mode_field.on('select', function(combo, record, index) {
+ updateFilters(form);
+ });
+ // on low_power change
+ low_power_field.on('check', function(checkbox, value) {
updateFilters(form);
});
},
// AMD --> will allow any combination of parameters
// I am unable to confirm this platform because I don't have the HW
// Is only going to override bf to 0 (as highlited by the previous implementation)
+ // NOTE: filters to be added later
bit_rate_field.setDisabled(false);
max_bit_rate_field.setDisabled(false);
buff_factor_field.setDisabled(false);
updateFilters(form);
// on platform change
- platform_field.on('select', function(spinner) {
+ platform_field.on('select', function(combo, record, index) {
updateFilters(form);
});
// on rc_mode change
- rc_mode_field.on('select', function(spinner) {
+ rc_mode_field.on('select', function(combo, record, index) {
updateFilters(form);
});
},
// AMD --> will allow any combination of parameters
// I am unable to confirm this platform because I don't have the HW
// Is only going to override bf to 0 (as highlited by the previous implementation)
+ // NOTE: filters to be added later
bit_rate_field.setDisabled(false);
max_bit_rate_field.setDisabled(false);
buff_factor_field.setDisabled(false);
updateFilters(form);
// on platform change
- platform_field.on('select', function(spinner) {
+ platform_field.on('select', function(combo, record, index) {
updateFilters(form);
});
// on rc_mode change
- rc_mode_field.on('select', function(spinner) {
+ rc_mode_field.on('select', function(combo, record, index) {
updateFilters(form);
});
}