Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "gstreamer.h"
- #include <wx/app.h>
- #include <gst/video/videooverlay.h>
- #include <gtk/gtk.h>
- #ifdef GDK_WINDOWING_X11
- #include <gdk/gdkx.h> // for GDK_WINDOW_XID
- #endif
- #ifdef GDK_WINDOWING_WIN32
- #include <gdk/gdkwin32.h> // for GDK_WINDOW_HWND
- #endif
- class CustomData
- {
- public:
- CustomData(guintptr xid)
- {
- this->xid = xid;
- }
- guintptr xid;
- };
- static GstBusSyncReply
- create_window(GstBus * bus, GstMessage * message, gpointer user_data)
- {
- // ignore anything but 'prepare-window-handle' element messages
- if(!gst_is_video_overlay_prepare_window_handle_message(message))
- return GST_BUS_PASS;
- CustomData *data = reinterpret_cast<CustomData*>(user_data);
- if(data->xid!=NULL)
- {
- GstVideoOverlay *overlay;
- overlay = GST_VIDEO_OVERLAY(GST_MESSAGE_SRC(message));
- gst_video_overlay_set_window_handle(overlay, data->xid);
- }
- return GST_BUS_DROP;
- }
- wxGStreamer::wxGStreamer(wxWindow* parent, wxWindowID id, const wxString& uri) : wxPanel(parent, id)
- {
- SetBackgroundColour(*wxBLACK);
- if(!g_thread_supported())
- g_thread_init(NULL);
- int i;
- char **argv = new char*[wxTheApp->argc + 1];
- for(i = 0; i < wxTheApp->argc; i++)
- {
- argv[i] = wxStrdupA(wxTheApp->argv[i].utf8_str());
- }
- argv[wxTheApp->argc] = NULL;
- gst_init(&wxTheApp->argc, &argv);
- // prepare the pipeline
- GstElement *pipeline = gst_pipeline_new("xvoverlay");
- GstElement *src = gst_element_factory_make("videotestsrc", NULL);
- GstElement *sink = gst_element_factory_make("xvimagesink", NULL);
- gst_bin_add_many(GST_BIN(pipeline), src, sink, NULL);
- gst_element_link(src, sink);
- GtkWidget* video_window = GetHandle();
- gtk_widget_realize(GetHandle());
- GdkWindow *videoareaXwindow = gtk_widget_get_window(video_window);
- guintptr xid = GDK_WINDOW_XID(videoareaXwindow);
- // run the pipeline
- GstStateChangeReturn sret = gst_element_set_state(pipeline,
- GST_STATE_PLAYING);
- if(sret == GST_STATE_CHANGE_FAILURE)
- {
- gst_element_set_state(pipeline, GST_STATE_NULL);
- gst_object_unref(pipeline);
- }
- CustomData* data = new CustomData(xid);
- GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
- gst_bus_set_sync_handler(bus, (GstBusSyncHandler) create_window, data, NULL);
- //gst_element_set_state(pipeline, GST_STATE_NULL);
- //gst_object_unref(pipeline);
- }
- wxGStreamer::~wxGStreamer()
- {
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement