diff --git a/sys/osxvideo/osxvideosink.h b/sys/osxvideo/osxvideosink.h index 2517bb37f2..da912dfaff 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 3f628e5f43..d2555b9522 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]; + NSView *view = (NSView *) handle_id; - 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; - } - } - - [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;