Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
437d8150
Commit
437d8150
authored
Aug 29, 2007
by
Pierre d'Herbemont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
modules/gui/minimal_macosx: Add a minimal_macosx interface and vout that is used by the framework.
parent
2994ae9e
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1670 additions
and
0 deletions
+1670
-0
modules/gui/minimal_macosx/Modules.am
modules/gui/minimal_macosx/Modules.am
+14
-0
modules/gui/minimal_macosx/VLCMinimalVoutWindow.h
modules/gui/minimal_macosx/VLCMinimalVoutWindow.h
+42
-0
modules/gui/minimal_macosx/VLCMinimalVoutWindow.m
modules/gui/minimal_macosx/VLCMinimalVoutWindow.m
+82
-0
modules/gui/minimal_macosx/VLCOpenGLVoutView.h
modules/gui/minimal_macosx/VLCOpenGLVoutView.h
+79
-0
modules/gui/minimal_macosx/VLCOpenGLVoutView.m
modules/gui/minimal_macosx/VLCOpenGLVoutView.m
+369
-0
modules/gui/minimal_macosx/intf.h
modules/gui/minimal_macosx/intf.h
+50
-0
modules/gui/minimal_macosx/intf.m
modules/gui/minimal_macosx/intf.m
+101
-0
modules/gui/minimal_macosx/macosx.c
modules/gui/minimal_macosx/macosx.c
+64
-0
modules/gui/minimal_macosx/voutagl.h
modules/gui/minimal_macosx/voutagl.h
+43
-0
modules/gui/minimal_macosx/voutagl.m
modules/gui/minimal_macosx/voutagl.m
+684
-0
modules/gui/minimal_macosx/voutgl.h
modules/gui/minimal_macosx/voutgl.h
+50
-0
modules/gui/minimal_macosx/voutgl.m
modules/gui/minimal_macosx/voutgl.m
+92
-0
No files found.
modules/gui/minimal_macosx/Modules.am
0 → 100644
View file @
437d8150
# Automake forgets to add a proper tag to libtool with Objective-C files.
# Moreocer Libtool should default tag to CC when none is specified but
# obviously does not. Here is a fix for that.
LIBTOOL=@LIBTOOL@ --tag=CC
SOURCES_minimal_macosx = \
intf.m \
macosx.c \
VLCMinimalVoutWindow.m \
VLCOpenGLVoutView.m \
voutgl.m \
voutagl.m \
$(NULL)
modules/gui/minimal_macosx/VLCMinimalVoutWindow.h
0 → 100644
View file @
437d8150
/*****************************************************************************
* VLCMinimalVoutWindow.h: MacOS X Minimal window for a vout
*****************************************************************************
* Copyright (C) 2001-2004 the VideoLAN team
* $Id$
*
* Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Cocoa/Cocoa.h>
#include <vlc/vlc.h>
@interface
VLCMinimalVoutWindow
:
NSWindow
{
NSRect
rect
;
}
-
(
id
)
initWithContentRect
:(
NSRect
)
contentRect
;
/* @protocol VLCOpenGLVoutEmbedding */
-
(
void
)
addVoutSubview
:(
NSView
*
)
view
;
-
(
void
)
removeVoutSubview
:(
NSView
*
)
view
;
-
(
void
)
enterFullscreen
;
-
(
void
)
leaveFullscreen
;
-
(
BOOL
)
stretchesVideo
;
-
(
void
)
setOnTop
:
(
BOOL
)
ontop
;
@end
modules/gui/minimal_macosx/VLCMinimalVoutWindow.m
0 → 100644
View file @
437d8150
/*****************************************************************************
* VLCMinimalVoutWindow.m: MacOS X Minimal interface window
*****************************************************************************
* Copyright (C) 2001-2004 the VideoLAN team
* $Id$
*
* Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include "intf.h"
#include "voutgl.h"
#include "VLCOpenGLVoutView.h"
#include "VLCMinimalVoutWindow.h"
/* SetSystemUIMode, ... */
#import <QuickTime/QuickTime.h>
#import <Cocoa/Cocoa.h>
@implementation
VLCMinimalVoutWindow
-
(
id
)
initWithContentRect
:(
NSRect
)
contentRect
{
if
(
self
=
[
super
initWithContentRect
:
contentRect
styleMask
:
NSBorderlessWindowMask
backing
:
NSBackingStoreBuffered
defer
:
NO
])
{
rect
=
contentRect
;
[
self
setBackgroundColor
:[
NSColor
blackColor
]];
[
self
setMovableByWindowBackground
:
YES
];
}
return
self
;
}
-
(
void
)
addVoutSubview
:(
NSView
*
)
view
{
[[
self
contentView
]
addSubview
:
view
];
[
view
setFrame
:[[
self
contentView
]
bounds
]];
}
-
(
void
)
removeVoutSubview
:(
NSView
*
)
view
{
[
self
close
];
[
self
release
];
}
-
(
void
)
enterFullscreen
{
SetSystemUIMode
(
kUIModeAllHidden
,
kUIOptionAutoShowMenuBar
);
[
self
setFrame
:[[
self
screen
]
frame
]
display
:
YES
];
}
-
(
void
)
leaveFullscreen
{
SetSystemUIMode
(
kUIModeNormal
,
kUIOptionAutoShowMenuBar
);
[
self
setFrame
:
rect
display
:
YES
];
}
-
(
BOOL
)
stretchesVideo
{
return
NO
;
}
-
(
void
)
setOnTop
:
(
BOOL
)
ontop
{
}
@end
modules/gui/minimal_macosx/VLCOpenGLVoutView.h
0 → 100644
View file @
437d8150
/*****************************************************************************
* VLCOpenGLVoutView.h: MacOS X OpenGL provider
*****************************************************************************
* Copyright (C) 2001-2004 the VideoLAN team
* $Id$
*
* Authors: Colin Delacroix <colin@zoy.org>
* Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
* Derk-Jan Hartman <hartman at videolan dot org>
* Eric Petit <titer@m0k.org>
* Benjamin Pracht <bigben at videolan dot org>
* Damien Fouilleul <damienf at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Cocoa/Cocoa.h>
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
#include <vlc/vlc.h>
/* Entry point */
int
cocoaglvoutviewInit
(
vout_thread_t
*
p_vout
);
void
cocoaglvoutviewEnd
(
vout_thread_t
*
p_vout
);
int
cocoaglvoutviewManage
(
vout_thread_t
*
p_vout
);
int
cocoaglvoutviewControl
(
vout_thread_t
*
p_vout
,
int
i_query
,
va_list
args
);
void
cocoaglvoutviewSwap
(
vout_thread_t
*
p_vout
);
int
cocoaglvoutviewLock
(
vout_thread_t
*
p_vout
);
void
cocoaglvoutviewUnlock
(
vout_thread_t
*
p_vout
);
/* To commmunicate with the VLC.framework */
@protocol
VLCOpenGLVoutEmbedding
-
(
void
)
addVoutSubview
:(
NSView
*
)
view
;
-
(
void
)
removeVoutSubview
:(
NSView
*
)
view
;
-
(
void
)
enterFullscreen
;
-
(
void
)
leaveFullscreen
;
-
(
BOOL
)
stretchesVideo
;
-
(
void
)
setOnTop
:
(
BOOL
)
ontop
;
/* Do we really want that in protocol? */
@end
/* VLCOpenGLVoutView */
@interface
VLCOpenGLVoutView
:
NSOpenGLView
{
id
<
VLCOpenGLVoutEmbedding
>
container
;
vout_thread_t
*
p_vout
;
NSLock
*
objectLock
;
}
/* Init a new gl view and register it to both the framework and the
* vout_thread_t. Must be called from main thread */
+
(
void
)
autoinitOpenGLVoutViewIntVoutWithContainer
:
(
NSData
*
)
args
;
-
(
id
)
initWithVout
:
(
vout_thread_t
*
)
vout
container
:
(
id
<
VLCOpenGLVoutEmbedding
>
)
container
;
-
(
void
)
detachFromVout
;
-
(
id
<
VLCOpenGLVoutEmbedding
>
)
container
;
-
(
void
)
reshape
;
-
(
void
)
update
;
-
(
void
)
drawRect
:
(
NSRect
)
rect
;
@end
modules/gui/minimal_macosx/VLCOpenGLVoutView.m
0 → 100644
View file @
437d8150
/*****************************************************************************
* VLCOpenGLVoutView.m: MacOS X OpenGL provider
*****************************************************************************
* Copyright (C) 2001-2004 the VideoLAN team
* $Id$
*
* Authors: Colin Delacroix <colin@zoy.org>
* Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
* Derk-Jan Hartman <hartman at videolan dot org>
* Eric Petit <titer@m0k.org>
* Benjamin Pracht <bigben at videolan dot org>
* Damien Fouilleul <damienf at videolan dot org>
* Pierr d'Herbemont <pdherbemont at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include "intf.h"
#include "voutgl.h"
#include "VLCOpenGLVoutView.h"
#include "VLCMinimalVoutWindow.h"
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
/*****************************************************************************
* cocoaglvoutviewInit
*****************************************************************************/
int
cocoaglvoutviewInit
(
vout_thread_t
*
p_vout
)
{
vlc_value_t
value_drawable
;
id
<
VLCOpenGLVoutEmbedding
>
o_cocoaglview_container
;
msg_Dbg
(
p_vout
,
"Mac OS X Vout is opening"
);
var_Create
(
p_vout
,
"drawable"
,
VLC_VAR_DOINHERIT
);
var_Get
(
p_vout
,
"drawable"
,
&
value_drawable
);
o_cocoaglview_container
=
(
id
)
value_drawable
.
i_int
;
if
(
!
o_cocoaglview_container
)
{
msg_Warn
(
p_vout
,
"No drawable!, spawing a window"
);
o_cocoaglview_container
=
[[
VLCMinimalVoutWindow
alloc
]
initWithContentRect
:
NSMakeRect
(
0
,
0
,
200
,
200
)];
}
p_vout
->
p_sys
->
b_embedded
=
VLC_FALSE
;
p_vout
->
p_sys
->
o_pool
=
[[
NSAutoreleasePool
alloc
]
init
];
/* Create the GL view */
struct
args
{
vout_thread_t
*
p_vout
;
id
<
VLCOpenGLVoutEmbedding
>
container
;
}
args
=
{
p_vout
,
o_cocoaglview_container
};
[
VLCOpenGLVoutView
performSelectorOnMainThread
:
@selector
(
autoinitOpenGLVoutViewIntVoutWithContainer
:)
withObject:
[
NSData
dataWithBytes
:
&
args
length
:
sizeof
(
struct
args
)]
waitUntilDone
:
YES
];
[[
p_vout
->
p_sys
->
o_glview
openGLContext
]
makeCurrentContext
];
return
VLC_SUCCESS
;
}
/*****************************************************************************
* cocoaglvoutviewEnd
*****************************************************************************/
void
cocoaglvoutviewEnd
(
vout_thread_t
*
p_vout
)
{
id
<
VLCOpenGLVoutEmbedding
>
o_cocoaglview_container
;
msg_Dbg
(
p_vout
,
"Mac OS X Vout is closing"
);
var_Destroy
(
p_vout
,
"drawable"
);
o_cocoaglview_container
=
[
p_vout
->
p_sys
->
o_glview
container
];
/* Make sure our view won't request the vout now */
[
p_vout
->
p_sys
->
o_glview
detachFromVout
];
msg_Dbg
(
p_vout
,
"Mac OS X Vout is closing"
);
/* Let the view go, _without_blocking_ */
[
p_vout
->
p_sys
->
o_glview
performSelectorOnMainThread
:
@selector
(
removeFromSuperview
)
withObject
:
NULL
waitUntilDone
:
NO
];
if
(
[(
id
)
o_cocoaglview_container
respondsToSelector
:
@selector
(
removeVoutSubview
:)]
)
[
o_cocoaglview_container
removeVoutSubview
:
p_vout
->
p_sys
->
o_glview
];
[
p_vout
->
p_sys
->
o_pool
release
];
}
/*****************************************************************************
* cocoaglvoutviewManage
*****************************************************************************/
int
cocoaglvoutviewManage
(
vout_thread_t
*
p_vout
)
{
if
(
p_vout
->
i_changes
&
VOUT_ASPECT_CHANGE
)
{
[
p_vout
->
p_sys
->
o_glview
reshape
];
p_vout
->
i_changes
&=
~
VOUT_ASPECT_CHANGE
;
}
if
(
p_vout
->
i_changes
&
VOUT_CROP_CHANGE
)
{
[
p_vout
->
p_sys
->
o_glview
reshape
];
p_vout
->
i_changes
&=
~
VOUT_CROP_CHANGE
;
}
if
(
p_vout
->
i_changes
&
VOUT_FULLSCREEN_CHANGE
)
{
NSAutoreleasePool
*
o_pool
=
[[
NSAutoreleasePool
alloc
]
init
];
p_vout
->
b_fullscreen
=
!
p_vout
->
b_fullscreen
;
if
(
p_vout
->
b_fullscreen
)
[[
p_vout
->
p_sys
->
o_glview
container
]
enterFullscreen
];
else
[[
p_vout
->
p_sys
->
o_glview
container
]
leaveFullscreen
];
[
o_pool
release
];
p_vout
->
i_changes
&=
~
VOUT_FULLSCREEN_CHANGE
;
}
//[[p_vout->p_sys->o_glview container] manage];
return
VLC_SUCCESS
;
}
/*****************************************************************************
* cocoaglvoutviewControl: control facility for the vout
*****************************************************************************/
int
cocoaglvoutviewControl
(
vout_thread_t
*
p_vout
,
int
i_query
,
va_list
args
)
{
vlc_bool_t
b_arg
;
switch
(
i_query
)
{
case
VOUT_SET_STAY_ON_TOP
:
b_arg
=
va_arg
(
args
,
vlc_bool_t
);
[[
p_vout
->
p_sys
->
o_glview
container
]
setOnTop
:
b_arg
];
return
VLC_SUCCESS
;
case
VOUT_CLOSE
:
case
VOUT_REPARENT
:
default:
return
vout_vaControlDefault
(
p_vout
,
i_query
,
args
);
}
}
/*****************************************************************************
* cocoaglvoutviewSwap
*****************************************************************************/
void
cocoaglvoutviewSwap
(
vout_thread_t
*
p_vout
)
{
p_vout
->
p_sys
->
b_got_frame
=
VLC_TRUE
;
[[
p_vout
->
p_sys
->
o_glview
openGLContext
]
flushBuffer
];
}
/*****************************************************************************
* cocoaglvoutviewLock
*****************************************************************************/
int
cocoaglvoutviewLock
(
vout_thread_t
*
p_vout
)
{
if
(
kCGLNoError
==
CGLLockContext
([[
p_vout
->
p_sys
->
o_glview
openGLContext
]
CGLContextObj
])
)
{
[[
p_vout
->
p_sys
->
o_glview
openGLContext
]
makeCurrentContext
];
return
0
;
}
return
1
;
}
/*****************************************************************************
* cocoaglvoutviewUnlock
*****************************************************************************/
void
cocoaglvoutviewUnlock
(
vout_thread_t
*
p_vout
)
{
CGLUnlockContext
([[
p_vout
->
p_sys
->
o_glview
openGLContext
]
CGLContextObj
]);
}
/*****************************************************************************
* VLCOpenGLVoutView implementation
*****************************************************************************/
@implementation
VLCOpenGLVoutView
/* Init a new gl view and register it to both the framework and the
* vout_thread_t. Must be called from main thread. */
+
(
void
)
autoinitOpenGLVoutViewIntVoutWithContainer
:
(
NSData
*
)
argsAsData
{
struct
args
{
vout_thread_t
*
p_vout
;
id
<
VLCOpenGLVoutEmbedding
>
container
;
}
*
args
=
(
struct
args
*
)[
argsAsData
bytes
];
VLCOpenGLVoutView
*
oglview
;
oglview
=
[[
VLCOpenGLVoutView
alloc
]
initWithVout
:
args
->
p_vout
container
:
args
->
container
];
args
->
p_vout
->
p_sys
->
o_glview
=
[
oglview
autorelease
];
[
args
->
container
addVoutSubview
:
oglview
];
}
-
(
void
)
dealloc
{
[
objectLock
dealloc
];
[
super
dealloc
];
}
-
(
void
)
removeFromSuperview
{
[
super
removeFromSuperview
];
}
-
(
id
)
initWithVout
:
(
vout_thread_t
*
)
vout
container
:
(
id
<
VLCOpenGLVoutEmbedding
>
)
aContainer
{
NSOpenGLPixelFormatAttribute
attribs
[]
=
{
NSOpenGLPFADoubleBuffer
,
NSOpenGLPFAAccelerated
,
NSOpenGLPFANoRecovery
,
NSOpenGLPFAColorSize
,
24
,
NSOpenGLPFAAlphaSize
,
8
,
NSOpenGLPFADepthSize
,
24
,
NSOpenGLPFAWindow
,
0
};
NSOpenGLPixelFormat
*
fmt
=
[[
NSOpenGLPixelFormat
alloc
]
initWithAttributes:
attribs
];
if
(
!
fmt
)
{
msg_Warn
(
p_vout
,
"could not create OpenGL video output"
);
return
nil
;
}
if
(
self
=
[
super
initWithFrame
:
NSMakeRect
(
0
,
0
,
10
,
10
)
pixelFormat
:
fmt
]
)
{
p_vout
=
vout
;
container
=
aContainer
;
objectLock
=
[[
NSLock
alloc
]
init
];
[
fmt
release
];
[[
self
openGLContext
]
makeCurrentContext
];
[[
self
openGLContext
]
update
];
/* Swap buffers only during the vertical retrace of the monitor.
http://developer.apple.com/documentation/GraphicsImaging/
Conceptual/OpenGL/chap5/chapter_5_section_44.html */
long
params
[]
=
{
1
};
CGLSetParameter
(
CGLGetCurrentContext
(),
kCGLCPSwapInterval
,
params
);
}
return
self
;
}
-
(
void
)
detachFromVout
{
[
objectLock
lock
];
p_vout
=
NULL
;
[
objectLock
unlock
];
}
-
(
id
<
VLCOpenGLVoutEmbedding
>
)
container
{
return
container
;
}
-
(
void
)
destroyVout
{
[
objectLock
lock
];
if
(
p_vout
)
{
vlc_object_detach
(
p_vout
);
vlc_object_release
(
p_vout
);
vout_Destroy
(
(
vout_thread_t
*
)
p_vout
);
}
[
objectLock
unlock
];
}
-
(
void
)
reshape
{
int
x
,
y
;
vlc_value_t
val
;
[
objectLock
lock
];
if
(
!
p_vout
)
{
[
objectLock
unlock
];
return
;
}
cocoaglvoutviewLock
(
p_vout
);
NSRect
bounds
=
[
self
bounds
];
if
(
[[
self
container
]
stretchesVideo
]
)
{
x
=
bounds
.
size
.
width
;
y
=
bounds
.
size
.
height
;
}
else
if
(
bounds
.
size
.
height
*
p_vout
->
fmt_in
.
i_visible_width
*
p_vout
->
fmt_in
.
i_sar_num
<
bounds
.
size
.
width
*
p_vout
->
fmt_in
.
i_visible_height
*
p_vout
->
fmt_in
.
i_sar_den
)
{
x
=
(
bounds
.
size
.
height
*
p_vout
->
fmt_in
.
i_visible_width
*
p_vout
->
fmt_in
.
i_sar_num
)
/
(
p_vout
->
fmt_in
.
i_visible_height
*
p_vout
->
fmt_in
.
i_sar_den
);
y
=
bounds
.
size
.
height
;
}
else
{
x
=
bounds
.
size
.
width
;
y
=
(
bounds
.
size
.
width
*
p_vout
->
fmt_in
.
i_visible_height
*
p_vout
->
fmt_in
.
i_sar_den
)
/
(
p_vout
->
fmt_in
.
i_visible_width
*
p_vout
->
fmt_in
.
i_sar_num
);
}
glViewport
(
(
bounds
.
size
.
width
-
x
)
/
2
,
(
bounds
.
size
.
height
-
y
)
/
2
,
x
,
y
);
if
(
p_vout
->
p_sys
->
b_got_frame
)
{
/* Ask the opengl module to redraw */
vout_thread_t
*
p_parent
;
p_parent
=
(
vout_thread_t
*
)
p_vout
->
p_parent
;
cocoaglvoutviewUnlock
(
p_vout
);
if
(
p_parent
&&
p_parent
->
pf_display
)
{
p_parent
->
pf_display
(
p_parent
,
NULL
);
}
}
else
{
glClear
(
GL_COLOR_BUFFER_BIT
);
cocoaglvoutviewUnlock
(
p_vout
);
}
[
objectLock
unlock
];
[
super
reshape
];
}
-
(
void
)
update
{
if
(
kCGLNoError
!=
CGLLockContext
([[
self
openGLContext
]
CGLContextObj
])
)
return
;
[
super
update
];
CGLUnlockContext
([[
p_vout
->
p_sys
->
o_glview
openGLContext
]
CGLContextObj
]);
}
-
(
void
)
drawRect
:
(
NSRect
)
rect
{
if
(
kCGLNoError
!=
CGLLockContext
([[
self
openGLContext
]
CGLContextObj
])
)
return
;
[[
self
openGLContext
]
flushBuffer
];
[
super
drawRect
:
rect
];
CGLUnlockContext
([[
p_vout
->
p_sys
->
o_glview
openGLContext
]
CGLContextObj
]);
}
@end
modules/gui/minimal_macosx/intf.h
0 → 100644
View file @
437d8150
/*****************************************************************************
* intf.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2002-2006 the VideoLAN team
* $Id$
*
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
* Christophe Massiot <massiot@via.ecp.fr>
* Derk-Jan Hartman <hartman at videolan dot org>
* Felix KŸhne <fkuehne at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc_interface.h>
#include <vlc_playlist.h>
#include <vlc_vout.h>
#include <vlc_aout.h>
#include <vlc_input.h>
#include <Cocoa/Cocoa.h>
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
/* switch this to 1, if you want to use Obj-C with GC */
#define GC_ENABLED 0
/*****************************************************************************
* intf_sys_t: description and status of the interface
*****************************************************************************/
struct
intf_sys_t
{
NSAutoreleasePool
*
o_pool
;
};
modules/gui/minimal_macosx/intf.m
0 → 100644
View file @
437d8150
/*****************************************************************************
* intf.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2002-2007 the VideoLAN team
* $Id$
*
* Authors: Jon Lech Johansen
<jon-vl
@
nanocrew
.
net
>
* Christophe Massiot
<massiot
@
via
.
ecp
.
fr
>
* Derk-Jan Hartman
<hartman
at
videolan
.
org
>
* Felix Khne
<fkuehne
at
videolan
dot
org
>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include
<stdlib
.
h
>
/* malloc(), free() */
#include
<sys
/
param
.
h
>
/* for MAXPATHLEN */
#include
<string
.
h
>
#include
<vlc
/
vlc
.
h
>
#include
<vlc
_keys
.
h
>
#include
<vlc
_input
.
h
>
#import
<intf
.
h
>
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
static void Run ( intf_thread_t *p_intf );
/*****************************************************************************
* OpenIntf: initialize interface
*****************************************************************************/
int E_(OpenIntf) ( vlc_object_t *p_this )
{
intf_thread_t *p_intf = (intf_thread_t*) p_this;
p_intf->p_sys = malloc( sizeof( intf_sys_t ) );
if( p_intf->p_sys == NULL )
{
return( 1 );
}
memset( p_intf->p_sys, 0, sizeof( *p_intf->p_sys ) );
p_intf->p_sys->o_pool = [[NSAutoreleasePool alloc] init];
p_intf->b_play = VLC_TRUE;
p_intf->pf_run = Run;
return( 0 );
}
/*****************************************************************************
* CloseIntf: destroy interface
*****************************************************************************/
void E_(CloseIntf) ( vlc_object_t *p_this )
{
intf_thread_t *p_intf = (intf_thread_t*) p_this;
free( p_intf->p_sys );
}
/*****************************************************************************
* Run: main loop
*****************************************************************************/
static void Run( intf_thread_t *p_intf )
{
sigset_t set;
/* Do it again - for some unknown reason, vlc_thread_create() often
* fails to go to real-time priority with the first launched thread
* (???) --Meuuh */
vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_LOW );
/* Make sure the "force quit" menu item does quit instantly.
* VLC overrides SIGTERM which is sent by the "force quit"
* menu item to make sure deamon mode quits gracefully, so
* we un-override SIGTERM here. */
sigemptyset(
&
set );
sigaddset(
&
set, SIGTERM );
pthread_sigmask( SIG_UNBLOCK,
&
set, NULL );
[NSApp run];
}
modules/gui/minimal_macosx/macosx.c
0 → 100644
View file @
437d8150
/*****************************************************************************
* macosx.m: Mac OS X module for vlc
*****************************************************************************
* Copyright (C) 2001-2006 the VideoLAN team
* $Id$
*
* Authors: Colin Delacroix <colin@zoy.org>
* Eugenio Jarosiewicz <ej0@cise.ufl.edu>
* Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <stdlib.h>
/* malloc(), free() */
#include <string.h>
#include <vlc/vlc.h>
/*****************************************************************************
* External prototypes
*****************************************************************************/
int
E_
(
OpenIntf
)
(
vlc_object_t
*
);
void
E_
(
CloseIntf
)
(
vlc_object_t
*
);
int
E_
(
OpenVideoGL
)
(
vlc_object_t
*
);
void
E_
(
CloseVideoGL
)
(
vlc_object_t
*
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin
();
/* Minimal interface. see intf.m */
set_description
(
_
(
"Mac OS X interface"
)
);
set_capability
(
"interface"
,
100
);
set_callbacks
(
E_
(
OpenIntf
),
E_
(
CloseIntf
)
);
set_category
(
CAT_INTERFACE
);
set_subcategory
(
SUBCAT_INTERFACE_MAIN
);
add_submodule
();
/* Will be loaded even without interface module. see voutgl.m */
set_description
(
"Mac OS X OpenGL"
);
set_capability
(
"opengl provider"
,
100
);
set_category
(
CAT_VIDEO
);
set_subcategory
(
SUBCAT_VIDEO_VOUT
);
set_callbacks
(
E_
(
OpenVideoGL
),
E_
(
CloseVideoGL
)
);
vlc_module_end
();
modules/gui/minimal_macosx/voutagl.h
0 → 100644
View file @
437d8150
/*****************************************************************************
* voutagl.c: MacOS X agl OpenGL provider (used by webbrowser.plugin)
*****************************************************************************
* Copyright (C) 2001-2004 the VideoLAN team
* $Id$
*
* Authors: Colin Delacroix <colin@zoy.org>
* Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
* Derk-Jan Hartman <hartman at videolan dot org>
* Eric Petit <titer@m0k.org>
* Benjamin Pracht <bigben at videolan dot org>
* Damien Fouilleul <damienf at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
#include <AGL/agl.h>
#include <vlc/vlc.h>
int
aglInit
(
vout_thread_t
*
p_vout
);
void
aglEnd
(
vout_thread_t
*
p_vout
);
int
aglManage
(
vout_thread_t
*
p_vout
);
int
aglControl
(
vout_thread_t
*
,
int
,
va_list
);
void
aglSwap
(
vout_thread_t
*
p_vout
);
int
aglLock
(
vout_thread_t
*
p_vout
);
void
aglUnlock
(
vout_thread_t
*
p_vout
);
modules/gui/minimal_macosx/voutagl.m
0 → 100644
View file @
437d8150
/*****************************************************************************
*
voutagl
.
c
:
MacOS
X
agl
OpenGL
provider
(
used
by
webbrowser
.
plugin
)
*****************************************************************************
*
Copyright
(
C
)
2001
-
2004
the
VideoLAN
team
*
$Id$
*
*
Authors
:
Colin
Delacroix
<
colin
@
zoy
.
org
>
*
Florian
G
.
Pflug
<
fgp
@
phlo
.
org
>
*
Jon
Lech
Johansen
<
jon
-
vl
@
nanocrew
.
net
>
*
Derk
-
Jan
Hartman
<
hartman
at
videolan
dot
org
>
*
Eric
Petit
<
titer
@
m0k
.
org
>
*
Benjamin
Pracht
<
bigben
at
videolan
dot
org
>
*
Damien
Fouilleul
<
damienf
at
videolan
dot
org
>
*
*
This
program
is
free
software
;
you
can
redistribute
it
and
/
or
modify
*
it
under
the
terms
of
the
GNU
General
Public
License
as
published
by
*
the
Free
Software
Foundation
;
either
version
2
of
the
License
,
or
*
(
at
your
option
)
any
later
version
.
*
*
This
program
is
distributed
in
the
hope
that
it
will
be
useful
,
*
but
WITHOUT
ANY
WARRANTY
;
without
even
the
implied
warranty
of
*
MERCHANTABILITY
or
FITNESS
FOR
A
PARTICULAR
PURPOSE
.
See
the
*
GNU
General
Public
License
for
more
details
.
*
*
You
should
have
received
a
copy
of
the
GNU
General
Public
License
*
along
with
this
program
;
if
not
,
write
to
the
Free
Software
*
Foundation
,
Inc
.,
51
Franklin
Street
,
Fifth
Floor
,
Boston
MA
02110
-
1301
,
USA
.
*****************************************************************************/
#include
"intf.h"
#include
"voutgl.h"
#include
"voutagl.h"
/*****************************************************************************
*
embedded
AGL
context
implementation
*****************************************************************************/
static
void
aglSetViewport
(
vout
_
thread
_
t
*
p
_
vout
,
Rect
viewBounds
,
Rect
clipBounds
)
;
static
void
aglReshape
(
vout
_
thread
_
t
*
p
_
vout
)
;
static
OSStatus
WindowEventHandler
(
EventHandlerCallRef
nextHandler
,
EventRef
event
,
void
*
userData
)
;
int
aglInit
(
vout
_
thread
_
t
*
p
_
vout
)
{
vlc
_
value
_
t
val
;
Rect
viewBounds
;
Rect
clipBounds
;
static
const
GLint
ATTRIBUTES
[]
=
{
AGL
_
WINDOW
,
AGL
_
RGBA
,
AGL
_
NO
_
RECOVERY
,
AGL
_
ACCELERATED
,
AGL
_
DOUBLEBUFFER
,
AGL
_
RED
_
SIZE
,
8
,
AGL
_
GREEN
_
SIZE
,
8
,
AGL
_
BLUE
_
SIZE
,
8
,
AGL
_
ALPHA
_
SIZE
,
8
,
AGL
_
DEPTH
_
SIZE
,
24
,
AGL
_
NONE
}
;
AGLPixelFormat
pixFormat
;
p
_
vout
->
p
_
sys
->
b
_
embedded
=
VLC
_
TRUE
;
pixFormat
=
aglChoosePixelFormat
(
NULL
,
0
,
ATTRIBUTES
)
;
if
(
NULL
==
pixFormat
)
{
msg
_
Err
(
p
_
vout
,
"no screen renderer available for required attributes."
)
;
return
VLC
_
EGENERIC
;
}
p
_
vout
->
p
_
sys
->
agl
_
ctx
=
aglCreateContext
(
pixFormat
,
NULL
)
;
aglDestroyPixelFormat
(
pixFormat
)
;
if
(
NULL
==
p
_
vout
->
p
_
sys
->
agl
_
ctx
)
{
msg
_
Err
(
p
_
vout
,
"cannot create AGL context."
)
;
return
VLC
_
EGENERIC
;
}
else
{
//
tell
opengl
not
to
sync
buffer
swap
with
vertical
retrace
(
too
inefficient
)
GLint
param
=
0
;
aglSetInteger
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
AGL
_
SWAP
_
INTERVAL
,
&
param
)
;
aglEnable
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
AGL
_
SWAP
_
INTERVAL
)
;
}
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable"
,
&
val
)
;
p
_
vout
->
p
_
sys
->
agl
_
drawable
=
(
AGLDrawable
)
val
.
i
_
int
;
aglSetDrawable
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
p
_
vout
->
p
_
sys
->
agl
_
drawable
)
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-view-top"
,
&
val
)
;
viewBounds
.
top
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-view-left"
,
&
val
)
;
viewBounds
.
left
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-view-bottom"
,
&
val
)
;
viewBounds
.
bottom
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-view-right"
,
&
val
)
;
viewBounds
.
right
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-clip-top"
,
&
val
)
;
clipBounds
.
top
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-clip-left"
,
&
val
)
;
clipBounds
.
left
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-clip-bottom"
,
&
val
)
;
clipBounds
.
bottom
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-clip-right"
,
&
val
)
;
clipBounds
.
right
=
val
.
i
_
int
;
p
_
vout
->
p
_
sys
->
b
_
clipped
_
out
=
(
clipBounds
.
top
==
clipBounds
.
bottom
)
||
(
clipBounds
.
left
==
clipBounds
.
right
)
;
if
(
!
p
_
vout
->
p
_
sys
->
b
_
clipped
_
out
)
{
aglLock
(
p
_
vout
)
;
aglSetViewport
(
p
_
vout
,
viewBounds
,
clipBounds
)
;
aglReshape
(
p
_
vout
)
;
aglUnlock
(
p
_
vout
)
;
}
p
_
vout
->
p
_
sys
->
clipBounds
=
clipBounds
;
p
_
vout
->
p
_
sys
->
viewBounds
=
viewBounds
;
return
VLC
_
SUCCESS
;
}
void
aglEnd
(
vout
_
thread
_
t
*
p
_
vout
)
{
aglSetCurrentContext
(
NULL
)
;
if
(
p
_
vout
->
p
_
sys
->
theWindow
)
DisposeWindow
(
p
_
vout
->
p
_
sys
->
theWindow
)
;
aglDestroyContext
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
)
;
}
void
aglReshape
(
vout
_
thread
_
t
*
p
_
vout
)
{
unsigned
int
x
,
y
;
unsigned
int
i
_
height
=
p
_
vout
->
p
_
sys
->
i
_
height
;
unsigned
int
i
_
width
=
p
_
vout
->
p
_
sys
->
i
_
width
;
vout
_
PlacePicture
(
p
_
vout
,
i
_
width
,
i
_
height
,
&
x
,
&
y
,
&
i
_
width
,
&
i
_
height
)
;
glViewport
(
p
_
vout
->
p
_
sys
->
i
_
offx
+
x
,
p
_
vout
->
p
_
sys
->
i
_
offy
+
y
,
i
_
width
,
i
_
height
)
;
if
(
p
_
vout
->
p
_
sys
->
b
_
got
_
frame
)
{
/*
Ask
the
opengl
module
to
redraw
*/
vout
_
thread
_
t
*
p
_
parent
;
p
_
parent
=
(
vout
_
thread
_
t
*
)
p
_
vout
->
p
_
parent
;
if
(
p
_
parent
&&
p
_
parent
->
pf
_
display
)
{
p
_
parent
->
pf
_
display
(
p
_
parent
,
NULL
)
;
}
}
else
{
glClear
(
GL
_
COLOR
_
BUFFER
_
BIT
)
;
}
}
/*
private
event
class
*/
enum
{
kEventClassVLCPlugin
=
'
vlcp
',
}
;
/*
private
event
kinds
*/
enum
{
kEventVLCPluginShowFullscreen
=
32768
,
kEventVLCPluginHideFullscreen
,
}
;
static
void
sendEventToMainThread
(
EventTargetRef
target
,
UInt32
class
,
UInt32
kind
)
{
EventRef
myEvent
;
if
(
noErr
==
CreateEvent
(
NULL
,
class
,
kind
,
0
,
kEventAttributeNone
,
&
myEvent
)
)
{
if
(
noErr
==
SetEventParameter
(
myEvent
,
kEventParamPostTarget
,
typeEventTargetRef
,
sizeof
(
EventTargetRef
)
,
&
target
)
)
{
PostEventToQueue
(
GetMainEventQueue
()
,
myEvent
,
kEventPriorityStandard
)
;
}
ReleaseEvent
(
myEvent
)
;
}
}
int
aglManage
(
vout
_
thread
_
t
*
p
_
vout
)
{
if
(
p
_
vout
->
i
_
changes
&
VOUT
_
ASPECT
_
CHANGE
)
{
aglLock
(
p
_
vout
)
;
aglReshape
(
p
_
vout
)
;
aglUnlock
(
p
_
vout
)
;
p
_
vout
->
i
_
changes
&=
~
VOUT
_
ASPECT
_
CHANGE
;
}
if
(
p
_
vout
->
i
_
changes
&
VOUT
_
CROP
_
CHANGE
)
{
aglLock
(
p
_
vout
)
;
aglReshape
(
p
_
vout
)
;
aglUnlock
(
p
_
vout
)
;
p
_
vout
->
i
_
changes
&=
~
VOUT
_
CROP
_
CHANGE
;
}
if
(
p
_
vout
->
i
_
changes
&
VOUT
_
FULLSCREEN
_
CHANGE
)
{
aglSetDrawable
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
NULL
)
;
aglLock
(
p
_
vout
)
;
if
(
p
_
vout
->
b
_
fullscreen
)
{
/*
Close
the
fullscreen
window
and
resume
normal
drawing
*/
vlc
_
value
_
t
val
;
Rect
viewBounds
;
Rect
clipBounds
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable"
,
&
val
)
;
p
_
vout
->
p
_
sys
->
agl
_
drawable
=
(
AGLDrawable
)
val
.
i
_
int
;
aglSetDrawable
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
p
_
vout
->
p
_
sys
->
agl
_
drawable
)
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-view-top"
,
&
val
)
;
viewBounds
.
top
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-view-left"
,
&
val
)
;
viewBounds
.
left
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-view-bottom"
,
&
val
)
;
viewBounds
.
bottom
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-view-right"
,
&
val
)
;
viewBounds
.
right
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-clip-top"
,
&
val
)
;
clipBounds
.
top
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-clip-left"
,
&
val
)
;
clipBounds
.
left
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-clip-bottom"
,
&
val
)
;
clipBounds
.
bottom
=
val
.
i
_
int
;
var
_
Get
(
p
_
vout
->
p
_
libvlc
,
"drawable-clip-right"
,
&
val
)
;
clipBounds
.
right
=
val
.
i
_
int
;
aglSetCurrentContext
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
)
;
aglSetViewport
(
p
_
vout
,
viewBounds
,
clipBounds
)
;
/*
Most
Carbon
APIs
are
not
thread
-
safe
,
therefore
delagate
some
GUI
visibilty
update
to
the
main
thread
*/
sendEventToMainThread
(
GetWindowEventTarget
(
p
_
vout
->
p
_
sys
->
theWindow
)
,
kEventClassVLCPlugin
,
kEventVLCPluginHideFullscreen
)
;
}
else
{
Rect
deviceRect
;
GDHandle
deviceHdl
=
GetMainDevice
()
;
deviceRect
=
(*deviceHdl)->gdRect;
if( !p_vout->p_sys->theWindow )
{
/* Create a window */
WindowAttributes windowAttrs;
windowAttrs = kWindowStandardDocumentAttributes
| kWindowStandardHandlerAttribute
| kWindowLiveResizeAttribute
| kWindowNoShadowAttribute;
windowAttrs &= (~kWindowResizableAttribute);
CreateNewWindow(kDocumentWindowClass, windowAttrs, &deviceRect, &p_vout->p_sys->theWindow);
if( !p_vout->p_sys->winGroup )
{
CreateWindowGroup(0, &p_vout->p_sys->winGroup);
SetWindowGroup(p_vout->p_sys->theWindow, p_vout->p_sys->winGroup);
SetWindowGroupParent( p_vout->p_sys->winGroup, GetWindowGroupOfClass(kDocumentWindowClass) ) ;
}
// Window title
CFStringRef titleKey = CFSTR("Fullscreen VLC media plugin");
CFStringRef windowTitle = CFCopyLocalizedString(titleKey, NULL);
SetWindowTitleWithCFString(p_vout->p_sys->theWindow, windowTitle);
CFRelease(titleKey);
CFRelease(windowTitle);
//Install event handler
static const EventTypeSpec win_events[] = {
{ kEventClassMouse, kEventMouseDown },
{ kEventClassMouse, kEventMouseMoved },
{ kEventClassMouse, kEventMouseUp },
{ kEventClassWindow, kEventWindowClosed },
{ kEventClassWindow, kEventWindowBoundsChanged },
{ kEventClassCommand, kEventCommandProcess },
{ kEventClassVLCPlugin, kEventVLCPluginShowFullscreen },
{ kEventClassVLCPlugin, kEventVLCPluginHideFullscreen },
};
InstallWindowEventHandler (p_vout->p_sys->theWindow, NewEventHandlerUPP (WindowEventHandler), GetEventTypeCount(win_events), win_events, p_vout, NULL);
}
else
{
/* just in case device resolution changed */
SetWindowBounds(p_vout->p_sys->theWindow, kWindowContentRgn, &deviceRect);
}
glClear( GL_COLOR_BUFFER_BIT );
p_vout->p_sys->agl_drawable = (AGLDrawable)GetWindowPort(p_vout->p_sys->theWindow);
aglSetDrawable(p_vout->p_sys->agl_ctx, p_vout->p_sys->agl_drawable);
aglSetCurrentContext(p_vout->p_sys->agl_ctx);
aglSetViewport(p_vout, deviceRect, deviceRect);
//aglSetFullScreen(p_vout->p_sys->agl_ctx, device_width, device_height, 0, 0);
/* Most Carbon APIs are not thread-safe, therefore delagate some GUI visibilty update to the main thread */
sendEventToMainThread(GetWindowEventTarget(p_vout->p_sys->theWindow), kEventClassVLCPlugin, kEventVLCPluginShowFullscreen);
}
aglReshape(p_vout);
aglUnlock( p_vout );
p_vout->b_fullscreen = !p_vout->b_fullscreen;
p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
}
return VLC_SUCCESS;
}
int aglControl( vout_thread_t *p_vout, int i_query, va_list args )
{
switch( i_query )
{
case VOUT_SET_VIEWPORT:
{
Rect viewBounds, clipBounds;
viewBounds.top = va_arg( args, int);
viewBounds.left = va_arg( args, int);
viewBounds.bottom = va_arg( args, int);
viewBounds.right = va_arg( args, int);
clipBounds.top = va_arg( args, int);
clipBounds.left = va_arg( args, int);
clipBounds.bottom = va_arg( args, int);
clipBounds.right = va_arg( args, int);
if( !p_vout->b_fullscreen )
{
/*
** check that the clip rect is not empty, as this is used
** by Firefox to prevent a plugin from displaying during
** a scrolling event. In this case we just prevent buffers
** from being swapped and ignore clipping as this is less
** disruptive than a GL geometry change
*/
p_vout->p_sys->b_clipped_out = (clipBounds.top == clipBounds.bottom)
|| (clipBounds.left == clipBounds.right);
if( ! p_vout->p_sys->b_clipped_out )
{
/* ignore consecutive viewport update with identical parameters */
if( memcmp(&clipBounds, &(p_vout->p_sys->clipBounds), sizeof(clipBounds) )
&& memcmp(&viewBounds, &(p_vout->p_sys->viewBounds), sizeof(viewBounds)) )
{
aglLock( p_vout );
aglSetViewport(p_vout, viewBounds, clipBounds);
aglReshape( p_vout );
aglUnlock( p_vout );
p_vout->p_sys->clipBounds = clipBounds;
p_vout->p_sys->viewBounds = viewBounds;
}
}
}
return VLC_SUCCESS;
}
case VOUT_REDRAW_RECT:
{
vout_thread_t * p_parent;
Rect areaBounds;
areaBounds.top = va_arg( args, int);
areaBounds.left = va_arg( args, int);
areaBounds.bottom = va_arg( args, int);
areaBounds.right = va_arg( args, int);
/* Ask the opengl module to redraw */
p_parent = (vout_thread_t *)
p
_
vout
->
p
_
parent
;
if
(
p
_
parent
&&
p
_
parent
->
pf
_
display
)
{
p
_
parent
->
pf
_
display
(
p
_
parent
,
NULL
)
;
}
return
VLC
_
SUCCESS
;
}
case
VOUT
_
REPARENT
:
{
AGLDrawable
drawable
=
(
AGLDrawable
)
va
_
arg
(
args
,
int
)
;
if
(
!
p
_
vout
->
b
_
fullscreen
&&
drawable
!=
p
_
vout
->
p
_
sys
->
agl
_
drawable
)
{
p
_
vout
->
p
_
sys
->
agl
_
drawable
=
drawable
;
aglSetDrawable
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
drawable
)
;
}
return
VLC
_
SUCCESS
;
}
default
:
return
vout
_
vaControlDefault
(
p
_
vout
,
i
_
query
,
args
)
;
}
}
void
aglSwap
(
vout
_
thread
_
t
*
p
_
vout
)
{
if
(
!
p
_
vout
->
p
_
sys
->
b
_
clipped
_
out
)
{
p
_
vout
->
p
_
sys
->
b
_
got
_
frame
=
VLC
_
TRUE
;
aglSwapBuffers
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
)
;
}
else
{
/*
drop
frame
*/
glFlush
()
;
}
}
/*
Enter
this
function
with
the
p
_
vout
locked
*/
static
void
aglSetViewport
(
vout
_
thread
_
t
*
p
_
vout
,
Rect
viewBounds
,
Rect
clipBounds
)
{
//
mozilla
plugin
provides
coordinates
based
on
port
bounds
//
however
AGL
coordinates
are
based
on
window
structure
region
//
and
are
vertically
flipped
GLint
rect
[
4
]
;
CGrafPtr
port
=
(
CGrafPtr
)
p
_
vout
->
p
_
sys
->
agl
_
drawable
;
Rect
winBounds
,
clientBounds
;
GetWindowBounds
(
GetWindowFromPort
(
port
)
,
kWindowStructureRgn
,
&
winBounds
)
;
GetWindowBounds
(
GetWindowFromPort
(
port
)
,
kWindowContentRgn
,
&
clientBounds
)
;
/*
update
video
clipping
bounds
in
drawable
*/
rect
[
0
]
=
(
clientBounds
.
left
-
winBounds
.
left
)
+
clipBounds
.
left
;
//
from
window
left
edge
rect
[
1
]
=
(
winBounds
.
bottom
-
winBounds
.
top
)
-
(
clientBounds
.
top
-
winBounds
.
top
)
-
clipBounds
.
bottom
;
//
from
window
bottom
edge
rect
[
2
]
=
clipBounds
.
right
-
clipBounds
.
left
;
//
width
rect
[
3
]
=
clipBounds
.
bottom
-
clipBounds
.
top
;
//
height
aglSetInteger
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
AGL
_
BUFFER
_
RECT
,
rect
)
;
aglEnable
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
AGL
_
BUFFER
_
RECT
)
;
/*
update
video
internal
bounds
in
drawable
*/
p
_
vout
->
p
_
sys
->
i
_
width
=
viewBounds
.
right
-
viewBounds
.
left
;
p
_
vout
->
p
_
sys
->
i
_
height
=
viewBounds
.
bottom
-
viewBounds
.
top
;
p
_
vout
->
p
_
sys
->
i
_
offx
=
-
clipBounds
.
left
-
viewBounds
.
left
;
p
_
vout
->
p
_
sys
->
i
_
offy
=
clipBounds
.
bottom
+
viewBounds
.
top
-
p
_
vout
->
p
_
sys
->
i
_
height
;
aglUpdateContext
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
)
;
}
//
default
window
event
handler
static
pascal
OSStatus
WindowEventHandler
(
EventHandlerCallRef
nextHandler
,
EventRef
event
,
void
*
userData
)
{
OSStatus
result
=
noErr
;
UInt32
class
=
GetEventClass
(
event
)
;
UInt32
kind
=
GetEventKind
(
event
)
;
vout
_
thread
_
t
*
p
_
vout
=
(
vout
_
thread
_
t
*
)
userData
;
result
=
CallNextEventHandler
(
nextHandler
,
event
)
;
if
(
class
==
kEventClassCommand
)
{
HICommand
theHICommand
;
GetEventParameter
(
event
,
kEventParamDirectObject
,
typeHICommand
,
NULL
,
sizeof
(
HICommand
)
,
NULL
,
&
theHICommand
)
;
switch
(
theHICommand
.
commandID
)
{
default
:
result
=
eventNotHandledErr
;
}
}
else
if
(
class
==
kEventClassWindow
)
{
WindowRef
window
;
Rect
rectPort
=
{
0
,
0
,
0
,
0
}
;
GetEventParameter
(
event
,
kEventParamDirectObject
,
typeWindowRef
,
NULL
,
sizeof
(
WindowRef
)
,
NULL
,
&
window
)
;
if
(
window
)
{
GetPortBounds
(
GetWindowPort
(
window
)
,
&
rectPort
)
;
}
switch
(
kind
)
{
case
kEventWindowClosed
:
case
kEventWindowZoomed
:
case
kEventWindowBoundsChanged
:
break
;
default
:
result
=
eventNotHandledErr
;
}
}
else
if
(
class
==
kEventClassMouse
)
{
switch
(
kind
)
{
case
kEventMouseDown
:
{
UInt16
button
;
GetEventParameter
(
event
,
kEventParamMouseButton
,
typeMouseButton
,
NULL
,
sizeof
(
button
)
,
NULL
,
&
button
)
;
switch
(
button
)
{
case
kEventMouseButtonPrimary
:
{
vlc
_
value
_
t
val
;
var
_
Get
(
p
_
vout
,
"mouse-button-down"
,
&
val
)
;
val
.
i
_
int
|=
1
;
var
_
Set
(
p
_
vout
,
"mouse-button-down"
,
val
)
;
break
;
}
case
kEventMouseButtonSecondary
:
{
vlc
_
value
_
t
val
;
var
_
Get
(
p
_
vout
,
"mouse-button-down"
,
&
val
)
;
val
.
i
_
int
|=
2
;
var
_
Set
(
p
_
vout
,
"mouse-button-down"
,
val
)
;
break
;
}
case
kEventMouseButtonTertiary
:
{
vlc
_
value
_
t
val
;
var
_
Get
(
p
_
vout
,
"mouse-button-down"
,
&
val
)
;
val
.
i
_
int
|=
4
;
var
_
Set
(
p
_
vout
,
"mouse-button-down"
,
val
)
;
break
;
}
default
:
result
=
eventNotHandledErr
;
}
break
;
}
case
kEventMouseUp
:
{
UInt16
button
;
GetEventParameter
(
event
,
kEventParamMouseButton
,
typeMouseButton
,
NULL
,
sizeof
(
button
)
,
NULL
,
&
button
)
;
switch
(
button
)
{
case
kEventMouseButtonPrimary
:
{
UInt32
clickCount
=
0
;
GetEventParameter
(
event
,
kEventParamClickCount
,
typeUInt32
,
NULL
,
sizeof
(
clickCount
)
,
NULL
,
&
clickCount
)
;
if
(
clickCount
>
1
)
{
vlc
_
value
_
t
val
;
val
.
b
_
bool
=
VLC
_
FALSE
;
var
_
Set
((
vout
_
thread
_
t
*
)
p
_
vout
->
p
_
parent
,
"fullscreen"
,
val
)
;
}
else
{
vlc
_
value
_
t
val
;
val
.
b
_
bool
=
VLC
_
TRUE
;
var
_
Set
(
p
_
vout
,
"mouse-clicked"
,
val
)
;
var
_
Get
(
p
_
vout
,
"mouse-button-down"
,
&
val
)
;
val
.
i
_
int
&=
~
1
;
var
_
Set
(
p
_
vout
,
"mouse-button-down"
,
val
)
;
}
break
;
}
case
kEventMouseButtonSecondary
:
{
vlc
_
value
_
t
val
;
var
_
Get
(
p
_
vout
,
"mouse-button-down"
,
&
val
)
;
val
.
i
_
int
&=
~
2
;
var
_
Set
(
p
_
vout
,
"mouse-button-down"
,
val
)
;
break
;
}
case
kEventMouseButtonTertiary
:
{
vlc
_
value
_
t
val
;
var
_
Get
(
p
_
vout
,
"mouse-button-down"
,
&
val
)
;
val
.
i
_
int
&=
~
2
;
var
_
Set
(
p
_
vout
,
"mouse-button-down"
,
val
)
;
break
;
}
default
:
result
=
eventNotHandledErr
;
}
break
;
}
case
kEventMouseMoved
:
{
Point
ml
;
vlc
_
value
_
t
val
;
unsigned
int
i
_
x
,
i
_
y
;
unsigned
int
i
_
height
=
p
_
vout
->
p
_
sys
->
i
_
height
;
unsigned
int
i
_
width
=
p
_
vout
->
p
_
sys
->
i
_
width
;
vout
_
PlacePicture
(
p
_
vout
,
i
_
width
,
i
_
height
,
&
i
_
x
,
&
i
_
y
,
&
i
_
width
,
&
i
_
height
)
;
GetEventParameter
(
event
,
kEventParamWindowMouseLocation
,
typeQDPoint
,
NULL
,
sizeof
(
Point
)
,
NULL
,
&
ml
)
;
val
.
i
_
int
=
(
((
int
)
ml
.
h
)
-
i
_
x
)
*
p
_
vout
->
render
.
i
_
width
/
i
_
width
;
var
_
Set
(
p
_
vout
,
"mouse-x"
,
val
)
;
val
.
i
_
int
=
(
((
int
)
ml
.
v
)
-
i
_
y
)
*
p
_
vout
->
render
.
i
_
height
/
i
_
height
;
var
_
Set
(
p
_
vout
,
"mouse-y"
,
val
)
;
val
.
b
_
bool
=
VLC
_
TRUE
;
var
_
Set
(
p
_
vout
,
"mouse-moved"
,
val
)
;
break
;
}
default
:
result
=
eventNotHandledErr
;
}
}
else
if
(
class
==
kEventClassTextInput
)
{
switch
(
kind
)
{
case
kEventTextInputUnicodeForKeyEvent
:
{
break
;
}
default
:
result
=
eventNotHandledErr
;
}
}
else
if
(
class
==
kEventClassVLCPlugin
)
{
switch
(
kind
)
{
case
kEventVLCPluginShowFullscreen
:
ShowWindow
(
p
_
vout
->
p
_
sys
->
theWindow
)
;
SetSystemUIMode
(
kUIModeAllHidden
,
kUIOptionAutoShowMenuBar
)
;
//
CGDisplayHideCursor
(
kCGDirectMainDisplay
)
;
break
;
case
kEventVLCPluginHideFullscreen
:
HideWindow
(
p
_
vout
->
p
_
sys
->
theWindow
)
;
SetSystemUIMode
(
kUIModeNormal
,
0
)
;
CGDisplayShowCursor
(
kCGDirectMainDisplay
)
;
break
;
default
:
result
=
eventNotHandledErr
;
break
;
}
}
return
result
;
}
int
aglLock
(
vout
_
thread
_
t
*
p
_
vout
)
{
#ifdef
__
ppc
__
/*
*
before
10.4
,
we
set
the
AGL
context
as
current
and
*
then
we
retrieve
and
use
the
matching
CGL
context
*/
aglSetCurrentContext
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
)
;
return
kCGLNoError
!=
CGLLockContext
(
CGLGetCurrentContext
()
)
;
#else
/*
since
10.4
,
this
is
the
safe
way
to
get
the
underlying
CGL
context
*/
CGLContextObj
cglContext
;
if
(
aglGetCGLContext
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
(
void
**
)
&
cglContext
)
)
{
if
(
kCGLNoError
==
CGLLockContext
(
cglContext
)
)
{
aglSetCurrentContext
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
)
;
return
0
;
}
}
return
1
;
#endif
}
void
aglUnlock
(
vout
_
thread
_
t
*
p
_
vout
)
{
#ifdef
__
ppc
__
/*
*
before
10.4
,
we
assume
that
the
AGL
context
is
current
.
*
therefore
,
we
use
the
current
CGL
context
*/
CGLUnlockContext
(
CGLGetCurrentContext
()
)
;
#else
/*
since
10.4
,
this
is
the
safe
way
to
get
the
underlying
CGL
context
*/
CGLContextObj
cglContext
;
if
(
aglGetCGLContext
(
p
_
vout
->
p
_
sys
->
agl
_
ctx
,
(
void
**
)
&
cglContext
)
)
{
CGLUnlockContext
(
cglContext
)
;
}
#endif
}
modules/gui/minimal_macosx/voutgl.h
0 → 100644
View file @
437d8150
/*****************************************************************************
* voutgl.h: MacOS X OpenGL provider
*****************************************************************************
* Copyright (C) 2001-2006 the VideoLAN team
* $Id$
*
* Authors: Colin Delacroix <colin@zoy.org>
* Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
* Eric Petit <titer@m0k.org>
* Benjamin Pracht <bigben at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Cocoa/Cocoa.h>
#import "VLCOpenGLVoutView.h"
#import "voutagl.h"
struct
vout_sys_t
{
NSAutoreleasePool
*
o_pool
;
VLCOpenGLVoutView
*
o_glview
;
vlc_bool_t
b_saved_frame
;
NSRect
s_frame
;
vlc_bool_t
b_got_frame
;
/* Mozilla plugin-related variables */
vlc_bool_t
b_embedded
;
AGLContext
agl_ctx
;
AGLDrawable
agl_drawable
;
int
i_offx
,
i_offy
;
int
i_width
,
i_height
;
WindowRef
theWindow
;
WindowGroupRef
winGroup
;
vlc_bool_t
b_clipped_out
;
Rect
clipBounds
,
viewBounds
;
};
modules/gui/minimal_macosx/voutgl.m
0 → 100644
View file @
437d8150
/*****************************************************************************
* voutgl.m: MacOS X OpenGL provider
*****************************************************************************
* Copyright (C) 2001-2004 the VideoLAN team
* $Id$
*
* Authors: Colin Delacroix
<colin
@
zoy
.
org
>
* Florian G. Pflug
<fgp
@
phlo
.
org
>
* Jon Lech Johansen
<jon-vl
@
nanocrew
.
net
>
* Derk-Jan Hartman
<hartman
at
videolan
dot
org
>
* Eric Petit
<titer
@
m0k
.
org
>
* Benjamin Pracht
<bigben
at
videolan
dot
org
>
* Damien Fouilleul
<damienf
at
videolan
dot
org
>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include "intf.h"
#include "voutgl.h"
int E_(OpenVideoGL) ( vlc_object_t * p_this )
{
vout_thread_t * p_vout = (vout_thread_t *) p_this;
vlc_value_t value_drawable;
if( !CGDisplayUsesOpenGLAcceleration( kCGDirectMainDisplay ) )
{
msg_Warn( p_vout, "no OpenGL hardware acceleration found. "
"Video display will be slow" );
return( 1 );
}
msg_Dbg( p_vout, "display is Quartz Extreme accelerated" );
p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
if( p_vout->p_sys == NULL )
{
msg_Err( p_vout, "out of memory" );
return( 1 );
}
memset( p_vout->p_sys, 0, sizeof( vout_sys_t ) );
var_Get( p_vout->p_libvlc, "drawable",
&
value_drawable );
if( 0 /* Are we in the mozilla plugin ? XXX: get that from drawable */ )
{
p_vout->pf_init = aglInit;
p_vout->pf_end = aglEnd;
p_vout->pf_manage = aglManage;
p_vout->pf_control = aglControl;
p_vout->pf_swap = aglSwap;
p_vout->pf_lock = aglLock;
p_vout->pf_unlock = aglUnlock;
}
else
{
/* Let's use the VLCOpenGLVoutView.m class */
p_vout->pf_init = cocoaglvoutviewInit;
p_vout->pf_end = cocoaglvoutviewEnd;
p_vout->pf_manage = cocoaglvoutviewManage;
p_vout->pf_control= cocoaglvoutviewControl;
p_vout->pf_swap = cocoaglvoutviewSwap;
p_vout->pf_lock = cocoaglvoutviewLock;
p_vout->pf_unlock = cocoaglvoutviewUnlock;
}
p_vout->p_sys->b_got_frame = VLC_FALSE;
return VLC_SUCCESS;
}
void E_(CloseVideoGL) ( vlc_object_t * p_this )
{
vout_thread_t * p_vout = (vout_thread_t *) p_this;
/* Clean up */
free( p_vout->p_sys );
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment