Hi all, I've managed to find some code online that nicely demonstrates the use of osxvideosink and gstreamer integration into a standard Cocoa Application project, using interface builder and normal Xcode tools: This is (eventually) using the osxvideosink and therefore can be used directly with the streamer installation packages that were developed for the mac. CPU usage on 720p video using this play bin amounts to 80-100% or so, whereas the movie player gets up to 7-10% or so, probably using video acceleration of some kind (or the play bin uses some unnecessary conversions). I modified the code to use an existing 'frame' (dummy area) where the video is going to be embedded. It does not resize properly and there are some other issues probably, but it' s a good start. I think this example is great to show others how to develop players that use osxvideosink and which can integrate gstreamer in applications built with interface builder, without jumping through 20 hoops to get there. Please let me know your concerns and what needs to happen before this can be integrated somewhere in the gstreamer example code. Rgds, Gerard ----------- // // AppDelegate.m // #import "AppDelegate.h" #include <gst/gst.h> #include <gst/interfaces/xoverlay.h> #import "MainWindow.h" /* ============================================================= */ /* */ /* gstreamer callbacks */ /* */ /* ============================================================= */ typedef struct context_t { void *appDelegate; void *viewingArea; } context_t; static GMainLoop *loop; static gboolean bus_call(GstBus *bus, GstMessage *msg, void *user_data) { context_t *context; switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: { g_message("End-of-stream"); g_main_loop_quit(loop); break; } case GST_MESSAGE_ERROR: { GError *err; gst_message_parse_error(msg, &err, NULL); g_error("%s", err->message); g_error_free(err); g_main_loop_quit(loop); break; } default: context = (context_t *)user_data; if (gst_structure_has_name(msg->structure, "have-ns-view")) { NSView* myView = (__bridge NSView*)g_value_get_pointer(gst_structure_get_value(msg->structure, "nsview")); AppDelegate* del = (__bridge AppDelegate*)context->appDelegate; NSRect viewFrame = [(__bridge NSView*)context->viewingArea frame]; [[del.window contentView] addSubview:myView]; [myView setFrame: viewFrame]; [myView setNeedsDisplay:YES]; //[del.window setContentView: myWindow]; } break; } return true; } static void gst_finish(GstElement* object, gpointer user_data) { //set uri to the next clip } static void play_uri(const char *uri, void *user_data) { GstElement *pipeline; GstBus *bus; loop = g_main_loop_new(NULL, FALSE); pipeline = gst_element_factory_make("playbin2", "player"); if (uri) g_object_set(G_OBJECT(pipeline), "uri", uri, NULL); bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); gst_bus_add_watch(bus, bus_call, user_data); gst_object_unref(bus); g_signal_connect(pipeline, "about-to-finish", G_CALLBACK(gst_finish), user_data); gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING); g_main_loop_run(loop); gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline)); } @implementation AppDelegate @synthesize videoView = _videoView; @synthesize window = _window; -(void)g_init:(id)param { gst_init(NULL, NULL); context_t *context = malloc(sizeof(context_t)); context->appDelegate = (__bridge void*)self; context->viewingArea = (__bridge void*)_videoView; play_uri("file:///Users/Shared/movies/holiday.mp4", context); } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { NSThread *g_thread = [[NSThread alloc] initWithTarget:self selector:@selector(g_init:) object:nil]; [g_thread start]; } @end _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
On 08/12/2012 11:59 PM, Gerard Toonstra
wrote:
You can make a patch for gst-plugins-good/tests/examples/ to add this code (+ a README if helpful). Then post this to bugzilla. Hopefully other developers that work on OSX can help to make it work fully and then the patch can be applied. Stefan
_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |