📄 x264_gtk_encode_main_window.c
字号:
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, ¶m) >= 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); { GIOChannel *file; file = g_io_channel_new_file (file_output, "r", NULL); if (file) { GtkWidget *dialog_overwrite; GtkWidget *eb; GtkWidget *label; const gchar *label_text = NULL; gint res; dialog_overwrite = gtk_dialog_new_with_buttons (_("Existing file"), GTK_WINDOW (dialog), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_YES, GTK_RESPONSE_ACCEPT, GTK_STOCK_NO, GTK_RESPONSE_REJECT, NULL); eb = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog_overwrite)->vbox), eb); gtk_container_set_border_width (GTK_CONTAINER (eb), 6); gtk_widget_show (eb); label_text = g_strconcat (_("Do you want to overwrite file\n"), file_output, " ?", NULL); label = gtk_label_new (label_text); gtk_container_add (GTK_CONTAINER (eb), label); gtk_widget_show (label); res = gtk_dialog_run (GTK_DIALOG (dialog_overwrite)); gtk_widget_destroy (dialog_overwrite); g_io_channel_unref (file); if ((res == GTK_RESPONSE_REJECT) || (res == GTK_RESPONSE_DELETE_EVENT)) break; } } x264_gtk = x264_gtk_load (); param = x264_gtk_param_get (x264_gtk); x264_gtk_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, (int)sizeof (X264_Pipe_Data), (int)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 + -