Advertisement
Guest User

Untitled

a guest
Nov 1st, 2014
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.10 KB | None | 0 0
  1. #include "player.h"
  2. #include <gtk/gtk.h>
  3. #include <gdk/gdkx.h>
  4. #include <gst/interfaces/xoverlay.h>
  5.  
  6. // event callbacks
  7.  
  8. // this is called when the drawing area is ready
  9. void realize_cb(GtkWidget *widget, node_t video_node){
  10. gst_x_overlay_set_window_handle(GST_X_OVERLAY(video_node), GDK_WINDOW_XID(widget->window));
  11. }
  12.  
  13. // play / pause button
  14. void pause_cb(GtkButton *button, Player * p){
  15. if(p->paused == TRUE){
  16. gst_element_set_state(p->pipeline, GST_STATE_PLAYING);
  17. p->paused = FALSE;
  18. }else{
  19. gst_element_set_state(p->pipeline, GST_STATE_PAUSED);
  20. p->paused = TRUE;
  21. }
  22. }
  23.  
  24. void set_display_cb(GtkButton *button, Player * p){
  25. if(p->paused == TRUE)
  26. gtk_button_set_label(button, GTK_STOCK_MEDIA_PLAY);
  27. else
  28. gtk_button_set_label(button, GTK_STOCK_MEDIA_PAUSE);
  29. }
  30.  
  31. // toggle subtitles button
  32. void toggle_subs_cb(GtkButton *button, Player * p) {
  33. if(p->subtitles == TRUE){
  34. unlink_element(p, "subtitle parser", "subtitle overlay");
  35. p->subtitles = FALSE;
  36. }else{
  37. link_element(p, "subtitle parser", "subtitle overlay");
  38. p->subtitles = TRUE;
  39. }
  40. }
  41.  
  42. // stop button
  43. void stop_cb(GtkButton *button, Player * p){
  44. gst_element_set_state (p->pipeline, GST_STATE_READY);
  45. }
  46.  
  47. // exit requested
  48. void exit_cb(GtkWidget *widget, GdkEvent *event, Player * p) {
  49. stop_cb(NULL, p);
  50. player_clean(p);
  51. gtk_main_quit();
  52. }
  53.  
  54. Player * create_gst_stream(const char * ogv_filename, const char * sub_filename){
  55. Player * p = player_init();
  56.  
  57. // node of the ogv file
  58. node_t ogv_node = file_node(p, ogv_filename,
  59. make_element(p, "oggdemux", "ogg demuxer"),
  60. NULL);
  61.  
  62. // node of the subtitles file
  63. node_t sub_node = file_node(p, sub_filename,
  64. make_element(p, "subparse", "subtitle parser"),
  65. NULL);
  66.  
  67. // node of the raw video stream demuxed from the ogv node
  68. node_t theora_node = demux_node(ogv_node,
  69. make_element(p, "queue", "video queue"),
  70. make_element(p, "theoradec", "theora decoder"),
  71. NULL);
  72.  
  73. // node of the final video stream, muxed with subtitleoverlay from the ogv's video stream and the subtitles
  74. p->video_node = mux_node(theora_node, sub_node,
  75. make_element(p, "subtitleoverlay", "subtitle overlay"),
  76. make_element(p, "xvimagesink", "videosink"),
  77. NULL);
  78.  
  79. // node of the audio stream demuxed from the ogv node
  80. p->audio_node = demux_node(ogv_node,
  81. make_element(p, "queue", "audio queue"),
  82. make_element(p, "vorbisdec", "vorbis decoder"),
  83. make_element(p, "audioconvert", "audio converter"),
  84. make_element(p, "autoaudiosink", "audio sink"),
  85. NULL);
  86.  
  87. p->paused = TRUE;
  88.  
  89. return p;
  90. }
  91.  
  92. void create_gtk_window(Player * p){
  93. GtkWidget *main_window;
  94. GtkWidget *main_box, *video_box, *control_box;
  95. GtkWidget *video_area;
  96. GtkWidget *pause_button, *stop_button, *subs_button;
  97.  
  98. gtk_init(NULL, NULL);
  99.  
  100. pause_button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_PAUSE);
  101. g_signal_connect(G_OBJECT(pause_button), "clicked", G_CALLBACK(pause_cb), p);
  102. g_signal_connect(G_OBJECT(pause_button), "clicked", G_CALLBACK(set_display_cb), p);
  103.  
  104. stop_button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_STOP);
  105. g_signal_connect(G_OBJECT(stop_button), "clicked", G_CALLBACK(stop_cb), p);
  106.  
  107. subs_button = gtk_button_new_with_label("toggle subtitles");
  108. g_signal_connect(G_OBJECT(stop_button), "clicked", G_CALLBACK(toggle_subs_cb), p);
  109.  
  110. control_box = gtk_hbox_new (FALSE, 0);
  111. gtk_box_pack_start(GTK_BOX(control_box), pause_button, FALSE, FALSE, 4);
  112. gtk_box_pack_start(GTK_BOX(control_box), stop_button, FALSE, FALSE, 4);
  113. gtk_box_pack_start(GTK_BOX(control_box), subs_button, FALSE, FALSE, 4);
  114.  
  115. video_area = gtk_drawing_area_new();
  116. gtk_widget_set_double_buffered(video_area, FALSE);
  117. gtk_widget_add_events(video_area, GDK_BUTTON_PRESS_MASK);
  118. g_signal_connect(G_OBJECT(video_area), "realize", G_CALLBACK(realize_cb), p->video_node);
  119. g_signal_connect(G_OBJECT(video_area), "realize", G_CALLBACK(pause_cb), p);
  120. g_signal_connect(G_OBJECT(video_area), "button_press_event", G_CALLBACK(pause_cb), p);
  121.  
  122. video_box = gtk_vbox_new (FALSE, 0);
  123. gtk_box_pack_start(GTK_BOX(video_box), video_area, TRUE, TRUE, 0);
  124.  
  125. main_box = gtk_vbox_new (FALSE, 0);
  126. gtk_box_pack_start(GTK_BOX(main_box), video_box, TRUE, TRUE, 0);
  127. gtk_box_pack_start(GTK_BOX(main_box), control_box, FALSE, FALSE, 0);
  128.  
  129. main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  130. gtk_container_add(GTK_CONTAINER(main_window), main_box);
  131. gtk_window_set_default_size(GTK_WINDOW(main_window), 640, 480);
  132. g_signal_connect(G_OBJECT(main_window), "delete-event", G_CALLBACK(exit_cb), p);
  133.  
  134. gtk_widget_show_all(main_window);
  135. }
  136.  
  137. int main(int argc, char ** argv){
  138. char * sub_filename;
  139.  
  140. /* Verification des arguments d'entree */
  141. switch(argc){
  142. case 2 :
  143. sub_filename = get_sub_name(argv[1]);
  144. break;
  145. case 3 :
  146. sub_filename = argv[2];
  147. break;
  148. default :
  149. g_printerr("Usage: %s OGV_FILENAME [SRT_FILENAME]\n", argv[0]);
  150. return EXIT_FAILURE;
  151. }
  152.  
  153. // create the video and audio streams through gstreamer
  154. Player * p = create_gst_stream(argv[1], sub_filename);
  155.  
  156. // create the gtk interface
  157. create_gtk_window(p);
  158.  
  159. // main loop
  160. gtk_main();
  161.  
  162. return EXIT_SUCCESS;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement