📄 x264_gtk.c
字号:
gtk_widget_show (label); page = _more_page (gconfig); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label); gtk_widget_show (page); label = gtk_label_new (_("Quantization matrices")); gtk_widget_show (label); page = _cqm_page (gconfig); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label); gtk_widget_show (page); _current_set (gconfig, x264_gtk); result = gtk_dialog_run (GTK_DIALOG (win_x264_gtk)); _dialog_run (GTK_DIALOG (win_x264_gtk), result, gconfig, x264_gtk); return win_x264_gtk;}voidx264_gtk_shutdown (GtkWidget *dialog){ X264_Gui_Config *gconfig; gconfig = g_object_get_data (G_OBJECT (dialog), "x264-gui-config"); gtk_widget_destroy (dialog); if (gconfig) g_free (gconfig);}voidx264_gtk_free (X264_Gtk *x264_gtk){ if (!x264_gtk) return; g_free (x264_gtk);}/* Notebook pages *//* Callbacks */static void_dialog_run (GtkDialog *dialog __UNUSED__, gint response, X264_Gui_Config *gconfig, X264_Gtk *x264_gtk){ if (response == GTK_RESPONSE_OK) { GIOChannel *file; gchar *filename; gchar *dir; gsize length; gint res;#ifndef _WIN32 mode_t mode;#endif dir = x264_gtk_path (NULL);#ifdef _WIN32 res = mkdir (dir);#else mode = S_IRUSR | S_IXUSR | S_IWUSR | S_IRGRP | S_IXGRP | S_IWGRP | S_IROTH | S_IXOTH | S_IWOTH; res = mkdir (dir, mode);#endif /* _WIN32 */ if (res != 0 && errno != EEXIST) { g_free (dir); return; } filename = x264_gtk_path ("x264.cfg"); g_print (_("Writing configuration to %s\n"), filename); file = g_io_channel_new_file (filename, "w+", NULL); if (file) { _current_get (gconfig, x264_gtk); g_io_channel_set_encoding (file, NULL, NULL); g_io_channel_write_chars (file, (const gchar *)x264_gtk, sizeof (X264_Gtk), &length, NULL); g_io_channel_unref (file); } g_free (filename); g_free (dir); }}/* x264 config management */static void_default_load (GtkButton *button __UNUSED__, gpointer user_data){ gchar buf[64]; X264_Gui_Config *config; x264_param_t param; gint i; if (!user_data) return; config = (X264_Gui_Config *)user_data; x264_param_default (¶m); /* bitrate */ gtk_combo_box_set_active (GTK_COMBO_BOX (config->bitrate.pass), 1); g_snprintf (buf, 64, "%d", param.rc.i_bitrate); gtk_entry_set_text (GTK_ENTRY (config->bitrate.w_average_bitrate), buf); gtk_entry_set_text (GTK_ENTRY (config->bitrate.w_target_bitrate), buf); gtk_range_set_range (GTK_RANGE (config->bitrate.w_quantizer), 0.0, 51.0); gtk_range_set_value (GTK_RANGE (config->bitrate.w_quantizer), (gdouble)param.rc.i_qp_constant); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->bitrate.update_statfile), FALSE); gtk_entry_set_text (GTK_ENTRY (config->bitrate.statsfile_name), "x264.stats"); gtk_widget_set_sensitive (config->bitrate.statsfile_name, FALSE); gtk_widget_set_sensitive (config->bitrate.update_statfile, FALSE); /* rate control */ g_snprintf (buf, 64, "%d", round((param.rc.f_ip_factor - 1.0) * 100)); gtk_entry_set_text (GTK_ENTRY (config->rate_control.bitrate.keyframe_boost), buf); g_snprintf (buf, 64, "%d", round((param.rc.f_pb_factor - 1.0) * 100)); gtk_entry_set_text (GTK_ENTRY (config->rate_control.bitrate.bframes_reduction), buf); g_snprintf (buf, 64, "%d", (gint)(param.rc.f_qcompress * 100)); gtk_entry_set_text (GTK_ENTRY (config->rate_control.bitrate.bitrate_variability), buf); g_snprintf (buf, 64, "%d", param.rc.i_qp_min); gtk_entry_set_text (GTK_ENTRY (config->rate_control.quantization_limits.min_qp), buf); g_snprintf (buf, 64, "%d", param.rc.i_qp_max); gtk_entry_set_text (GTK_ENTRY (config->rate_control.quantization_limits.max_qp), buf); g_snprintf (buf, 64, "%d", param.rc.i_qp_step); gtk_entry_set_text (GTK_ENTRY (config->rate_control.quantization_limits.max_qp_step), buf); g_snprintf (buf, 64, "%d", param.i_scenecut_threshold); gtk_entry_set_text (GTK_ENTRY (config->rate_control.scene_cuts.scene_cut_threshold), buf); g_snprintf (buf, 64, "%d", param.i_keyint_min); gtk_entry_set_text (GTK_ENTRY (config->rate_control.scene_cuts.min_idr_frame_interval), buf); g_snprintf (buf, 64, "%d", param.i_keyint_max); gtk_entry_set_text (GTK_ENTRY (config->rate_control.scene_cuts.max_idr_frame_interval), buf); g_snprintf (buf, 64, "%d", param.rc.i_vbv_max_bitrate); gtk_entry_set_text (GTK_ENTRY (config->rate_control.vbv.vbv_max_bitrate), buf); g_snprintf (buf, 64, "%d", param.rc.i_vbv_buffer_size); gtk_entry_set_text (GTK_ENTRY (config->rate_control.vbv.vbv_buffer_size), buf); g_snprintf (buf, 64, "%.1f", param.rc.f_vbv_buffer_init); gtk_entry_set_text (GTK_ENTRY (config->rate_control.vbv.vbv_buffer_init), buf); /* mb */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.partitions.transform_8x8), param.analyse.b_transform_8x8); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.partitions.pframe_search_8), CHECK_FLAG(param.analyse.inter, X264_ANALYSE_PSUB16x16)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.partitions.bframe_search_8), CHECK_FLAG(param.analyse.inter, X264_ANALYSE_BSUB16x16)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.partitions.pframe_search_4), CHECK_FLAG(param.analyse.inter, X264_ANALYSE_PSUB8x8)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.partitions.inter_search_8), CHECK_FLAG(param.analyse.inter, X264_ANALYSE_I8x8)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.partitions.inter_search_4), CHECK_FLAG(param.analyse.inter, X264_ANALYSE_I4x4)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.bframes.bframe_pyramid), param.b_bframe_pyramid); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.bframes.bidir_me), param.analyse.b_bidir_me); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.bframes.bframe_adaptive), param.b_bframe_adaptive); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.bframes.weighted_bipred), param.analyse.b_weighted_bipred); g_snprintf (buf, 64, "%d", param.i_bframe); gtk_entry_set_text (GTK_ENTRY (config->mb.bframes.bframe), buf); gtk_range_set_value (GTK_RANGE (config->mb.bframes.bframe_bias), (gdouble)param.i_bframe_bias); gtk_combo_box_set_active (GTK_COMBO_BOX (config->mb.bframes.direct_mode), param.analyse.i_direct_mv_pred); /* more */ if (param.analyse.b_bframe_rdo) gtk_combo_box_set_active (GTK_COMBO_BOX (config->more.motion_estimation.partition_decision), X264_PD_6b); else gtk_combo_box_set_active (GTK_COMBO_BOX (config->more.motion_estimation.partition_decision), param.analyse.i_subpel_refine - 1); gtk_combo_box_set_active (GTK_COMBO_BOX (config->more.motion_estimation.method), param.analyse.i_me_method); g_snprintf (buf, 64, "%d", param.analyse.i_me_range); gtk_entry_set_text (GTK_ENTRY (config->more.motion_estimation.range), buf); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->more.motion_estimation.chroma_me), param.analyse.b_chroma_me); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->more.motion_estimation.mixed_refs), param.analyse.b_mixed_references); g_snprintf (buf, 64, "%d", param.i_frame_reference); gtk_entry_set_text (GTK_ENTRY (config->more.motion_estimation.max_ref_frames), buf); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->more.motion_estimation.fast_pskip), param.analyse.b_fast_pskip); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->more.motion_estimation.dct_decimate), param.analyse.b_dct_decimate); g_snprintf (buf, 64, "%d", param.vui.i_sar_width); gtk_entry_set_text (GTK_ENTRY (config->more.misc.sample_ar_x), buf); g_snprintf (buf, 64, "%d", param.vui.i_sar_height); gtk_entry_set_text (GTK_ENTRY (config->more.misc.sample_ar_y), buf); gtk_spin_button_set_value (GTK_SPIN_BUTTON (config->more.misc.threads), param.i_threads); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->more.misc.cabac), param.b_cabac); gtk_combo_box_set_active (GTK_COMBO_BOX (config->more.misc.trellis), param.analyse.i_trellis); g_snprintf (buf, 64, "%d", param.analyse.i_noise_reduction); gtk_entry_set_text (GTK_ENTRY (config->more.misc.noise_reduction), buf); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->more.misc.df.deblocking_filter), param.b_deblocking_filter); gtk_range_set_value (GTK_RANGE (config->more.misc.df.strength), (gdouble)param.i_deblocking_filter_alphac0); gtk_range_set_value (GTK_RANGE (config->more.misc.df.threshold), (gdouble)param.i_deblocking_filter_beta); gtk_combo_box_set_active (GTK_COMBO_BOX (config->more.debug.log_level), param.i_log_level + 1); gtk_entry_set_text (GTK_ENTRY (config->more.debug.fourcc), "H264"); /* cqm */ switch (param.i_cqm_preset) { case X264_CQM_FLAT: // workaround: gtk fails to update the matrix entries if we activate the button // that was already active. gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->cqm.radio_jvt), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->cqm.radio_flat), TRUE); break; case X264_CQM_JVT: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->cqm.radio_jvt), TRUE); break; case X264_CQM_CUSTOM: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->cqm.radio_custom), TRUE); break; } if (param.psz_cqm_file && (param.psz_cqm_file[0] != '\0')) gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (config->cqm.cqm_file), param.psz_cqm_file); for (i = 0; i < 16; i++) { gchar buf[4]; g_snprintf (buf, 4, "%d", param.cqm_4iy[i]); gtk_entry_set_text (GTK_ENTRY (config->cqm.cqm_4iy[i]), buf); g_snprintf (buf, 4, "%d", param.cqm_4ic[i]); gtk_entry_set_text (GTK_ENTRY (config->cqm.cqm_4ic[i]), buf); g_snprintf (buf, 4, "%d", param.cqm_4py[i]); gtk_entry_set_text (GTK_ENTRY (config->cqm.cqm_4py[i]), buf); g_snprintf (buf, 4, "%d", param.cqm_4pc[i]); gtk_entry_set_text (GTK_ENTRY (config->cqm.cqm_4pc[i]), buf); } for (i = 0; i < 64; i++) { gchar buf[4]; g_snprintf (buf, 4, "%d", param.cqm_8iy[i]); gtk_entry_set_text (GTK_ENTRY (config->cqm.cqm_8iy[i]), buf); g_snprintf (buf, 4, "%d", param.cqm_8py[i]); gtk_entry_set_text (GTK_ENTRY (config->cqm.cqm_8py[i]), buf); }}static void_default_set (X264_Gtk *x264_gtk){ x264_param_t param; x264_param_default (¶m); /* bitrate */ x264_gtk->pass = X264_PASS_SINGLE_QUANTIZER; x264_gtk->average_bitrate = param.rc.i_bitrate; x264_gtk->target_bitrate = param.rc.i_bitrate; x264_gtk->quantizer = param.rc.i_qp_constant; x264_gtk->stat_write = param.rc.b_stat_write; x264_gtk->stat_read = param.rc.b_stat_read; x264_gtk->update_statfile = 0; x264_gtk->statsfile_length = strlen (param.rc.psz_stat_out); memcpy (x264_gtk->statsfile_name, param.rc.psz_stat_out, x264_gtk->statsfile_length + 1); /* rate control */ x264_gtk->keyframe_boost = round((param.rc.f_ip_factor - 1.0) * 100); x264_gtk->bframes_reduction = round((param.rc.f_pb_factor - 1.0) * 100); x264_gtk->bitrate_variability = round(param.rc.f_qcompress * 100); x264_gtk->min_qp = param.rc.i_qp_min; x264_gtk->max_qp = param.rc.i_qp_max; x264_gtk->max_qp_step = param.rc.i_qp_step; x264_gtk->scene_cut_threshold = param.i_scenecut_threshold; x264_gtk->min_idr_frame_interval = param.i_keyint_min; x264_gtk->max_idr_frame_interval = param.i_keyint_max; x264_gtk->vbv_max_bitrate = param.rc.i_vbv_max_bitrate; x264_gtk->vbv_buffer_size = param.rc.i_vbv_buffer_size; x264_gtk->vbv_buffer_init = param.rc.f_vbv_buffer_init; /* mb */ x264_gtk->transform_8x8 = param.analyse.b_transform_8x8; if (CHECK_FLAG(param.analyse.inter, X264_ANALYSE_PSUB16x16)) x264_gtk->pframe_search_8 = 1; else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -