Advertisement
Guest User

Untitled

a guest
Nov 4th, 2012
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.54 KB | None | 0 0
  1. /* gcc -Wall -g -o mpStart02 mpStart02.c $(pkg-config --cflags --libs gtk+-2.0) */
  2. /* gcc -g -Wall -o mpStart02 mpStart02.c %GTK_FLAGS% */
  3.  
  4. /* TODO expand, TerminateProcess */
  5.  
  6. #include <gtk/gtk.h>
  7. #include <glib.h>
  8. #include <glib/gprintf.h>
  9. #include <string.h>
  10.  
  11. /* linux only */
  12. /*
  13. #include <sys/types.h>
  14. #include <sys/wait.h>
  15. #include <signal.h>
  16. */
  17.  
  18. /* windows only */
  19. #define _WIN32_WINNT 0x0502
  20. #include <Windows.h>
  21.  
  22. typedef struct
  23. {
  24.     /* input data */
  25.     GtkWidget *entry_video, *entry_subs, *btn_video, *btn_subs, *btn_play,
  26.         *btn_stop, *combo_vo, *combo_ao, *btn_fs, *btn_expand, *btn_loop,
  27.         *btn_ontop, *combo_subcp, *combo_fonts, *entry_params;
  28.  
  29.     /* media info */
  30.     GtkWidget *treev_clip, *treev_video, *treev_audio;
  31.    
  32.     /* mplayer pid */
  33.     GPid pid;
  34. } appData;
  35.  
  36. /* */
  37. G_MODULE_EXPORT gchar *
  38. split_str(gchar *str, gchar *search);
  39.  
  40. /* */
  41. G_MODULE_EXPORT void
  42. mplayer_watch(GPid pid, gint status, appData *_appData);
  43.  
  44. /* function starts mplayer */
  45. G_MODULE_EXPORT void
  46. on_play(GtkWidget *widget, appData *_appData);
  47.  
  48. /* function ends mplayer */
  49. G_MODULE_EXPORT void
  50. on_stop(GtkWidget *widget, appData *_appData);
  51.  
  52. /* funciotn gets value from check button */
  53. G_MODULE_EXPORT gboolean
  54. get_checkbox(GtkWidget *widget);
  55.  
  56. /* funciotn gets value from combobox */
  57. G_MODULE_EXPORT gchar *
  58. get_combo(GtkComboBox *combo);
  59.  
  60. /* function gets mplayer args from widgets */
  61. G_MODULE_EXPORT gchar *
  62. mplayer_args(appData *_appData);
  63.  
  64. /* function replace one string to another */
  65. G_MODULE_EXPORT gchar *
  66. g_strreplace(const gchar *string, const gchar *search, const gchar *replacement);
  67.  
  68. /* function adds media info to treeviews */
  69. G_MODULE_EXPORT void
  70. add_media_info(GtkWidget *tree, gchar *info, gchar *row);
  71.  
  72. /* function show media file info */
  73. G_MODULE_EXPORT void
  74. get_media_info(const gchar *video_path, appData *_appData);
  75.  
  76. /* function puts subtitle file in entry */
  77. G_MODULE_EXPORT void
  78. on_subs_set(GtkWidget *widget, appData *_appData);
  79.  
  80. /* function puts video file in entry */
  81. G_MODULE_EXPORT void
  82. on_video_set(GtkWidget *widget, appData *_appData);
  83.  
  84. int main(int argc, char *argv[])
  85. {
  86.     GtkBuilder *builder;
  87.     GtkWidget *window;
  88.     appData *_appData;
  89.  
  90.     _appData = g_slice_new(appData);
  91.     gtk_init(&argc, &argv);
  92.     builder = gtk_builder_new();
  93.     gtk_builder_add_from_file(builder, "mpStart02.glade", NULL);
  94.     gtk_builder_connect_signals(builder, _appData);
  95.     window = GTK_WIDGET(gtk_builder_get_object(builder, "mpStart"));
  96.  
  97.     _appData->btn_video = GTK_WIDGET(gtk_builder_get_object(builder, "btn_video"));
  98.     _appData->entry_video = GTK_WIDGET(gtk_builder_get_object(builder, "entry_video"));
  99.     _appData->btn_subs = GTK_WIDGET(gtk_builder_get_object(builder, "btn_subs"));
  100.     _appData->entry_subs = GTK_WIDGET(gtk_builder_get_object(builder, "entry_subs"));
  101.  
  102.     _appData->treev_clip = GTK_WIDGET(gtk_builder_get_object(builder, "treev_clip"));
  103.     _appData->treev_video = GTK_WIDGET(gtk_builder_get_object(builder, "treev_video"));
  104.     _appData->treev_audio = GTK_WIDGET(gtk_builder_get_object(builder, "treev_audio"));
  105.  
  106.     _appData->btn_play = GTK_WIDGET(gtk_builder_get_object(builder, "btn_play"));
  107.     _appData->btn_stop = GTK_WIDGET(gtk_builder_get_object(builder, "btn_stop"));
  108.  
  109.     _appData->combo_vo = GTK_WIDGET(gtk_builder_get_object(builder, "combo_vo"));
  110.     _appData->combo_ao = GTK_WIDGET(gtk_builder_get_object(builder, "combo_ao"));
  111.     _appData->btn_fs = GTK_WIDGET(gtk_builder_get_object(builder, "btn_fs"));
  112.     _appData->btn_expand = GTK_WIDGET(gtk_builder_get_object(builder, "btn_expand"));
  113.     _appData->btn_loop = GTK_WIDGET(gtk_builder_get_object(builder, "btn_loop"));
  114.     _appData->btn_ontop = GTK_WIDGET(gtk_builder_get_object(builder, "btn_ontop"));
  115.     _appData->combo_subcp = GTK_WIDGET(gtk_builder_get_object(builder, "combo_subcp"));
  116.     _appData->combo_fonts = GTK_WIDGET(gtk_builder_get_object(builder, "combo_fonts"));
  117.     _appData->entry_params = GTK_WIDGET(gtk_builder_get_object(builder, "entry_params"));
  118.  
  119.     g_object_unref(G_OBJECT(builder));
  120.     gtk_widget_show(window);
  121.     gtk_main();
  122.     g_slice_free(appData, _appData);
  123.     return 0;
  124. }
  125.  
  126. G_MODULE_EXPORT gchar *
  127. split_str(gchar *str, gchar *search)
  128. {
  129.     gchar   **str_arr;
  130.     gchar   *line = NULL;
  131.     guint   i = 0;
  132.  
  133.     str_arr = g_strsplit(str, "\r\n", -1);
  134.     while(i < g_strv_length(str_arr))
  135.     {
  136.         if(g_strrstr(str_arr[i], search))
  137.         {
  138.             line = g_strdup(str_arr[i]);
  139.         }
  140.         i++;
  141.     }
  142.     g_strfreev(str_arr);
  143.     return line;
  144. }
  145.  
  146. G_MODULE_EXPORT void
  147. mplayer_watch(GPid pid, gint status, appData *_appData)
  148. {
  149.     g_spawn_close_pid(pid);
  150. }
  151.  
  152. G_MODULE_EXPORT void
  153. on_play(GtkWidget *widget, appData *_appData)
  154. {
  155.     gchar   *args = NULL;
  156.     args = mplayer_args(_appData);
  157.  
  158.     gint        argc;
  159.     gchar       **argv;
  160.    
  161.     g_shell_parse_argv(args, &argc, &argv, NULL);
  162.     g_free(args);  
  163.     g_spawn_async_with_pipes(NULL, argv, NULL,
  164.         G_SPAWN_SEARCH_PATH|G_SPAWN_DO_NOT_REAP_CHILD|G_SPAWN_STDOUT_TO_DEV_NULL|G_SPAWN_STDERR_TO_DEV_NULL,
  165.         NULL, NULL, &_appData->pid, NULL, NULL, NULL, NULL);
  166.     g_strfreev(argv);
  167.    
  168.     g_child_watch_add(_appData->pid, (GChildWatchFunc)mplayer_watch, NULL);
  169. }
  170.  
  171. G_MODULE_EXPORT void
  172. on_stop(GtkWidget *widget, appData *_appData)
  173. {
  174.     TerminateProcess(_appData->pid, 0);
  175. }
  176.  
  177. G_MODULE_EXPORT gboolean
  178. get_checkbox(GtkWidget *widget)
  179. {
  180.     if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
  181.         return TRUE;
  182.     else
  183.         return FALSE;
  184. }
  185.  
  186. G_MODULE_EXPORT gchar *
  187. get_combo(GtkComboBox *combo)
  188. {
  189.     GtkTreeIter     iter;
  190.     GtkTreeModel    *model;
  191.     gchar           *combo_value;
  192.  
  193.     if(gtk_combo_box_get_active_iter(combo, &iter))
  194.     {
  195.         model = gtk_combo_box_get_model(combo);
  196.         gtk_tree_model_get(model, &iter, 0, &combo_value, -1);
  197.     }
  198.     return combo_value;
  199. }
  200.  
  201. G_MODULE_EXPORT gchar *
  202. mplayer_args(appData *_appData)
  203. {
  204.     gchar       *args = NULL, *vo, *ao, *subcp, *font_size;
  205.     const gchar *params, *sub_path, *video_path;
  206.    
  207.     args = g_strjoin(" ", "mplayer.exe -quiet", NULL);
  208.     vo = get_combo((GtkComboBox *)_appData->combo_vo);
  209.     args = g_strjoin(" ", args, "-vo", vo, NULL);
  210.     ao = get_combo((GtkComboBox *)_appData->combo_ao);
  211.     args = g_strjoin(" ", args, "-ao", ao, NULL);
  212.     subcp = get_combo((GtkComboBox *)_appData->combo_subcp);
  213.     args = g_strjoin(" ", args, "-subcp", subcp, NULL);
  214.     font_size = get_combo((GtkComboBox *)_appData->combo_fonts);
  215.     args = g_strjoin(" ", args, "-subfont-text-scale", font_size, NULL);
  216.     params = gtk_entry_get_text(GTK_ENTRY(_appData->entry_params));
  217.     args = g_strjoin(" ", args, params, NULL);
  218.    
  219.     if(get_checkbox(_appData->btn_fs))
  220.         args = g_strjoin(" ", args, "-fs", NULL);
  221.     if(get_checkbox(_appData->btn_expand))
  222.         args = g_strjoin(" ", args, "-vf", "expand=:-100::2", NULL);
  223.     if(get_checkbox(_appData->btn_loop))
  224.         args = g_strjoin(" ", args, "-loop", "0", NULL);
  225.     if(get_checkbox(_appData->btn_ontop))
  226.         args = g_strjoin(" ", args, "-ontop", NULL);
  227.    
  228.     sub_path = gtk_entry_get_text(GTK_ENTRY(_appData->entry_subs));
  229.     if(g_ascii_strcasecmp(sub_path, "") != 0)
  230.         args = g_strjoin(" ", args, "-sub", g_shell_quote(sub_path), NULL);
  231.    
  232.     video_path = gtk_entry_get_text(GTK_ENTRY(_appData->entry_video));
  233.     args = g_strjoin(" ", args, g_shell_quote(video_path), NULL);
  234.  
  235.     g_free(vo);
  236.     g_free(ao);
  237.     g_free(subcp);
  238.     g_free(font_size); 
  239.     return args;
  240. }
  241.  
  242. G_MODULE_EXPORT gchar *
  243. g_strreplace(const gchar *string, const gchar *search, const gchar *replacement)
  244. {
  245.     gchar *str, **arr;
  246.    
  247.     if(replacement == NULL)
  248.         replacement = "";
  249.    
  250.     arr = g_strsplit(string, search, -1);
  251.     if(arr != NULL && arr[0] != NULL)
  252.         str = g_strjoinv(replacement, arr);
  253.     else
  254.         str = g_strdup(string);
  255.    
  256.     g_strfreev(arr);
  257.     return str;
  258. }
  259.  
  260. G_MODULE_EXPORT void
  261. add_media_info(GtkWidget *tree, gchar *info, gchar *row)
  262. {
  263.     GtkListStore    *store;
  264.     GtkTreeModel    *model;
  265.     GtkTreeIter     iter;
  266.  
  267.     store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree)));
  268.     model = gtk_tree_view_get_model(GTK_TREE_VIEW (tree));
  269.     gtk_tree_model_get_iter_from_string(model, &iter, row);
  270.     gtk_list_store_set(store, &iter, 1, info, -1);
  271. }
  272.  
  273. G_MODULE_EXPORT void
  274. get_media_info(const gchar *video_path, appData *_appData)
  275. {
  276.     gchar       *runMplayer;
  277.  
  278.     gint        argc, out;
  279.     gchar       **argv;
  280.     GIOChannel  *out_ch;
  281.     gsize       size;
  282.     GIOStatus   status;
  283.     gchar       *string;
  284.     gchar       *line;
  285.     gchar       *line_tmp;
  286.  
  287.     runMplayer = g_strjoin(" ", "mplayer.exe", "-vo", "null", "-ao", "null",
  288.         "-frames", "10", "-identify", NULL);
  289.     runMplayer = g_strjoin(" ", runMplayer, g_shell_quote(video_path), NULL);
  290.    
  291.     g_shell_parse_argv(runMplayer, &argc, &argv, NULL);
  292.     g_free(runMplayer);
  293.    
  294.     g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL,
  295.         NULL, NULL, NULL, NULL, &out, NULL, NULL);
  296.     g_strfreev(argv);
  297.     out_ch = g_io_channel_win32_new_fd(out);
  298.     status = g_io_channel_read_to_end(out_ch, &string, &size, NULL);
  299.     g_print("%s\n\n", string);
  300.     //while(g_main_context_iteration(NULL, FALSE));
  301.     if(status == G_IO_STATUS_NORMAL)
  302.     {
  303.         add_media_info(_appData->treev_clip, g_filename_display_basename(video_path), "0");
  304.  
  305.         line = split_str(string, "ID_LENGTH=");
  306.         line = g_strreplace(line, "ID_LENGTH=", NULL);
  307.         gdouble lenght = g_ascii_strtod(line, NULL);
  308.         lenght = (int)lenght / 60;
  309.         g_ascii_dtostr(line, 10, lenght);
  310.         line = g_strjoin(" ", line, "min.", NULL);
  311.         add_media_info(_appData->treev_clip, line, "1");
  312.  
  313.         line = split_str(string, "ID_VIDEO_FORMAT=");
  314.         line = g_strreplace(line, "ID_VIDEO_FORMAT=", NULL);
  315.         add_media_info(_appData->treev_video, line, "0");
  316.  
  317.         line = split_str(string, "ID_VIDEO_WIDTH=");
  318.         line = g_strreplace(line, "ID_VIDEO_WIDTH=", NULL);
  319.         line_tmp = g_strdup(line);
  320.  
  321.         line = split_str(string, "ID_VIDEO_HEIGHT=");
  322.         line = g_strreplace(line, "ID_VIDEO_HEIGHT=", NULL);
  323.         line = g_strjoin(" x ", line_tmp, line, NULL);
  324.         add_media_info(_appData->treev_video, line, "1");
  325.         g_free(line_tmp);
  326.  
  327.         line = split_str(string, "ID_VIDEO_FPS=");
  328.         line = g_strreplace(line, "ID_VIDEO_FPS=", NULL);
  329.         line = g_strjoin(" ", line, "fps", NULL);
  330.         add_media_info(_appData->treev_video, line, "2");
  331.  
  332.         line = split_str(string, "ID_AUDIO_CODEC=");
  333.         line = g_strreplace(line, "ID_AUDIO_CODEC=", NULL);
  334.         add_media_info(_appData->treev_audio, line, "0");
  335.  
  336.         line = split_str(string, "ID_AUDIO_BITRATE=");
  337.         line = g_strreplace(line, "ID_AUDIO_BITRATE=", NULL);
  338.         gdouble bitrate = g_ascii_strtod(line, NULL);
  339.         bitrate = (int)bitrate / 1000;
  340.         g_ascii_dtostr(line, 10, bitrate);
  341.         line = g_strjoin(" ", line, "kbps", NULL);
  342.         add_media_info(_appData->treev_audio, line, "1");
  343.  
  344.         line = split_str(string, "ID_AUDIO_RATE=");
  345.         line = g_strreplace(line, "ID_AUDIO_RATE=", NULL);
  346.         line = g_strjoin(" ", line, "Hz", NULL);
  347.         add_media_info(_appData->treev_audio, line, "2");
  348.  
  349.         line = split_str(string, "ID_AUDIO_NCH=");
  350.         line = g_strreplace(line, "ID_AUDIO_NCH=", NULL);
  351.         add_media_info(_appData->treev_audio, line, "3");
  352.  
  353.         line = split_str(string, "ID_AUDIO_ID=");
  354.         line = g_strreplace(line, "ID_AUDIO_ID=", NULL);
  355.         add_media_info(_appData->treev_audio, line, "4");
  356.         g_free(string);
  357.         g_free(line);
  358.     }
  359.     else
  360.     {
  361.         g_io_channel_unref(out_ch);
  362.         g_io_channel_shutdown (out_ch, TRUE, NULL);
  363.     }
  364.  
  365. }
  366.  
  367. G_MODULE_EXPORT void
  368. on_subs_set(GtkWidget *widget, appData *_appData)
  369. {
  370.     gchar   *file_sub;
  371.     file_sub = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(_appData->btn_subs));
  372.     gtk_entry_set_text(GTK_ENTRY(_appData->entry_subs), file_sub);
  373.     g_free(file_sub);
  374. }
  375.  
  376. G_MODULE_EXPORT void
  377. on_video_set(GtkWidget *widget, appData *_appData)
  378. {
  379.     gchar   *file_video;
  380.     file_video = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(_appData->btn_video));
  381.     gtk_entry_set_text(GTK_ENTRY(_appData->entry_video), file_video);
  382.     get_media_info(file_video, _appData);
  383.     g_free(file_video);
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement