Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* gcc -Wall -g -o mpStart02 mpStart02.c $(pkg-config --cflags --libs gtk+-2.0) */
- /* gcc -g -Wall -o mpStart02 mpStart02.c %GTK_FLAGS% */
- /* TODO expand, TerminateProcess */
- #include <gtk/gtk.h>
- #include <glib.h>
- #include <glib/gprintf.h>
- #include <string.h>
- /* linux only */
- /*
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <signal.h>
- */
- /* windows only */
- #define _WIN32_WINNT 0x0502
- #include <Windows.h>
- typedef struct
- {
- /* input data */
- GtkWidget *entry_video, *entry_subs, *btn_video, *btn_subs, *btn_play,
- *btn_stop, *combo_vo, *combo_ao, *btn_fs, *btn_expand, *btn_loop,
- *btn_ontop, *combo_subcp, *combo_fonts, *entry_params;
- /* media info */
- GtkWidget *treev_clip, *treev_video, *treev_audio;
- /* mplayer pid */
- GPid pid;
- } appData;
- /* */
- G_MODULE_EXPORT gchar *
- split_str(gchar *str, gchar *search);
- /* */
- G_MODULE_EXPORT void
- mplayer_watch(GPid pid, gint status, appData *_appData);
- /* function starts mplayer */
- G_MODULE_EXPORT void
- on_play(GtkWidget *widget, appData *_appData);
- /* function ends mplayer */
- G_MODULE_EXPORT void
- on_stop(GtkWidget *widget, appData *_appData);
- /* funciotn gets value from check button */
- G_MODULE_EXPORT gboolean
- get_checkbox(GtkWidget *widget);
- /* funciotn gets value from combobox */
- G_MODULE_EXPORT gchar *
- get_combo(GtkComboBox *combo);
- /* function gets mplayer args from widgets */
- G_MODULE_EXPORT gchar *
- mplayer_args(appData *_appData);
- /* function replace one string to another */
- G_MODULE_EXPORT gchar *
- g_strreplace(const gchar *string, const gchar *search, const gchar *replacement);
- /* function adds media info to treeviews */
- G_MODULE_EXPORT void
- add_media_info(GtkWidget *tree, gchar *info, gchar *row);
- /* function show media file info */
- G_MODULE_EXPORT void
- get_media_info(const gchar *video_path, appData *_appData);
- /* function puts subtitle file in entry */
- G_MODULE_EXPORT void
- on_subs_set(GtkWidget *widget, appData *_appData);
- /* function puts video file in entry */
- G_MODULE_EXPORT void
- on_video_set(GtkWidget *widget, appData *_appData);
- int main(int argc, char *argv[])
- {
- GtkBuilder *builder;
- GtkWidget *window;
- appData *_appData;
- _appData = g_slice_new(appData);
- gtk_init(&argc, &argv);
- builder = gtk_builder_new();
- gtk_builder_add_from_file(builder, "mpStart02.glade", NULL);
- gtk_builder_connect_signals(builder, _appData);
- window = GTK_WIDGET(gtk_builder_get_object(builder, "mpStart"));
- _appData->btn_video = GTK_WIDGET(gtk_builder_get_object(builder, "btn_video"));
- _appData->entry_video = GTK_WIDGET(gtk_builder_get_object(builder, "entry_video"));
- _appData->btn_subs = GTK_WIDGET(gtk_builder_get_object(builder, "btn_subs"));
- _appData->entry_subs = GTK_WIDGET(gtk_builder_get_object(builder, "entry_subs"));
- _appData->treev_clip = GTK_WIDGET(gtk_builder_get_object(builder, "treev_clip"));
- _appData->treev_video = GTK_WIDGET(gtk_builder_get_object(builder, "treev_video"));
- _appData->treev_audio = GTK_WIDGET(gtk_builder_get_object(builder, "treev_audio"));
- _appData->btn_play = GTK_WIDGET(gtk_builder_get_object(builder, "btn_play"));
- _appData->btn_stop = GTK_WIDGET(gtk_builder_get_object(builder, "btn_stop"));
- _appData->combo_vo = GTK_WIDGET(gtk_builder_get_object(builder, "combo_vo"));
- _appData->combo_ao = GTK_WIDGET(gtk_builder_get_object(builder, "combo_ao"));
- _appData->btn_fs = GTK_WIDGET(gtk_builder_get_object(builder, "btn_fs"));
- _appData->btn_expand = GTK_WIDGET(gtk_builder_get_object(builder, "btn_expand"));
- _appData->btn_loop = GTK_WIDGET(gtk_builder_get_object(builder, "btn_loop"));
- _appData->btn_ontop = GTK_WIDGET(gtk_builder_get_object(builder, "btn_ontop"));
- _appData->combo_subcp = GTK_WIDGET(gtk_builder_get_object(builder, "combo_subcp"));
- _appData->combo_fonts = GTK_WIDGET(gtk_builder_get_object(builder, "combo_fonts"));
- _appData->entry_params = GTK_WIDGET(gtk_builder_get_object(builder, "entry_params"));
- g_object_unref(G_OBJECT(builder));
- gtk_widget_show(window);
- gtk_main();
- g_slice_free(appData, _appData);
- return 0;
- }
- G_MODULE_EXPORT gchar *
- split_str(gchar *str, gchar *search)
- {
- gchar **str_arr;
- gchar *line = NULL;
- guint i = 0;
- str_arr = g_strsplit(str, "\r\n", -1);
- while(i < g_strv_length(str_arr))
- {
- if(g_strrstr(str_arr[i], search))
- {
- line = g_strdup(str_arr[i]);
- }
- i++;
- }
- g_strfreev(str_arr);
- return line;
- }
- G_MODULE_EXPORT void
- mplayer_watch(GPid pid, gint status, appData *_appData)
- {
- g_spawn_close_pid(pid);
- }
- G_MODULE_EXPORT void
- on_play(GtkWidget *widget, appData *_appData)
- {
- gchar *args = NULL;
- args = mplayer_args(_appData);
- gint argc;
- gchar **argv;
- g_shell_parse_argv(args, &argc, &argv, NULL);
- g_free(args);
- g_spawn_async_with_pipes(NULL, argv, NULL,
- G_SPAWN_SEARCH_PATH|G_SPAWN_DO_NOT_REAP_CHILD|G_SPAWN_STDOUT_TO_DEV_NULL|G_SPAWN_STDERR_TO_DEV_NULL,
- NULL, NULL, &_appData->pid, NULL, NULL, NULL, NULL);
- g_strfreev(argv);
- g_child_watch_add(_appData->pid, (GChildWatchFunc)mplayer_watch, NULL);
- }
- G_MODULE_EXPORT void
- on_stop(GtkWidget *widget, appData *_appData)
- {
- TerminateProcess(_appData->pid, 0);
- }
- G_MODULE_EXPORT gboolean
- get_checkbox(GtkWidget *widget)
- {
- if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
- return TRUE;
- else
- return FALSE;
- }
- G_MODULE_EXPORT gchar *
- get_combo(GtkComboBox *combo)
- {
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *combo_value;
- if(gtk_combo_box_get_active_iter(combo, &iter))
- {
- model = gtk_combo_box_get_model(combo);
- gtk_tree_model_get(model, &iter, 0, &combo_value, -1);
- }
- return combo_value;
- }
- G_MODULE_EXPORT gchar *
- mplayer_args(appData *_appData)
- {
- gchar *args = NULL, *vo, *ao, *subcp, *font_size;
- const gchar *params, *sub_path, *video_path;
- args = g_strjoin(" ", "mplayer.exe -quiet", NULL);
- vo = get_combo((GtkComboBox *)_appData->combo_vo);
- args = g_strjoin(" ", args, "-vo", vo, NULL);
- ao = get_combo((GtkComboBox *)_appData->combo_ao);
- args = g_strjoin(" ", args, "-ao", ao, NULL);
- subcp = get_combo((GtkComboBox *)_appData->combo_subcp);
- args = g_strjoin(" ", args, "-subcp", subcp, NULL);
- font_size = get_combo((GtkComboBox *)_appData->combo_fonts);
- args = g_strjoin(" ", args, "-subfont-text-scale", font_size, NULL);
- params = gtk_entry_get_text(GTK_ENTRY(_appData->entry_params));
- args = g_strjoin(" ", args, params, NULL);
- if(get_checkbox(_appData->btn_fs))
- args = g_strjoin(" ", args, "-fs", NULL);
- if(get_checkbox(_appData->btn_expand))
- args = g_strjoin(" ", args, "-vf", "expand=:-100::2", NULL);
- if(get_checkbox(_appData->btn_loop))
- args = g_strjoin(" ", args, "-loop", "0", NULL);
- if(get_checkbox(_appData->btn_ontop))
- args = g_strjoin(" ", args, "-ontop", NULL);
- sub_path = gtk_entry_get_text(GTK_ENTRY(_appData->entry_subs));
- if(g_ascii_strcasecmp(sub_path, "") != 0)
- args = g_strjoin(" ", args, "-sub", g_shell_quote(sub_path), NULL);
- video_path = gtk_entry_get_text(GTK_ENTRY(_appData->entry_video));
- args = g_strjoin(" ", args, g_shell_quote(video_path), NULL);
- g_free(vo);
- g_free(ao);
- g_free(subcp);
- g_free(font_size);
- return args;
- }
- G_MODULE_EXPORT gchar *
- g_strreplace(const gchar *string, const gchar *search, const gchar *replacement)
- {
- gchar *str, **arr;
- if(replacement == NULL)
- replacement = "";
- arr = g_strsplit(string, search, -1);
- if(arr != NULL && arr[0] != NULL)
- str = g_strjoinv(replacement, arr);
- else
- str = g_strdup(string);
- g_strfreev(arr);
- return str;
- }
- G_MODULE_EXPORT void
- add_media_info(GtkWidget *tree, gchar *info, gchar *row)
- {
- GtkListStore *store;
- GtkTreeModel *model;
- GtkTreeIter iter;
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree)));
- model = gtk_tree_view_get_model(GTK_TREE_VIEW (tree));
- gtk_tree_model_get_iter_from_string(model, &iter, row);
- gtk_list_store_set(store, &iter, 1, info, -1);
- }
- G_MODULE_EXPORT void
- get_media_info(const gchar *video_path, appData *_appData)
- {
- gchar *runMplayer;
- gint argc, out;
- gchar **argv;
- GIOChannel *out_ch;
- gsize size;
- GIOStatus status;
- gchar *string;
- gchar *line;
- gchar *line_tmp;
- runMplayer = g_strjoin(" ", "mplayer.exe", "-vo", "null", "-ao", "null",
- "-frames", "10", "-identify", NULL);
- runMplayer = g_strjoin(" ", runMplayer, g_shell_quote(video_path), NULL);
- g_shell_parse_argv(runMplayer, &argc, &argv, NULL);
- g_free(runMplayer);
- g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL,
- NULL, NULL, NULL, NULL, &out, NULL, NULL);
- g_strfreev(argv);
- out_ch = g_io_channel_win32_new_fd(out);
- status = g_io_channel_read_to_end(out_ch, &string, &size, NULL);
- g_print("%s\n\n", string);
- //while(g_main_context_iteration(NULL, FALSE));
- if(status == G_IO_STATUS_NORMAL)
- {
- add_media_info(_appData->treev_clip, g_filename_display_basename(video_path), "0");
- line = split_str(string, "ID_LENGTH=");
- line = g_strreplace(line, "ID_LENGTH=", NULL);
- gdouble lenght = g_ascii_strtod(line, NULL);
- lenght = (int)lenght / 60;
- g_ascii_dtostr(line, 10, lenght);
- line = g_strjoin(" ", line, "min.", NULL);
- add_media_info(_appData->treev_clip, line, "1");
- line = split_str(string, "ID_VIDEO_FORMAT=");
- line = g_strreplace(line, "ID_VIDEO_FORMAT=", NULL);
- add_media_info(_appData->treev_video, line, "0");
- line = split_str(string, "ID_VIDEO_WIDTH=");
- line = g_strreplace(line, "ID_VIDEO_WIDTH=", NULL);
- line_tmp = g_strdup(line);
- line = split_str(string, "ID_VIDEO_HEIGHT=");
- line = g_strreplace(line, "ID_VIDEO_HEIGHT=", NULL);
- line = g_strjoin(" x ", line_tmp, line, NULL);
- add_media_info(_appData->treev_video, line, "1");
- g_free(line_tmp);
- line = split_str(string, "ID_VIDEO_FPS=");
- line = g_strreplace(line, "ID_VIDEO_FPS=", NULL);
- line = g_strjoin(" ", line, "fps", NULL);
- add_media_info(_appData->treev_video, line, "2");
- line = split_str(string, "ID_AUDIO_CODEC=");
- line = g_strreplace(line, "ID_AUDIO_CODEC=", NULL);
- add_media_info(_appData->treev_audio, line, "0");
- line = split_str(string, "ID_AUDIO_BITRATE=");
- line = g_strreplace(line, "ID_AUDIO_BITRATE=", NULL);
- gdouble bitrate = g_ascii_strtod(line, NULL);
- bitrate = (int)bitrate / 1000;
- g_ascii_dtostr(line, 10, bitrate);
- line = g_strjoin(" ", line, "kbps", NULL);
- add_media_info(_appData->treev_audio, line, "1");
- line = split_str(string, "ID_AUDIO_RATE=");
- line = g_strreplace(line, "ID_AUDIO_RATE=", NULL);
- line = g_strjoin(" ", line, "Hz", NULL);
- add_media_info(_appData->treev_audio, line, "2");
- line = split_str(string, "ID_AUDIO_NCH=");
- line = g_strreplace(line, "ID_AUDIO_NCH=", NULL);
- add_media_info(_appData->treev_audio, line, "3");
- line = split_str(string, "ID_AUDIO_ID=");
- line = g_strreplace(line, "ID_AUDIO_ID=", NULL);
- add_media_info(_appData->treev_audio, line, "4");
- g_free(string);
- g_free(line);
- }
- else
- {
- g_io_channel_unref(out_ch);
- g_io_channel_shutdown (out_ch, TRUE, NULL);
- }
- }
- G_MODULE_EXPORT void
- on_subs_set(GtkWidget *widget, appData *_appData)
- {
- gchar *file_sub;
- file_sub = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(_appData->btn_subs));
- gtk_entry_set_text(GTK_ENTRY(_appData->entry_subs), file_sub);
- g_free(file_sub);
- }
- G_MODULE_EXPORT void
- on_video_set(GtkWidget *widget, appData *_appData)
- {
- gchar *file_video;
- file_video = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(_appData->btn_video));
- gtk_entry_set_text(GTK_ENTRY(_appData->entry_video), file_video);
- get_media_info(file_video, _appData);
- g_free(file_video);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement