From: Andoni Morales Alastruey Date: Tue, 9 Jul 2013 13:34:04 +0000 (+0200) Subject: osxvideosink: defer the window handle setup to the main thread X-Git-Tag: 1.19.3~509^2~5633 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d57ef52cadd51643dfc812779dac444bf3d9eaae;p=platform%2Fupstream%2Fgstreamer.git osxvideosink: defer the window handle setup to the main thread --- diff --git a/sys/osxvideo/osxvideosink.h b/sys/osxvideo/osxvideosink.h index 2517bb3..da912df 100644 --- a/sys/osxvideo/osxvideosink.h +++ b/sys/osxvideo/osxvideosink.h @@ -145,6 +145,7 @@ GType gst_osx_video_sink_get_type(void); -(void) resize; -(void) destroy; -(void) showFrame: (GstBufferObject*) buf; +-(void) setView: (NSView*) view; #ifdef RUN_NS_APP_THREAD + (BOOL) isMainThread; -(void) nsAppThread; diff --git a/sys/osxvideo/osxvideosink.m b/sys/osxvideo/osxvideosink.m index 3f628e5..d2555b9 100644 --- a/sys/osxvideo/osxvideosink.m +++ b/sys/osxvideo/osxvideosink.m @@ -680,39 +680,11 @@ static void gst_osx_video_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle_id) { GstOSXVideoSink *osxvideosink = GST_OSX_VIDEO_SINK (overlay); - gulong window_id = (gulong) handle_id; - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if (osxvideosink->superview) { - GST_INFO_OBJECT (osxvideosink, "old xwindow id %p", osxvideosink->superview); - if (osxvideosink->osxwindow) { - gst_osx_video_sink_call_from_main_thread(osxvideosink, - osxvideosink->osxwindow->gstview, - @selector(removeFromSuperview:), (id)nil, YES); - } - [osxvideosink->superview release]; - } - if (osxvideosink->osxwindow != NULL && window_id != 0) { - if (osxvideosink->osxwindow->internal) { - GST_INFO_OBJECT (osxvideosink, "closing internal window"); - osxvideosink->osxwindow->closed = TRUE; - [osxvideosink->osxwindow->win close]; - [osxvideosink->osxwindow->win release]; - } - } - - GST_INFO_OBJECT (osxvideosink, "set xwindow id 0x%lx", window_id); - osxvideosink->superview = [((NSView *) window_id) retain]; - if (osxvideosink->osxwindow) { - gst_osx_video_sink_call_from_main_thread(osxvideosink, - osxvideosink->osxwindow->gstview, - @selector(addToSuperview:), osxvideosink->superview, YES); - if (window_id) { - osxvideosink->osxwindow->internal = FALSE; - } - } + NSView *view = (NSView *) handle_id; - [pool release]; + gst_osx_video_sink_call_from_main_thread(osxvideosink, + osxvideosink->osxvideosinkobject, + @selector(setView:), view, YES); } static void @@ -863,6 +835,38 @@ gst_osx_video_sink_get_type (void) } #endif +- (void) setView: (NSView*)view +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (osxvideosink->superview) { + GST_INFO_OBJECT (osxvideosink, "old xwindow id %p", osxvideosink->superview); + if (osxvideosink->osxwindow) { + [osxvideosink->osxwindow->gstview removeFromSuperview]; + } + [osxvideosink->superview release]; + } + if (osxvideosink->osxwindow != NULL && view != NULL) { + if (osxvideosink->osxwindow->internal) { + GST_INFO_OBJECT (osxvideosink, "closing internal window"); + osxvideosink->osxwindow->closed = TRUE; + [osxvideosink->osxwindow->win close]; + [osxvideosink->osxwindow->win release]; + } + } + + GST_INFO_OBJECT (osxvideosink, "set xwindow id %p", view); + osxvideosink->superview = [view retain]; + if (osxvideosink->osxwindow) { + [osxvideosink->osxwindow->gstview addToSuperview: osxvideosink->superview]; + if (view) { + osxvideosink->osxwindow->internal = FALSE; + } + } + + [pool release]; +} + - (void) resize { GstOSXWindow *osxwindow = osxvideosink->osxwindow;