📄 x264_gtk.c
字号:
#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include <math.h>#if defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __DragonFly__# include <inttypes.h>#else# include <stdint.h>#endif#ifdef _WIN32# define _WIN32_IE 0x400# include <unistd.h> /* for mkdir */# include <shlobj.h> /* for SHGetSpecialFolderPath */#endif#include "../x264.h"#include <gtk/gtk.h>#include "x264_gtk.h"#include "x264_gtk_i18n.h"#include "x264_gtk_private.h"#include "x264_gtk_enum.h"#include "x264_gtk_bitrate.h"#include "x264_gtk_rc.h"#include "x264_gtk_mb.h"#include "x264_gtk_more.h"#include "x264_gtk_cqm.h"#define CHECK_FLAG(a,flag) ((a) & (flag)) == (flag)#define round(a) ( ((a)<0.0) ? (gint)(floor((a) - 0.5)) : (gint)(floor((a) + 0.5)) )#define X264_MAX(a,b) ( (a)>(b) ? (a) : (b) )#define X264_MIN(a,b) ( (a)<(b) ? (a) : (b) )/* Callbacks */static void _dialog_run (GtkDialog *dialog, gint response, X264_Gui_Config *gconfig, X264_Gtk *x264_gtk);/* x264 config management */static void _default_load (GtkButton *button, gpointer user_data);static void _current_get (X264_Gui_Config *gconfig, X264_Gtk *x264_gtk);static void _current_set (X264_Gui_Config *gconfig, X264_Gtk *x264_gtk);static void _default_set (X264_Gtk *x264_gtk);/* Result must be freed */x264_param_t *x264_gtk_param_get (X264_Gtk *x264_gtk){ x264_param_t *param; if (!x264_gtk) return NULL; param = (x264_param_t *)g_malloc (sizeof (x264_param_t)); if (!param) return NULL; x264_param_default (param); /* rate control */ param->rc.f_ip_factor = 1.0 + (double)x264_gtk->keyframe_boost / 100.0; param->rc.f_pb_factor = 1.0 + (double)x264_gtk->bframes_reduction / 100.0; param->rc.f_qcompress = (double)x264_gtk->bitrate_variability / 100.0; param->rc.i_qp_min = x264_gtk->min_qp; param->rc.i_qp_max = x264_gtk->max_qp; param->rc.i_qp_step = x264_gtk->max_qp_step; param->i_scenecut_threshold = x264_gtk->scene_cut_threshold; param->i_keyint_min = x264_gtk->min_idr_frame_interval; param->i_keyint_max = x264_gtk->max_idr_frame_interval; param->rc.i_vbv_max_bitrate = x264_gtk->vbv_max_bitrate; param->rc.i_vbv_buffer_size = x264_gtk->vbv_buffer_size; param->rc.f_vbv_buffer_init = x264_gtk->vbv_buffer_init; /* mb */ param->analyse.b_transform_8x8 = x264_gtk->transform_8x8; param->analyse.inter = 0; if (x264_gtk->pframe_search_8) param->analyse.inter |= X264_ANALYSE_PSUB16x16; if (x264_gtk->bframe_search_8) param->analyse.inter |= X264_ANALYSE_BSUB16x16; if (x264_gtk->pframe_search_4) param->analyse.inter |= X264_ANALYSE_PSUB8x8; if (x264_gtk->inter_search_8) param->analyse.inter |= X264_ANALYSE_I8x8; if (x264_gtk->inter_search_4) param->analyse.inter |= X264_ANALYSE_I4x4; param->b_bframe_pyramid = x264_gtk->bframe_pyramid && x264_gtk->bframe; param->analyse.b_bidir_me = x264_gtk->bidir_me; param->b_bframe_adaptive = x264_gtk->bframe_adaptive; param->analyse.b_weighted_bipred = x264_gtk->weighted_bipred; param->i_bframe = x264_gtk->bframe; param->i_bframe_bias = x264_gtk->bframe_bias; param->analyse.i_direct_mv_pred = x264_gtk->direct_mode;/* param->b_bframe_pyramid = param->b_bframe_pyramid && (param->i_bframe > 1); */ /* more */ param->analyse.i_subpel_refine = x264_gtk->partition_decision + 1; param->analyse.b_bframe_rdo = x264_gtk->bframe_rdo; param->analyse.i_me_method = x264_gtk->me_method; param->analyse.i_me_range = x264_gtk->range; param->analyse.b_chroma_me = x264_gtk->chroma_me; param->analyse.i_trellis = x264_gtk->trellis; param->analyse.i_noise_reduction = x264_gtk->noise_reduction; param->i_frame_reference = x264_gtk->max_ref_frames; param->analyse.b_mixed_references = x264_gtk->mixed_refs; param->analyse.b_fast_pskip = x264_gtk->fast_pskip; param->analyse.b_dct_decimate = x264_gtk->dct_decimate; /* rdo : RD based mode decision for B-frames. Requires subme 6 */ param->vui.i_sar_width = x264_gtk->sample_ar_x; param->vui.i_sar_height = x264_gtk->sample_ar_y; param->i_threads = x264_gtk->threads; param->b_cabac = x264_gtk->cabac; param->b_deblocking_filter = x264_gtk->deblocking_filter; param->i_deblocking_filter_alphac0 = x264_gtk->strength; param->i_deblocking_filter_beta = x264_gtk->threshold; param->i_log_level = x264_gtk->debug_method - 1; /* cqm */ param->i_cqm_preset = x264_gtk->cqm_preset; if (x264_gtk->cqm_file && (x264_gtk->cqm_file[0] != '\0')) param->psz_cqm_file = x264_gtk->cqm_file; memcpy( param->cqm_4iy, x264_gtk->cqm_4iy, 16 ); memcpy( param->cqm_4ic, x264_gtk->cqm_4ic, 16 ); memcpy( param->cqm_4py, x264_gtk->cqm_4py, 16 ); memcpy( param->cqm_4pc, x264_gtk->cqm_4pc, 16 ); memcpy( param->cqm_8iy, x264_gtk->cqm_8iy, 64 ); memcpy( param->cqm_8py, x264_gtk->cqm_8py, 64 ); /* bitrate */ switch (x264_gtk->pass) { case X264_PASS_SINGLE_BITRATE: param->rc.i_rc_method = X264_RC_ABR; param->rc.i_bitrate = x264_gtk->average_bitrate; break; case X264_PASS_SINGLE_QUANTIZER: param->rc.i_rc_method = X264_RC_CQP; param->rc.i_qp_constant = x264_gtk->quantizer; break; case X264_PASS_MULTIPASS_1ST_FAST: param->analyse.i_subpel_refine = X264_MAX( X264_MIN( 3, param->analyse.i_subpel_refine - 1 ), 1 ); param->i_frame_reference = ( param->i_frame_reference + 1 ) >> 1; param->analyse.inter &= ( ~X264_ANALYSE_PSUB8x8 ); param->analyse.inter &= ( ~X264_ANALYSE_BSUB16x16 ); case X264_PASS_MULTIPASS_1ST: param->rc.i_rc_method = X264_RC_ABR; param->rc.i_bitrate = x264_gtk->average_bitrate; param->rc.f_rate_tolerance = 4.0; break; case X264_PASS_MULTIPASS_NTH: param->rc.i_rc_method = X264_RC_ABR; param->rc.i_bitrate = x264_gtk->average_bitrate; param->rc.f_rate_tolerance = 1.0; break; } param->rc.b_stat_write = x264_gtk->stat_write; param->rc.b_stat_read = x264_gtk->stat_read; /* FIXME: potential mem leak... */ param->rc.psz_stat_out = x264_gtk_path (x264_gtk->statsfile_name); return param;}/* Result must be freed */X264_Gtk *x264_gtk_load (void){ X264_Gtk *x264_gtk; GIOChannel *file; GError *error = NULL; gchar *filename; x264_gtk = (X264_Gtk *)g_malloc0 (sizeof (X264_Gtk)); if (!x264_gtk) return NULL; filename = x264_gtk_path ("x264.cfg"); file = g_io_channel_new_file (filename, "r", &error); if (error) { g_print (_("x264.cfg: %s\n"), error->message); g_print (_("Loading default configuration\n")); _default_set (x264_gtk); } else { GIOStatus status; gchar *data = NULL; gsize length; g_print (_("Loading configuration from %s\n"), filename); g_io_channel_set_encoding (file, NULL, NULL); status = g_io_channel_read_to_end (file, &data, &length, &error); if ((status == G_IO_STATUS_NORMAL) && (length == sizeof (X264_Gtk))) { memcpy (x264_gtk, data, length); } g_io_channel_shutdown (file, TRUE, NULL); g_io_channel_unref (file); } g_free (filename); return x264_gtk;}GtkWidget *x264_gtk_window_create (GtkWidget *parent){ GtkWidget *win_x264_gtk; GtkWidget *notebook; GtkWidget *page; GtkWidget *button; GtkWidget *label; X264_Gui_Config *gconfig; X264_Gtk *x264_gtk; gint result; GtkDialogFlags flags = 0; gconfig = (X264_Gui_Config *)g_malloc (sizeof (X264_Gui_Config)); if (!gconfig) return NULL; x264_gtk = x264_gtk_load (); if (parent) flags = GTK_DIALOG_MODAL |GTK_DIALOG_DESTROY_WITH_PARENT; win_x264_gtk = gtk_dialog_new_with_buttons (_("X264 Configuration"), GTK_WINDOW (parent), flags, NULL); button = gtk_button_new_with_label (_("Default")); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (win_x264_gtk)->action_area), button, FALSE, TRUE, 6); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (_default_load), gconfig); gtk_widget_show (button); gtk_dialog_add_buttons (GTK_DIALOG (win_x264_gtk), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); g_object_set_data (G_OBJECT (win_x264_gtk), "x264-gui-config", gconfig); g_object_set_data (G_OBJECT (win_x264_gtk), "x264-config", x264_gtk); gtk_window_set_resizable (GTK_WINDOW (win_x264_gtk), FALSE); notebook = gtk_notebook_new (); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (win_x264_gtk)->vbox), notebook); gtk_widget_show (notebook); label = gtk_label_new (_("Bitrate")); gtk_widget_show (label); page = _bitrate_page (gconfig); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label); gtk_widget_show (page); label = gtk_label_new (_("Rate Control")); gtk_widget_show (label); page = _rate_control_page (gconfig); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label); gtk_widget_show (page); label = gtk_label_new (_("MB & Frames")); gtk_widget_show (label); page = _mb_page (gconfig); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label); gtk_widget_show (page); label = gtk_label_new (_("More..."));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -