return hb_video_encoder_get_from_name(encoder);
}
+void ghb_set_video_preset(GhbValue *settings, int encoder, const char * preset)
+{
+ const char * const * videoPresets;
+ int ii;
+
+ videoPresets = hb_video_encoder_get_presets(encoder);
+ for (ii = 0; preset && videoPresets && videoPresets[ii]; ii++)
+ {
+ if (!strcasecmp(preset, videoPresets[ii]))
+ {
+ ghb_dict_set_int(settings, "VideoPresetSlider", ii);
+ break;
+ }
+ }
+ if (preset != NULL)
+ {
+ ghb_dict_set_string(settings, "VideoPreset", preset);
+ }
+}
+
G_MODULE_EXPORT void
vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
{
{
gtk_range_set_range(GTK_RANGE(presetSlider), 0, count-1);
}
+ ghb_set_video_preset(ud->settings, encoder, "medium");
+ GhbValue *gval = ghb_dict_get_value(ud->settings, "VideoPresetSlider");
+ ghb_ui_settings_update(ud, ud->settings, "VideoPresetSlider", gval);
// Advanced options are only for x264
if (!(encoder & HB_VCODEC_X264_MASK))
int encavcodecWork( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** );
void encavcodecClose( hb_work_object_t * );
+static void apply_encoder_preset(int vcodec, AVDictionary ** av_opts,
+ const char * preset);
+
hb_work_object_t hb_encavcodec =
{
WORK_ENCAVCODEC,
encavcodecClose
};
+static const char * const vpx_preset_names[] =
+{
+ "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", NULL
+};
+
int encavcodecInit( hb_work_object_t * w, hb_job_t * job )
{
AVCodec * codec;
lavc_opts = hb_encopts_to_dict(job->encoder_options, job->vcodec);
}
- AVDictionary * av_opts = NULL;
if (job->vquality != HB_INVALID_VIDEO_QUALITY)
{
if ( w->codec_param == AV_CODEC_ID_VP8 ||
w->codec_param == AV_CODEC_ID_VP9 )
{
- // Default quality/speed settings
- av_dict_set( &av_opts, "deadline", "good", 0);
- av_dict_set( &av_opts, "cpu-used", "2", 0);
//This value was chosen to make the bitrate high enough
//for libvpx to "turn off" the maximum bitrate feature
//that is normally applied to constant quality.
}
}
+ AVDictionary * av_opts = NULL;
+ apply_encoder_preset(job->vcodec, &av_opts, job->encoder_preset);
+
/* iterate through lavc_opts and have avutil parse the options for us */
hb_dict_iter_t iter;
for (iter = hb_dict_iter_init(lavc_opts);
return final_flushing_call? HB_WORK_DONE : HB_WORK_OK;
}
+static void apply_vpx_preset(AVDictionary ** av_opts, const char * preset)
+{
+ if (!strcasecmp("veryfast", preset))
+ {
+ av_dict_set( av_opts, "deadline", "good", 0);
+ av_dict_set( av_opts, "cpu-used", "5", 0);
+ }
+ else if (!strcasecmp("faster", preset))
+ {
+ av_dict_set( av_opts, "deadline", "good", 0);
+ av_dict_set( av_opts, "cpu-used", "4", 0);
+ }
+ else if (!strcasecmp("fast", preset))
+ {
+ av_dict_set( av_opts, "deadline", "good", 0);
+ av_dict_set( av_opts, "cpu-used", "3", 0);
+ }
+ else if (!strcasecmp("medium", preset))
+ {
+ av_dict_set( av_opts, "deadline", "good", 0);
+ av_dict_set( av_opts, "cpu-used", "2", 0);
+ }
+ else if (!strcasecmp("slow", preset))
+ {
+ av_dict_set( av_opts, "deadline", "good", 0);
+ av_dict_set( av_opts, "cpu-used", "1", 0);
+ }
+ else if (!strcasecmp("slower", preset))
+ {
+ av_dict_set( av_opts, "deadline", "good", 0);
+ av_dict_set( av_opts, "cpu-used", "0", 0);
+ }
+ else if (!strcasecmp("veryslow", preset))
+ {
+ av_dict_set( av_opts, "deadline", "best", 0);
+ av_dict_set( av_opts, "cpu-used", "0", 0);
+ }
+ else
+ {
+ // default "medium"
+ hb_error("apply_vpx_preset: Unknown preset %s, using medium", preset);
+ av_dict_set( av_opts, "deadline", "good", 0);
+ av_dict_set( av_opts, "cpu-used", "2", 0);
+ }
+}
+static void apply_encoder_preset(int vcodec, AVDictionary ** av_opts,
+ const char * preset)
+{
+ switch (vcodec)
+ {
+ case HB_VCODEC_FFMPEG_VP8:
+ case HB_VCODEC_FFMPEG_VP9:
+ apply_vpx_preset(av_opts, preset);
+ break;
+ default:
+ break;
+ }
+}
+
+const char* const* hb_av_preset_get_names(int encoder)
+{
+ switch (encoder)
+ {
+ case HB_VCODEC_FFMPEG_VP8:
+ case HB_VCODEC_FFMPEG_VP9:
+ return vpx_preset_names;
+
+ default:
+ return NULL;
+ }
+}