osxvideosink: add force-aspect-ratio property

This commit is contained in:
Andoni Morales Alastruey 2012-05-16 18:52:45 +02:00 committed by Sebastian Dröge
parent 9b8bfe9b9e
commit fd19abf9ee
4 changed files with 60 additions and 1 deletions

View file

@ -43,6 +43,7 @@ struct _GstOSXImage;
char* data; char* data;
int width, height; int width, height;
BOOL fullscreen; BOOL fullscreen;
BOOL keepAspectRatio;
NSOpenGLContext* fullScreenContext; NSOpenGLContext* fullScreenContext;
NSOpenGLContext* actualContext; NSOpenGLContext* actualContext;
NSTrackingArea *trackingArea; NSTrackingArea *trackingArea;
@ -57,6 +58,7 @@ struct _GstOSXImage;
- (void) displayTexture; - (void) displayTexture;
- (char*) getTextureBuffer; - (char*) getTextureBuffer;
- (void) setFullScreen: (BOOL) flag; - (void) setFullScreen: (BOOL) flag;
- (void) setKeepAspectRatio: (BOOL) flag;
- (void) reshape; - (void) reshape;
- (void) setVideoSize: (int) w: (int) h; - (void) setVideoSize: (int) w: (int) h;
- (BOOL) haveSuperview; - (BOOL) haveSuperview;

View file

@ -142,6 +142,9 @@
- (void) reshape { - (void) reshape {
NSRect bounds; NSRect bounds;
gdouble frame_par, view_par;
gint view_height, view_width, c_height, c_width, c_x, c_y;
GST_LOG ("reshaping"); GST_LOG ("reshaping");
@ -152,9 +155,32 @@
[actualContext makeCurrentContext]; [actualContext makeCurrentContext];
bounds = [self bounds]; 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 { - (void) initTextures {
@ -374,6 +400,12 @@
// data = g_malloc0 (2 * w * h); // data = g_malloc0 (2 * w * h);
[self initTextures]; [self initTextures];
[self reshape];
}
- (void) setKeepAspectRatio: (BOOL) flag {
keepAspectRatio = flag;
[self reshape];
} }
- (void) haveSuperviewReal:(NSMutableArray *)closure { - (void) haveSuperviewReal:(NSMutableArray *)closure {

View file

@ -76,6 +76,7 @@ struct _GstOSXVideoSink {
void *osxvideosinkobject; void *osxvideosinkobject;
NSView *superview; NSView *superview;
guint cocoa_timeout; guint cocoa_timeout;
gboolean keep_par;
}; };
struct _GstOSXVideoSinkClass { struct _GstOSXVideoSinkClass {

View file

@ -66,6 +66,7 @@ enum
{ {
ARG_0, ARG_0,
ARG_EMBED, ARG_EMBED,
ARG_FORCE_PAR,
}; };
static void gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink); static void gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink);
@ -278,6 +279,7 @@ gst_osx_video_sink_osxwindow_create (GstOSXVideoSink * osxvideosink, gint width,
} }
} }
[osxwindow->gstview setNavigation: GST_NAVIGATION(osxvideosink)]; [osxwindow->gstview setNavigation: GST_NAVIGATION(osxvideosink)];
[osxvideosink->osxwindow->gstview setKeepAspectRatio: osxvideosink->keep_par];
[pool release]; [pool release];
@ -446,6 +448,12 @@ gst_osx_video_sink_set_property (GObject * object, guint prop_id,
case ARG_EMBED: case ARG_EMBED:
/* Ignore, just here for backwards compatibility */ /* Ignore, just here for backwards compatibility */
break; 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: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -466,6 +474,9 @@ gst_osx_video_sink_get_property (GObject * object, guint prop_id,
case ARG_EMBED: case ARG_EMBED:
g_value_set_boolean (value, TRUE); g_value_set_boolean (value, TRUE);
break; break;
case ARG_FORCE_PAR:
g_value_set_boolean (value, osxvideosink->keep_par);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -481,6 +492,7 @@ gst_osx_video_sink_init (GstOSXVideoSink * osxvideosink)
osxvideosink->osxvideosinkobject = [[GstOSXVideoSinkObject alloc] osxvideosink->osxvideosinkobject = [[GstOSXVideoSinkObject alloc]
initWithSink:osxvideosink]; initWithSink:osxvideosink];
osxvideosink->app_started = FALSE; osxvideosink->app_started = FALSE;
osxvideosink->keep_par = FALSE;
} }
static void static void
@ -543,6 +555,18 @@ gst_osx_video_sink_class_init (GstOSXVideoSinkClass * klass)
g_object_class_install_property (gobject_class, ARG_EMBED, g_object_class_install_property (gobject_class, ARG_EMBED,
g_param_spec_boolean ("embed", "embed", "For ABI compatiblity only, do not use", g_param_spec_boolean ("embed", "embed", "For ABI compatiblity only, do not use",
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); 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 static gboolean