char* data;
int width, height;
BOOL fullscreen;
+ BOOL keepAspectRatio;
NSOpenGLContext* fullScreenContext;
NSOpenGLContext* actualContext;
NSTrackingArea *trackingArea;
- (void) displayTexture;
- (char*) getTextureBuffer;
- (void) setFullScreen: (BOOL) flag;
+- (void) setKeepAspectRatio: (BOOL) flag;
- (void) reshape;
- (void) setVideoSize: (int) w: (int) h;
- (BOOL) haveSuperview;
- (void) reshape {
NSRect bounds;
+ gdouble frame_par, view_par;
+ gint view_height, view_width, c_height, c_width, c_x, c_y;
+
GST_LOG ("reshaping");
[actualContext makeCurrentContext];
bounds = [self bounds];
+ view_width = bounds.size.width;
+ view_height = bounds.size.height;
- glViewport (0, 0, (GLint) bounds.size.width, (GLint) bounds.size.height);
+ frame_par = (gdouble) width / height;
+ view_par = (gdouble) view_width / view_height;
+ if (!keepAspectRatio)
+ view_par = frame_par;
+
+ if (frame_par == view_par) {
+ c_height = view_height;
+ c_width = view_width;
+ c_x = 0;
+ c_y = 0;
+ } else if (frame_par < view_par) {
+ c_height = view_height;
+ c_width = c_height * frame_par;
+ c_x = (view_width - c_width) / 2;
+ c_y = 0;
+ } else {
+ c_width = view_width;
+ c_height = c_width / frame_par;
+ c_x = 0;
+ c_y = (view_height - c_height) / 2;
+ }
+ glViewport (c_x, c_y, (GLint) c_width, (GLint) c_height);
}
- (void) initTextures {
// data = g_malloc0 (2 * w * h);
[self initTextures];
+ [self reshape];
+}
+
+- (void) setKeepAspectRatio: (BOOL) flag {
+ keepAspectRatio = flag;
+ [self reshape];
}
- (void) haveSuperviewReal:(NSMutableArray *)closure {
{
ARG_0,
ARG_EMBED,
+ ARG_FORCE_PAR,
};
static void gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink);
}
}
[osxwindow->gstview setNavigation: GST_NAVIGATION(osxvideosink)];
+ [osxvideosink->osxwindow->gstview setKeepAspectRatio: osxvideosink->keep_par];
[pool release];
case ARG_EMBED:
/* Ignore, just here for backwards compatibility */
break;
+ case ARG_FORCE_PAR:
+ osxvideosink->keep_par = g_value_get_boolean(value);
+ if (osxvideosink->osxwindow)
+ [osxvideosink->osxwindow->gstview
+ setKeepAspectRatio: osxvideosink->keep_par];
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case ARG_EMBED:
g_value_set_boolean (value, TRUE);
break;
+ case ARG_FORCE_PAR:
+ g_value_set_boolean (value, osxvideosink->keep_par);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
osxvideosink->osxvideosinkobject = [[GstOSXVideoSinkObject alloc]
initWithSink:osxvideosink];
osxvideosink->app_started = FALSE;
+ osxvideosink->keep_par = FALSE;
}
static void
g_object_class_install_property (gobject_class, ARG_EMBED,
g_param_spec_boolean ("embed", "embed", "For ABI compatiblity only, do not use",
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstOSXVideoSink:force-aspect-ratio
+ *
+ * When enabled, scaling will respect original aspect ratio.
+ *
+ **/
+
+ g_object_class_install_property (gobject_class, ARG_FORCE_PAR,
+ g_param_spec_boolean ("force-aspect-ratio", "force aspect ration",
+ "When enabled, scaling will respect original aspect ration",
+ FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
static gboolean