Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "player.h"
- #include <gtk/gtk.h>
- #include <gdk/gdkx.h>
- #include <gst/interfaces/xoverlay.h>
- // event callbacks
- // this is called when the drawing area is ready
- void realize_cb(GtkWidget *widget, node_t video_node){
- gst_x_overlay_set_window_handle(GST_X_OVERLAY(video_node), GDK_WINDOW_XID(widget->window));
- }
- // play / pause button
- void pause_cb(GtkButton *button, Player * p){
- if(p->paused == TRUE){
- gst_element_set_state(p->pipeline, GST_STATE_PLAYING);
- p->paused = FALSE;
- }else{
- gst_element_set_state(p->pipeline, GST_STATE_PAUSED);
- p->paused = TRUE;
- }
- }
- void set_display_cb(GtkButton *button, Player * p){
- if(p->paused == TRUE)
- gtk_button_set_label(button, GTK_STOCK_MEDIA_PLAY);
- else
- gtk_button_set_label(button, GTK_STOCK_MEDIA_PAUSE);
- }
- // toggle subtitles button
- void toggle_subs_cb(GtkButton *button, Player * p) {
- if(p->subtitles == TRUE){
- unlink_element(p, "subtitle parser", "subtitle overlay");
- p->subtitles = FALSE;
- }else{
- link_element(p, "subtitle parser", "subtitle overlay");
- p->subtitles = TRUE;
- }
- }
- // stop button
- void stop_cb(GtkButton *button, Player * p){
- gst_element_set_state (p->pipeline, GST_STATE_READY);
- }
- // exit requested
- void exit_cb(GtkWidget *widget, GdkEvent *event, Player * p) {
- stop_cb(NULL, p);
- player_clean(p);
- gtk_main_quit();
- }
- Player * create_gst_stream(const char * ogv_filename, const char * sub_filename){
- Player * p = player_init();
- // node of the ogv file
- node_t ogv_node = file_node(p, ogv_filename,
- make_element(p, "oggdemux", "ogg demuxer"),
- NULL);
- // node of the subtitles file
- node_t sub_node = file_node(p, sub_filename,
- make_element(p, "subparse", "subtitle parser"),
- NULL);
- // node of the raw video stream demuxed from the ogv node
- node_t theora_node = demux_node(ogv_node,
- make_element(p, "queue", "video queue"),
- make_element(p, "theoradec", "theora decoder"),
- NULL);
- // node of the final video stream, muxed with subtitleoverlay from the ogv's video stream and the subtitles
- p->video_node = mux_node(theora_node, sub_node,
- make_element(p, "subtitleoverlay", "subtitle overlay"),
- make_element(p, "xvimagesink", "videosink"),
- NULL);
- // node of the audio stream demuxed from the ogv node
- p->audio_node = demux_node(ogv_node,
- make_element(p, "queue", "audio queue"),
- make_element(p, "vorbisdec", "vorbis decoder"),
- make_element(p, "audioconvert", "audio converter"),
- make_element(p, "autoaudiosink", "audio sink"),
- NULL);
- p->paused = TRUE;
- return p;
- }
- void create_gtk_window(Player * p){
- GtkWidget *main_window;
- GtkWidget *main_box, *video_box, *control_box;
- GtkWidget *video_area;
- GtkWidget *pause_button, *stop_button, *subs_button;
- gtk_init(NULL, NULL);
- pause_button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_PAUSE);
- g_signal_connect(G_OBJECT(pause_button), "clicked", G_CALLBACK(pause_cb), p);
- g_signal_connect(G_OBJECT(pause_button), "clicked", G_CALLBACK(set_display_cb), p);
- stop_button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_STOP);
- g_signal_connect(G_OBJECT(stop_button), "clicked", G_CALLBACK(stop_cb), p);
- subs_button = gtk_button_new_with_label("toggle subtitles");
- g_signal_connect(G_OBJECT(stop_button), "clicked", G_CALLBACK(toggle_subs_cb), p);
- control_box = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start(GTK_BOX(control_box), pause_button, FALSE, FALSE, 4);
- gtk_box_pack_start(GTK_BOX(control_box), stop_button, FALSE, FALSE, 4);
- gtk_box_pack_start(GTK_BOX(control_box), subs_button, FALSE, FALSE, 4);
- video_area = gtk_drawing_area_new();
- gtk_widget_set_double_buffered(video_area, FALSE);
- gtk_widget_add_events(video_area, GDK_BUTTON_PRESS_MASK);
- g_signal_connect(G_OBJECT(video_area), "realize", G_CALLBACK(realize_cb), p->video_node);
- g_signal_connect(G_OBJECT(video_area), "realize", G_CALLBACK(pause_cb), p);
- g_signal_connect(G_OBJECT(video_area), "button_press_event", G_CALLBACK(pause_cb), p);
- video_box = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start(GTK_BOX(video_box), video_area, TRUE, TRUE, 0);
- main_box = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start(GTK_BOX(main_box), video_box, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(main_box), control_box, FALSE, FALSE, 0);
- main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_container_add(GTK_CONTAINER(main_window), main_box);
- gtk_window_set_default_size(GTK_WINDOW(main_window), 640, 480);
- g_signal_connect(G_OBJECT(main_window), "delete-event", G_CALLBACK(exit_cb), p);
- gtk_widget_show_all(main_window);
- }
- int main(int argc, char ** argv){
- char * sub_filename;
- /* Verification des arguments d'entree */
- switch(argc){
- case 2 :
- sub_filename = get_sub_name(argv[1]);
- break;
- case 3 :
- sub_filename = argv[2];
- break;
- default :
- g_printerr("Usage: %s OGV_FILENAME [SRT_FILENAME]\n", argv[0]);
- return EXIT_FAILURE;
- }
- // create the video and audio streams through gstreamer
- Player * p = create_gst_stream(argv[1], sub_filename);
- // create the gtk interface
- create_gtk_window(p);
- // main loop
- gtk_main();
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement