⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x264_gtk.c

📁 linux下编译已经通过
💻 C
📖 第 1 页 / 共 4 页
字号:
#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 + -