Advertisement
mtangoo

wxWidgets Gstreamer 1.x

Mar 21st, 2015
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include "gstreamer.h"
  2. #include <wx/app.h>
  3.  
  4.  
  5. #include <gst/video/videooverlay.h>
  6. #include <gtk/gtk.h>
  7. #ifdef GDK_WINDOWING_X11
  8. #include <gdk/gdkx.h>  // for GDK_WINDOW_XID
  9. #endif
  10. #ifdef GDK_WINDOWING_WIN32
  11. #include <gdk/gdkwin32.h>  // for GDK_WINDOW_HWND
  12. #endif
  13.  
  14.  
  15. class CustomData
  16. {
  17.     public:
  18.         CustomData(guintptr xid)
  19.         {
  20.             this->xid = xid;
  21.         }
  22.         guintptr xid;
  23. };
  24.  
  25.  
  26. static GstBusSyncReply
  27. create_window(GstBus * bus, GstMessage * message, gpointer user_data)
  28. {
  29. // ignore anything but 'prepare-window-handle' element messages
  30.     if(!gst_is_video_overlay_prepare_window_handle_message(message))
  31.         return GST_BUS_PASS;
  32.        
  33.     CustomData *data = reinterpret_cast<CustomData*>(user_data);
  34.    
  35.     if(data->xid!=NULL)
  36.     {
  37.    
  38.         GstVideoOverlay *overlay;
  39.         overlay = GST_VIDEO_OVERLAY(GST_MESSAGE_SRC(message));
  40.         gst_video_overlay_set_window_handle(overlay, data->xid);
  41.     }
  42.    
  43.     return GST_BUS_DROP;
  44. }
  45.  
  46. wxGStreamer::wxGStreamer(wxWindow* parent, wxWindowID id, const wxString& uri) : wxPanel(parent, id)
  47. {
  48.     SetBackgroundColour(*wxBLACK);
  49.    
  50.     if(!g_thread_supported())
  51.         g_thread_init(NULL);
  52.        
  53.     int i;
  54.     char **argv = new char*[wxTheApp->argc + 1];
  55.    
  56.     for(i = 0; i < wxTheApp->argc; i++)
  57.     {
  58.         argv[i] = wxStrdupA(wxTheApp->argv[i].utf8_str());
  59.     }
  60.    
  61.     argv[wxTheApp->argc] = NULL;
  62.    
  63.     gst_init(&wxTheApp->argc, &argv);
  64.    
  65.     // prepare the pipeline
  66.     GstElement *pipeline = gst_pipeline_new("xvoverlay");
  67.     GstElement *src = gst_element_factory_make("videotestsrc", NULL);  
  68.     GstElement *sink = gst_element_factory_make("xvimagesink", NULL);
  69.     gst_bin_add_many(GST_BIN(pipeline), src, sink, NULL);
  70.     gst_element_link(src, sink);
  71.    
  72.  
  73.     GtkWidget* video_window = GetHandle();
  74.     gtk_widget_realize(GetHandle());
  75.     GdkWindow *videoareaXwindow =  gtk_widget_get_window(video_window);
  76.     guintptr xid = GDK_WINDOW_XID(videoareaXwindow);
  77.    
  78.     // run the pipeline
  79.     GstStateChangeReturn sret = gst_element_set_state(pipeline,
  80.                                 GST_STATE_PLAYING);
  81.    
  82.     if(sret == GST_STATE_CHANGE_FAILURE)
  83.     {
  84.         gst_element_set_state(pipeline, GST_STATE_NULL);
  85.         gst_object_unref(pipeline);
  86.     }
  87.    
  88.     CustomData* data = new CustomData(xid);
  89.    
  90.     GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
  91.     gst_bus_set_sync_handler(bus, (GstBusSyncHandler) create_window, data, NULL);
  92.     //gst_element_set_state(pipeline, GST_STATE_NULL);
  93.     //gst_object_unref(pipeline);
  94.    
  95. }
  96.  
  97. wxGStreamer::~wxGStreamer()
  98. {
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement