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

📄 x264_gtk_encode_main_window.c.svn-base

📁 一個影像串流的壓縮方式H264加密方式
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
  if (!in) return;  /* Set defaults */  p_open_infile = open_file_yuv;  p_get_frame_total = get_frame_total_yuv;  p_close_infile = close_file_yuv;  param.i_width = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->width)), NULL));  param.i_height = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->height)), NULL));  param.i_fps_num = 25;  param.i_fps_den = 1;  param.i_frame_total = 0;  switch (res) {  case GTK_RESPONSE_OK:  case GTK_RESPONSE_ACCEPT:  case GTK_RESPONSE_APPLY: {    X264_Gtk_Encode  *encode = (X264_Gtk_Encode *)user_data;    GSList           *filters;    GtkFileFilter    *selected;    int               container;        filters = gtk_file_chooser_list_filters(GTK_FILE_CHOOSER (encode->file_input));    selected = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER (encode->file_input));    container = g_slist_index(filters, selected);    g_slist_free (filters);    if (container == 0)    {      /* All format needed, search for extension */      const char *ext = strrchr(in, '.');      if (!strncasecmp(ext, ".y4m", 4))        encode->container = X264_DEMUXER_Y4M;      else if (!strncasecmp(ext, ".avs", 4))        encode->container = X264_DEMUXER_AVS;      else if (!strncasecmp(ext, ".avi", 4))        encode->container = X264_DEMUXER_AVI;      else if (!strncasecmp(ext, ".cif", 4))        encode->container = X264_DEMUXER_CIF;      else if (!strncasecmp(ext, ".qcif", 4))        encode->container = X264_DEMUXER_QCIF;      else        encode->container = X264_DEMUXER_YUV;    }    else    {      /* The all supproted type is 0 => shift of 1 */      encode->container = (X264_Demuxer_Type)container-1;    }            switch (encode->container) {    case X264_DEMUXER_YUV: /* YUV */      break;    case X264_DEMUXER_CIF: /* YUV CIF */      param.i_width = 352;      param.i_height = 288;      break;    case X264_DEMUXER_QCIF: /* YUV QCIF */      /*   Default input file driver */      param.i_width = 176;      param.i_height = 144;      break;    case X264_DEMUXER_Y4M: /* YUV4MPEG */      /*   Default input file driver */      sensitivity = FALSE;      p_open_infile = open_file_y4m;      p_get_frame_total = get_frame_total_y4m;      p_close_infile = close_file_y4m;      break;#ifdef AVIS_INPUT    case X264_DEMUXER_AVI: /* AVI */    case X264_DEMUXER_AVS: /* AVS */      sensitivity = FALSE;      p_open_infile = open_file_avis;      p_get_frame_total = get_frame_total_avis;      p_close_infile = close_file_avis;    break;#endif    default: /* Unknown */      break;    }    break;  }  default:    break;  }  /* Modify dialog */  gtk_widget_set_sensitive(encode->width, sensitivity);  gtk_widget_set_sensitive(encode->height, sensitivity);  gtk_widget_set_sensitive(encode->fps_num, sensitivity);  gtk_widget_set_sensitive(encode->fps_den, sensitivity);  gtk_widget_set_sensitive(encode->frame_count, sensitivity);  /* Inquire input format */  if (param.i_width < 2) param.i_width = 352;  if (param.i_height < 2) param.i_height = 288;  if (p_open_infile (in, &hin, &param) >= 0) {    param.i_frame_total = p_get_frame_total(hin);    p_close_infile (hin);  } else {    GtkWidget *dialog_message;    dialog_message = gtk_message_dialog_new (GTK_WINDOW (dialog),                                             GTK_DIALOG_DESTROY_WITH_PARENT,                                             GTK_MESSAGE_ERROR,                                             GTK_BUTTONS_CLOSE,                                             strerror(errno));    gtk_dialog_run (GTK_DIALOG (dialog_message));    gtk_widget_destroy (dialog_message);        }  encode->size = _file_size(in);  if (g_snprintf(buffer, BUFFER_LENGTH, "%i", param.i_width) > 0)    gtk_entry_set_text (GTK_ENTRY (encode->width), buffer);  if (g_snprintf(buffer, BUFFER_LENGTH, "%i", param.i_height) > 0)    gtk_entry_set_text (GTK_ENTRY (encode->height), buffer);  if (g_snprintf(buffer, BUFFER_LENGTH, "%i", param.i_fps_num) > 0)    gtk_entry_set_text (GTK_ENTRY (encode->fps_num), buffer);  if (g_snprintf(buffer, BUFFER_LENGTH, "%i", param.i_fps_den) > 0)    gtk_entry_set_text (GTK_ENTRY (encode->fps_den), buffer);  if (g_snprintf(buffer, BUFFER_LENGTH, "%i", param.i_frame_total) > 0)    gtk_entry_set_text (GTK_ENTRY (encode->frame_count), buffer);}static void_dimension_entry_cb (GtkEditable *editable,                     gpointer     user_data){  X264_Gtk_Encode *encode = (X264_Gtk_Encode *)user_data;  char             buffer[32];  gint             width;  gint             height;  gint             frame_size;  width = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->width)), NULL));  height = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->height)), NULL));  frame_size = (3*width*height)/2;  if (frame_size > 0 && encode->container <= X264_DEMUXER_QCIF)  {    snprintf(buffer, 32, "%lu", (long unsigned int)((encode->size+frame_size/2)/frame_size));    gtk_entry_set_text (GTK_ENTRY (encode->frame_count), buffer);  }}static void_configure_window_cb (GtkButton *button __UNUSED__,                      gpointer   user_data){  GtkWidget *window;    window = x264_gtk_window_create (GTK_WIDGET (user_data));  x264_gtk_shutdown (window);}static void_response_window_cb (GtkDialog *dialog,                     gint       res,                     gpointer   user_data){  switch (res) {  case GTK_RESPONSE_APPLY: {    x264_param_t     *param;    X264_Gtk         *x264_gtk;    X264_Gtk_Encode  *encode;    X264_Thread_Data *thread_data;    GtkWidget        *win_status;    GThread          *thread;    const gchar      *file_input = NULL;    const gchar      *path_output = NULL;    const gchar      *filename_output = NULL;    gchar            *file_output = NULL;    gchar            *ext;    gint              fds[2];    gint              out_container;    encode = (X264_Gtk_Encode *)user_data;    file_input = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (encode->file_input));    path_output = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (encode->path_output));    filename_output = gtk_entry_get_text (GTK_ENTRY (encode->file_output));    if (!file_input ||         (file_input[0] == '\0')) {      GtkWidget *dialog_message;      dialog_message = gtk_message_dialog_new (GTK_WINDOW (dialog),                                               GTK_DIALOG_DESTROY_WITH_PARENT,                                               GTK_MESSAGE_ERROR,                                               GTK_BUTTONS_CLOSE,                                               "Error: input file name is not set");      gtk_dialog_run (GTK_DIALOG (dialog_message));      gtk_widget_destroy (dialog_message);      break;    }    if (!filename_output ||         (filename_output[0] == '\0')) {      GtkWidget *dialog_message;      dialog_message = gtk_message_dialog_new (GTK_WINDOW (dialog),                                       GTK_DIALOG_DESTROY_WITH_PARENT,                                       GTK_MESSAGE_ERROR,                                       GTK_BUTTONS_CLOSE,                                               "Error: output file name is not set");      gtk_dialog_run (GTK_DIALOG (dialog_message));      gtk_widget_destroy (dialog_message);      break;    }    out_container = gtk_combo_box_get_active (GTK_COMBO_BOX (encode->combo));    switch (out_container) {    case 1:      ext = ".mkv";      break;#ifdef MP4_OUTPUT    case 2:      ext = ".mp4";      break;#endif    case 0:    default:      ext = ".264";    }    file_output = g_strconcat (path_output, "/", filename_output, ext, NULL);    g_print ("file output : %s\n", file_output);    x264_gtk = x264_gtk_load ();    param = x264_gtk_param_get (x264_gtk);    g_free (x264_gtk);    {      gint width;      gint height;      gint fps_num;      gint fps_den;      gint frame_count;      width = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->width)), NULL));      height = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->height)), NULL));      fps_num = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->fps_num)), NULL));      fps_den = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->fps_den)), NULL));      frame_count = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->frame_count)), NULL));      if ((width <= 0) ||          (height <= 0) ||          (fps_num <= 0) ||          (fps_den <= 0) ||          (frame_count < 0))        break;      param->i_width = width;      param->i_height = height;      param->i_fps_num = fps_num;      param->i_fps_den = fps_den;      param->i_frame_total = frame_count;    }    if (pipe (fds) == -1)      break;    thread_data = (X264_Thread_Data *)g_malloc0 (sizeof (X264_Thread_Data));    thread_data->param = param;    thread_data->file_input = g_strdup (file_input);    thread_data->file_output = g_strdup (file_output);    thread_data->in_container = encode->container;    thread_data->out_container = out_container;    g_free (file_output);    thread_data->io_read = g_io_channel_unix_new (fds[0]);    g_io_channel_set_encoding (thread_data->io_read, NULL, NULL);    thread_data->io_write = g_io_channel_unix_new (fds[1]);    g_io_channel_set_encoding (thread_data->io_write, NULL, NULL);    g_io_add_watch (thread_data->io_read, G_IO_IN,                    (GIOFunc)_fill_status_window, thread_data);    win_status = x264_gtk_encode_status_window (thread_data);    gtk_window_set_transient_for (GTK_WINDOW (win_status), GTK_WINDOW (dialog));    gtk_window_set_modal (GTK_WINDOW (win_status), TRUE);    gtk_widget_show (win_status);    //gtk_widget_hide(thread_data->end_button);    thread = g_thread_create ((GThreadFunc)x264_gtk_encode_encode, thread_data, FALSE, NULL);    break;  }  case GTK_RESPONSE_CLOSE:  default:    gtk_main_quit ();    _encode_shutdown ((X264_Gtk_Encode *)user_data);  }}static gboolean_fill_status_window (GIOChannel  *io __UNUSED__,                     GIOCondition condition __UNUSED__,                     gpointer     user_data){  gchar             str[128];  X264_Thread_Data *thread_data;  X264_Pipe_Data    pipe_data;  GIOStatus         status;  gsize             size;  gint              eta;  gdouble           progress;  gdouble           fps;  thread_data = (X264_Thread_Data *)user_data;  status = g_io_channel_read_chars (thread_data->io_read,                                    (gchar *)&pipe_data,                                    sizeof (X264_Pipe_Data),                                    &size, NULL);  if (status != G_IO_STATUS_NORMAL) {    g_print ("Error ! %d %d %d\n", status, sizeof (X264_Pipe_Data), size);    return FALSE;  }  snprintf (str, 128, "%d/%d", pipe_data.frame, pipe_data.frame_total);  gtk_entry_set_text (GTK_ENTRY (thread_data->current_video_frame),                      str);  snprintf (str, 128, "%dKB",            pipe_data.file >> 10);  gtk_entry_set_text (GTK_ENTRY (thread_data->video_data),                      str);  fps = pipe_data.elapsed > 0 ? 1000000.0 * (gdouble)pipe_data.frame / (gdouble)pipe_data.elapsed : 0.0;  snprintf (str, 128, "%.2fKB/s (%.2f fps)",            (double) pipe_data.file * 8 * thread_data->param->i_fps_num /            ((double) thread_data->param->i_fps_den * pipe_data.frame * 1000),            fps);  gtk_entry_set_text (GTK_ENTRY (thread_data->video_rendering_rate),                      str);  snprintf (str, 128, "%lld:%02lld:%02lld",            (pipe_data.elapsed / 1000000) / 3600,            ((pipe_data.elapsed / 1000000) / 60) % 60,            (pipe_data.elapsed / 1000000) % 60);  gtk_entry_set_text (GTK_ENTRY (thread_data->time_elapsed),                      str);  eta = pipe_data.elapsed * (pipe_data.frame_total - pipe_data.frame) / ((int64_t)pipe_data.frame * 1000000);  snprintf (str, 128, "%d:%02d:%02d", eta / 3600, (eta / 60) % 60, eta % 60);  gtk_entry_set_text (GTK_ENTRY (thread_data->time_remaining),                      str);  progress = (gdouble)pipe_data.frame / (gdouble)pipe_data.frame_total;  gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (thread_data->progress),                                 progress);  snprintf (str, 128, "%0.1f%%", 100.0 * progress);  gtk_progress_bar_set_text (GTK_PROGRESS_BAR (thread_data->progress), str);  return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -