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
fa78d3b3
Commit
fa78d3b3
authored
Sep 17, 2008
by
Pierre d'Herbemont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
macosx: Remove the deprecated quickdraw vout.
parent
bf5cbff5
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
0 additions
and
914 deletions
+0
-914
modules/gui/macosx/Modules.am
modules/gui/macosx/Modules.am
+0
-1
modules/gui/macosx/macosx.m
modules/gui/macosx/macosx.m
+0
-20
modules/gui/macosx/voutqt.m
modules/gui/macosx/voutqt.m
+0
-893
No files found.
modules/gui/macosx/Modules.am
View file @
fa78d3b3
...
...
@@ -38,7 +38,6 @@ SOURCES_macosx = \
update.m \
update.h \
vout.m \
voutqt.m \
voutgl.m \
vout.h \
wizard.h \
...
...
modules/gui/macosx/macosx.m
View file @
fa78d3b3
...
...
@@ -43,9 +43,6 @@
int OpenIntf ( vlc_object_t * );
void CloseIntf ( vlc_object_t * );
int OpenVideoQT ( vlc_object_t * );
void CloseVideoQT ( vlc_object_t * );
int OpenVideoGL ( vlc_object_t * );
void CloseVideoGL ( vlc_object_t * );
...
...
@@ -105,23 +102,6 @@ vlc_module_begin();
add_bool( "macosx-fspanel", 1, NULL, FSPANEL_TEXT, FSPANEL_LONGTEXT,
false );
add_submodule();
set_description( N_("Quartz video") );
set_capability( "video output", 100 );
set_category( CAT_VIDEO);
set_subcategory( SUBCAT_VIDEO_VOUT );
set_callbacks( OpenVideoQT, CloseVideoQT );
add_integer( "macosx-vdev", 0, NULL, VDEV_TEXT, VDEV_LONGTEXT,
false );
add_bool( "macosx-stretch", 0, NULL, STRETCH_TEXT, STRETCH_LONGTEXT,
false );
add_float_with_range( "macosx-opaqueness", 1, 0, 1, NULL,
OPAQUENESS_TEXT, OPAQUENESS_LONGTEXT, true );
add_bool( "macosx-black", 1, NULL, BLACK_TEXT, BLACK_LONGTEXT,
false );
add_bool( "macosx-background", 0, NULL, BACKGROUND_TEXT, BACKGROUND_LONGTEXT,
false );
add_submodule();
set_description( "Mac OS X OpenGL" );
set_capability( "opengl provider", 100 );
...
...
modules/gui/macosx/voutqt.m
deleted
100644 → 0
View file @
bf5cbff5
/*****************************************************************************
* vout.m: MacOS X video output module
*****************************************************************************
* Copyright (C) 2001-2007 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>
*
* 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>
/* free() */
#include <string.h>
#include <assert.h>
#include <QuickTime/QuickTime.h>
#include <vlc_keys.h>
#include "intf.h"
#include "vout.h"
#define QT_MAX_DIRECTBUFFERS 10
#define VL_MAX_DISPLAYS 16
/*****************************************************************************
* VLCView interface
*****************************************************************************/
@interface
VLCQTView
:
NSQuickDrawView
<
VLCVoutViewResetting
>
{
vout_thread_t
*
p_vout
;
}
+
(
void
)
resetVout
:
(
vout_thread_t
*
)
p_vout
;
-
(
id
)
initWithVout
:(
vout_thread_t
*
)
p_vout
;
@end
struct
vout_sys_t
{
NSAutoreleasePool
*
o_pool
;
VLCQTView
*
o_qtview
;
VLCVoutView
*
o_vout_view
;
bool
b_saved_frame
;
bool
b_cpu_has_simd
;
/* does CPU supports Altivec, MMX, etc... */
NSRect
s_frame
;
CodecType
i_codec
;
CGrafPtr
p_qdport
;
ImageSequence
i_seq
;
MatrixRecordPtr
p_matrix
;
DecompressorComponent
img_dc
;
ImageDescriptionHandle
h_img_descr
;
/* video geometry in port */
int
i_origx
,
i_origy
;
int
i_width
,
i_height
;
/* Mozilla plugin-related variables */
bool
b_embedded
;
RgnHandle
clip_mask
;
};
struct
picture_sys_t
{
void
*
p_data
;
unsigned
int
i_size
;
/* When using I420 output */
PlanarPixmapInfoYUV420
pixmap_i420
;
};
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
InitVideo
(
vout_thread_t
*
);
static
void
EndVideo
(
vout_thread_t
*
);
static
int
ManageVideo
(
vout_thread_t
*
);
static
void
DisplayVideo
(
vout_thread_t
*
,
picture_t
*
);
static
int
ControlVideo
(
vout_thread_t
*
,
int
,
va_list
);
static
int
CoToggleFullscreen
(
vout_thread_t
*
p_vout
);
static
int
DrawableRedraw
(
vlc_object_t
*
p_this
,
const
char
*
psz_name
,
vlc_value_t
oval
,
vlc_value_t
nval
,
void
*
param
);
static
void
UpdateEmbeddedGeometry
(
vout_thread_t
*
p_vout
);
static
void
QTScaleMatrix
(
vout_thread_t
*
);
static
int
QTCreateSequence
(
vout_thread_t
*
);
static
void
QTDestroySequence
(
vout_thread_t
*
);
static
int
QTNewPicture
(
vout_thread_t
*
,
picture_t
*
);
static
void
QTFreePicture
(
vout_thread_t
*
,
picture_t
*
);
/*****************************************************************************
* OpenVideo: allocates MacOS X video thread output method
*****************************************************************************
* This function allocates and initializes a MacOS X vout method.
*****************************************************************************/
int
OpenVideoQT
(
vlc_object_t
*
p_this
)
{
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
OSErr
err
;
vlc_value_t
value_drawable
;
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
)
);
p_vout
->
p_sys
->
o_pool
=
[[
NSAutoreleasePool
alloc
]
init
];
p_vout
->
pf_init
=
InitVideo
;
p_vout
->
pf_end
=
EndVideo
;
p_vout
->
pf_manage
=
ManageVideo
;
p_vout
->
pf_render
=
NULL
;
p_vout
->
pf_display
=
DisplayVideo
;
p_vout
->
pf_control
=
ControlVideo
;
/* Are we embedded? If so, the drawable value will be a pointer to a
* CGrafPtr that we're expected to use */
var_Get
(
p_vout
->
p_libvlc
,
"drawable"
,
&
value_drawable
);
if
(
value_drawable
.
i_int
!=
0
)
p_vout
->
p_sys
->
b_embedded
=
true
;
else
p_vout
->
p_sys
->
b_embedded
=
false
;
p_vout
->
p_sys
->
b_cpu_has_simd
=
vlc_CPU
()
&
(
CPU_CAPABILITY_ALTIVEC
|
CPU_CAPABILITY_MMXEXT
);
msg_Dbg
(
p_vout
,
"we do%s have SIMD enabled CPU"
,
p_vout
->
p_sys
->
b_cpu_has_simd
?
""
:
"n't"
);
/* Initialize QuickTime */
p_vout
->
p_sys
->
h_img_descr
=
(
ImageDescriptionHandle
)
NewHandleClear
(
sizeof
(
ImageDescription
)
);
p_vout
->
p_sys
->
p_matrix
=
(
MatrixRecordPtr
)
malloc
(
sizeof
(
MatrixRecord
)
);
if
(
(
err
=
EnterMovies
()
)
!=
noErr
)
{
msg_Err
(
p_vout
,
"QT initialization failed: EnterMovies failed: %d"
,
err
);
free
(
p_vout
->
p_sys
->
p_matrix
);
DisposeHandle
(
(
Handle
)
p_vout
->
p_sys
->
h_img_descr
);
free
(
p_vout
->
p_sys
);
return
VLC_EGENERIC
;
}
/* Damn QT isn't thread safe, so keep a process-wide lock */
vlc_mutex_t
*
p_qtlock
=
var_AcquireMutex
(
"quicktime_mutex"
);
/* Can we find the right chroma ? */
if
(
p_vout
->
p_sys
->
b_cpu_has_simd
)
{
err
=
FindCodec
(
kYUVSPixelFormat
,
bestSpeedCodec
,
nil
,
&
p_vout
->
p_sys
->
img_dc
);
}
else
{
err
=
FindCodec
(
kYUV420CodecType
,
bestSpeedCodec
,
nil
,
&
p_vout
->
p_sys
->
img_dc
);
}
vlc_mutex_unlock
(
p_qtlock
);
if
(
err
==
noErr
&&
p_vout
->
p_sys
->
img_dc
!=
0
)
{
if
(
p_vout
->
p_sys
->
b_cpu_has_simd
)
{
p_vout
->
output
.
i_chroma
=
VLC_FOURCC
(
'Y'
,
'U'
,
'Y'
,
'2'
);
p_vout
->
p_sys
->
i_codec
=
kYUVSPixelFormat
;
}
else
{
p_vout
->
output
.
i_chroma
=
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
);
p_vout
->
p_sys
->
i_codec
=
kYUV420CodecType
;
}
}
else
{
msg_Err
(
p_vout
,
"QT doesn't support any appropriate chroma"
);
}
if
(
p_vout
->
p_sys
->
img_dc
==
0
)
{
free
(
p_vout
->
p_sys
->
p_matrix
);
DisposeHandle
(
(
Handle
)
p_vout
->
p_sys
->
h_img_descr
);
free
(
p_vout
->
p_sys
);
return
VLC_EGENERIC
;
}
if
(
p_vout
->
b_fullscreen
||
!
p_vout
->
p_sys
->
b_embedded
)
{
/* Spawn window */
#define o_qtview p_vout->p_sys->o_qtview
o_qtview
=
[[
VLCQTView
alloc
]
initWithVout
:
p_vout
];
[
o_qtview
autorelease
];
p_vout
->
p_sys
->
o_vout_view
=
[
VLCVoutView
getVoutView
:
p_vout
subView:
o_qtview
frame
:
nil
];
if
(
!
p_vout
->
p_sys
->
o_vout_view
)
{
return
VLC_EGENERIC
;
}
[
o_qtview
lockFocus
];
p_vout
->
p_sys
->
p_qdport
=
[
o_qtview
qdPort
];
[
o_qtview
unlockFocus
];
}
#undef o_qtview
return
VLC_SUCCESS
;
}
/*****************************************************************************
* CloseVideo: destroy video thread output method
*****************************************************************************/
void
CloseVideoQT
(
vlc_object_t
*
p_this
)
{
NSAutoreleasePool
*
o_pool
=
[[
NSAutoreleasePool
alloc
]
init
];
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
if
(
p_vout
->
b_fullscreen
||
!
p_vout
->
p_sys
->
b_embedded
)
[
p_vout
->
p_sys
->
o_vout_view
closeVout
];
/* Clean Up Quicktime environment */
ExitMovies
();
free
(
p_vout
->
p_sys
->
p_matrix
);
DisposeHandle
(
(
Handle
)
p_vout
->
p_sys
->
h_img_descr
);
[
o_pool
release
];
free
(
p_vout
->
p_sys
);
}
/*****************************************************************************
* InitVideo: initialize video thread output method
*****************************************************************************/
static
int
InitVideo
(
vout_thread_t
*
p_vout
)
{
picture_t
*
p_pic
;
int
i_index
;
I_OUTPUTPICTURES
=
0
;
/* Initialize the output structure; we already found a codec,
* and the corresponding chroma we will be using. Since we can
* arbitrary scale, stick to the coordinates and aspect. */
p_vout
->
output
.
i_width
=
p_vout
->
render
.
i_width
;
p_vout
->
output
.
i_height
=
p_vout
->
render
.
i_height
;
p_vout
->
output
.
i_aspect
=
p_vout
->
render
.
i_aspect
;
if
(
p_vout
->
b_fullscreen
||
!
p_vout
->
p_sys
->
b_embedded
)
{
Rect
s_rect
;
p_vout
->
p_sys
->
clip_mask
=
NULL
;
GetPortBounds
(
p_vout
->
p_sys
->
p_qdport
,
&
s_rect
);
p_vout
->
p_sys
->
i_origx
=
s_rect
.
left
;
p_vout
->
p_sys
->
i_origy
=
s_rect
.
top
;
p_vout
->
p_sys
->
i_width
=
s_rect
.
right
-
s_rect
.
left
;
p_vout
->
p_sys
->
i_height
=
s_rect
.
bottom
-
s_rect
.
top
;
}
else
{
/* As we are embedded (e.g. running as a Mozilla plugin), use the pointer
* stored in the "drawable" value as the CGrafPtr for the QuickDraw
* graphics port */
/* Create the clipping mask */
p_vout
->
p_sys
->
clip_mask
=
NewRgn
();
UpdateEmbeddedGeometry
(
p_vout
);
var_AddCallback
(
p_vout
->
p_libvlc
,
"drawableredraw"
,
DrawableRedraw
,
p_vout
);
}
QTScaleMatrix
(
p_vout
);
if
(
QTCreateSequence
(
p_vout
)
)
{
msg_Err
(
p_vout
,
"unable to initialize QT: QTCreateSequence failed"
);
return
(
1
);
}
/* Try to initialize up to QT_MAX_DIRECTBUFFERS direct buffers */
while
(
I_OUTPUTPICTURES
<
QT_MAX_DIRECTBUFFERS
)
{
p_pic
=
NULL
;
/* Find an empty picture slot */
for
(
i_index
=
0
;
i_index
<
VOUT_MAX_PICTURES
;
i_index
++
)
{
if
(
p_vout
->
p_picture
[
i_index
].
i_status
==
FREE_PICTURE
)
{
p_pic
=
p_vout
->
p_picture
+
i_index
;
break
;
}
}
/* Allocate the picture */
if
(
p_pic
==
NULL
||
QTNewPicture
(
p_vout
,
p_pic
)
)
{
break
;
}
p_pic
->
i_status
=
DESTROYED_PICTURE
;
p_pic
->
i_type
=
DIRECT_PICTURE
;
PP_OUTPUTPICTURE
[
I_OUTPUTPICTURES
]
=
p_pic
;
I_OUTPUTPICTURES
++
;
}
return
0
;
}
/*****************************************************************************
* EndVideo: terminate video thread output method
*****************************************************************************/
static
void
EndVideo
(
vout_thread_t
*
p_vout
)
{
int
i_index
;
QTDestroySequence
(
p_vout
);
if
(
!
p_vout
->
b_fullscreen
&&
p_vout
->
p_sys
->
b_embedded
)
{
var_DelCallback
(
p_vout
->
p_libvlc
,
"drawableredraw"
,
DrawableRedraw
,
p_vout
);
DisposeRgn
(
p_vout
->
p_sys
->
clip_mask
);
}
/* Free the direct buffers we allocated */
for
(
i_index
=
I_OUTPUTPICTURES
;
i_index
;
)
{
i_index
--
;
QTFreePicture
(
p_vout
,
PP_OUTPUTPICTURE
[
i_index
]
);
}
}
/*****************************************************************************
* ManageVideo: handle events
*****************************************************************************
* This function should be called regularly by video output thread. It manages
* console events. It returns a non null value on error.
*****************************************************************************/
static
int
ManageVideo
(
vout_thread_t
*
p_vout
)
{
if
(
p_vout
->
i_changes
&
VOUT_FULLSCREEN_CHANGE
)
{
if
(
CoToggleFullscreen
(
p_vout
)
)
{
return
(
1
);
}
p_vout
->
i_changes
&=
~
VOUT_FULLSCREEN_CHANGE
;
}
if
(
p_vout
->
i_changes
&
VOUT_SIZE_CHANGE
)
{
if
(
p_vout
->
b_fullscreen
||
!
p_vout
->
p_sys
->
b_embedded
)
{
/* get the geometry from NSQuickDrawView */
Rect
s_rect
;
GetPortBounds
(
p_vout
->
p_sys
->
p_qdport
,
&
s_rect
);
p_vout
->
p_sys
->
i_origx
=
s_rect
.
left
;
p_vout
->
p_sys
->
i_origy
=
s_rect
.
top
;
p_vout
->
p_sys
->
i_width
=
s_rect
.
right
-
s_rect
.
left
;
p_vout
->
p_sys
->
i_height
=
s_rect
.
bottom
-
s_rect
.
top
;
}
else
{
/* As we're embedded, get the geometry from Mozilla/Safari NPWindow object */
UpdateEmbeddedGeometry
(
p_vout
);
SetDSequenceMask
(
p_vout
->
p_sys
->
i_seq
,
p_vout
->
p_sys
->
clip_mask
);
}
}
if
(
p_vout
->
i_changes
&
VOUT_SIZE_CHANGE
||
p_vout
->
i_changes
&
VOUT_ASPECT_CHANGE
)
{
QTScaleMatrix
(
p_vout
);
SetDSequenceMatrix
(
p_vout
->
p_sys
->
i_seq
,
p_vout
->
p_sys
->
p_matrix
);
}
if
(
p_vout
->
i_changes
&
VOUT_SIZE_CHANGE
)
{
p_vout
->
i_changes
&=
~
VOUT_SIZE_CHANGE
;
}
if
(
p_vout
->
i_changes
&
VOUT_ASPECT_CHANGE
)
{
p_vout
->
i_changes
&=
~
VOUT_ASPECT_CHANGE
;
}
// can be nil
[
p_vout
->
p_sys
->
o_vout_view
manage
];
return
(
0
);
}
/*****************************************************************************
* vout_Display: displays previously rendered output
*****************************************************************************
* This function sends the currently rendered image to the display.
*****************************************************************************/
static
void
DisplayVideo
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
OSErr
err
;
CodecFlags
flags
;
if
(
(
NULL
==
p_vout
->
p_sys
->
clip_mask
)
||
!
EmptyRgn
(
p_vout
->
p_sys
->
clip_mask
)
)
{
//CGrafPtr oldPort;
//Rect oldBounds;
/* since there is not way to lock a QuickDraw port for exclusive use
there is a potential problem that the frame will be displayed
in the wrong place if other embedded plugins redraws as the port
origin may be changed */
//GetPort(&oldPort);
//GetPortBounds(p_vout->p_sys->p_qdport, &oldBounds);
SetPort
(
p_vout
->
p_sys
->
p_qdport
);
SetOrigin
(
p_vout
->
p_sys
->
i_origx
,
p_vout
->
p_sys
->
i_origy
);
if
(
(
err
=
DecompressSequenceFrameWhen
(
p_vout
->
p_sys
->
i_seq
,
p_pic
->
p_sys
->
p_data
,
p_pic
->
p_sys
->
i_size
,
codecFlagUseImageBuffer
,
&
flags
,
NULL
,
NULL
)
==
noErr
)
)
{
QDFlushPortBuffer
(
p_vout
->
p_sys
->
p_qdport
,
p_vout
->
p_sys
->
clip_mask
);
//QDFlushPortBuffer( p_vout->p_sys->p_qdport, NULL );
}
else
{
msg_Warn
(
p_vout
,
"QT failed to display the frame sequence: %d"
,
err
);
}
//SetPortBounds(p_vout->p_sys->p_qdport, &oldBounds);
//SetPort(oldPort);
}
}
/*****************************************************************************
* ControlVideo: control facility for the vout
*****************************************************************************/
static
int
ControlVideo
(
vout_thread_t
*
p_vout
,
int
i_query
,
va_list
args
)
{
bool
b_arg
;
switch
(
i_query
)
{
case
VOUT_SET_STAY_ON_TOP
:
b_arg
=
(
bool
)
va_arg
(
args
,
int
);
[
p_vout
->
p_sys
->
o_vout_view
setOnTop
:
b_arg
];
return
VLC_SUCCESS
;
case
VOUT_CLOSE
:
case
VOUT_REPARENT
:
default:
return
vout_vaControlDefault
(
p_vout
,
i_query
,
args
);
}
}
/*****************************************************************************
* CoToggleFullscreen: toggle fullscreen
*****************************************************************************
* Returns 0 on success, 1 otherwise
*****************************************************************************/
static
int
CoToggleFullscreen
(
vout_thread_t
*
p_vout
)
{
NSAutoreleasePool
*
o_pool
=
[[
NSAutoreleasePool
alloc
]
init
];
p_vout
->
b_fullscreen
=
!
p_vout
->
b_fullscreen
;
if
(
p_vout
->
b_fullscreen
)
[
p_vout
->
p_sys
->
o_vout_view
enterFullscreen
];
else
[
p_vout
->
p_sys
->
o_vout_view
leaveFullscreen
];
[
o_pool
release
];
return
0
;
}
/* If we're embedded, the application is expected to indicate a
* window change (move/resize/etc) via the "drawableredraw" value.
* If that's the case, set the VOUT_SIZE_CHANGE flag so we do
* actually handle the window change. */
static
int
DrawableRedraw
(
vlc_object_t
*
p_this
,
const
char
*
psz_name
,
vlc_value_t
oval
,
vlc_value_t
nval
,
void
*
param
)
{
/* ignore changes until we are ready for them */
if
(
(
oval
.
i_int
!=
nval
.
i_int
)
&&
(
nval
.
i_int
==
1
)
)
{
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
param
;
/* prevent QT from rendering any more video until we have updated
the geometry */
SetEmptyRgn
(
p_vout
->
p_sys
->
clip_mask
);
SetDSequenceMask
(
p_vout
->
p_sys
->
i_seq
,
p_vout
->
p_sys
->
clip_mask
);
p_vout
->
i_changes
|=
VOUT_SIZE_CHANGE
;
}
return
VLC_SUCCESS
;
}
/* Embedded video get their drawing region from the host application
* by the drawable values here. Read those variables, and store them
* in the p_vout->p_sys structure so that other functions (such as
* DisplayVideo and ManageVideo) can use them later. */
static
void
UpdateEmbeddedGeometry
(
vout_thread_t
*
p_vout
)
{
vlc_value_t
val
;
vlc_value_t
valt
,
vall
,
valb
,
valr
,
valx
,
valy
,
valw
,
valh
,
valportx
,
valporty
;
var_Get
(
p_vout
->
p_libvlc
,
"drawable"
,
&
val
);
var_Get
(
p_vout
->
p_libvlc
,
"drawablet"
,
&
valt
);
var_Get
(
p_vout
->
p_libvlc
,
"drawablel"
,
&
vall
);
var_Get
(
p_vout
->
p_libvlc
,
"drawableb"
,
&
valb
);
var_Get
(
p_vout
->
p_libvlc
,
"drawabler"
,
&
valr
);
var_Get
(
p_vout
->
p_libvlc
,
"drawablex"
,
&
valx
);
var_Get
(
p_vout
->
p_libvlc
,
"drawabley"
,
&
valy
);
var_Get
(
p_vout
->
p_libvlc
,
"drawablew"
,
&
valw
);
var_Get
(
p_vout
->
p_libvlc
,
"drawableh"
,
&
valh
);
var_Get
(
p_vout
->
p_libvlc
,
"drawableportx"
,
&
valportx
);
var_Get
(
p_vout
->
p_libvlc
,
"drawableporty"
,
&
valporty
);
/* portx, porty contains values for SetOrigin() function
which isn't used, instead use QT Translate matrix */
p_vout
->
p_sys
->
i_origx
=
valportx
.
i_int
;
p_vout
->
p_sys
->
i_origy
=
valporty
.
i_int
;
p_vout
->
p_sys
->
p_qdport
=
(
CGrafPtr
)
val
.
i_int
;
p_vout
->
p_sys
->
i_width
=
valw
.
i_int
;
p_vout
->
p_sys
->
i_height
=
valh
.
i_int
;
/* update video clipping mask */
/*SetRectRgn( p_vout->p_sys->clip_mask , vall.i_int ,
valt.i_int, valr.i_int, valb.i_int );*/
SetRectRgn
(
p_vout
->
p_sys
->
clip_mask
,
vall
.
i_int
+
valportx
.
i_int
,
valt
.
i_int
+
valporty
.
i_int
,
valr
.
i_int
+
valportx
.
i_int
,
valb
.
i_int
+
valporty
.
i_int
);
/* reset drawableredraw variable indicating we are ready
to take changes in video geometry */
val
.
i_int
=
0
;
var_Set
(
p_vout
->
p_libvlc
,
"drawableredraw"
,
val
);
}
/*****************************************************************************
* QTScaleMatrix: scale matrix
*****************************************************************************/
static
void
QTScaleMatrix
(
vout_thread_t
*
p_vout
)
{
vlc_value_t
val
;
Fixed
factor_x
,
factor_y
;
unsigned
int
i_offset_x
=
0
;
unsigned
int
i_offset_y
=
0
;
int
i_width
=
p_vout
->
p_sys
->
i_width
;
int
i_height
=
p_vout
->
p_sys
->
i_height
;
var_Get
(
p_vout
,
"macosx-stretch"
,
&
val
);
if
(
val
.
b_bool
)
{
factor_x
=
FixDiv
(
Long2Fix
(
i_width
),
Long2Fix
(
p_vout
->
output
.
i_width
)
);
factor_y
=
FixDiv
(
Long2Fix
(
i_height
),
Long2Fix
(
p_vout
->
output
.
i_height
)
);
}
else
if
(
i_height
*
p_vout
->
fmt_in
.
i_visible_width
*
p_vout
->
fmt_in
.
i_sar_num
<
i_width
*
p_vout
->
fmt_in
.
i_visible_height
*
p_vout
->
fmt_in
.
i_sar_den
)
{
int
i_adj_width
=
i_height
*
p_vout
->
fmt_in
.
i_visible_width
*
p_vout
->
fmt_in
.
i_sar_num
/
(
p_vout
->
fmt_in
.
i_sar_den
*
p_vout
->
fmt_in
.
i_visible_height
);
factor_x
=
FixDiv
(
Long2Fix
(
i_adj_width
),
Long2Fix
(
p_vout
->
fmt_in
.
i_visible_width
)
);
factor_y
=
FixDiv
(
Long2Fix
(
i_height
),
Long2Fix
(
p_vout
->
fmt_in
.
i_visible_height
)
);
i_offset_x
=
(
i_width
-
i_adj_width
)
/
2
;
}
else
{
int
i_adj_height
=
i_width
*
p_vout
->
fmt_in
.
i_visible_height
*
p_vout
->
fmt_in
.
i_sar_den
/
(
p_vout
->
fmt_in
.
i_sar_num
*
p_vout
->
fmt_in
.
i_visible_width
);
factor_x
=
FixDiv
(
Long2Fix
(
i_width
),
Long2Fix
(
p_vout
->
fmt_in
.
i_visible_width
)
);
factor_y
=
FixDiv
(
Long2Fix
(
i_adj_height
),
Long2Fix
(
p_vout
->
fmt_in
.
i_visible_height
)
);
i_offset_y
=
(
i_height
-
i_adj_height
)
/
2
;
}
SetIdentityMatrix
(
p_vout
->
p_sys
->
p_matrix
);
ScaleMatrix
(
p_vout
->
p_sys
->
p_matrix
,
factor_x
,
factor_y
,
Long2Fix
(
0
),
Long2Fix
(
0
)
);
TranslateMatrix
(
p_vout
->
p_sys
->
p_matrix
,
Long2Fix
(
i_offset_x
),
Long2Fix
(
i_offset_y
)
);
}
/*****************************************************************************
* QTCreateSequence: create a new sequence
*****************************************************************************
* Returns 0 on success, 1 otherwise
*****************************************************************************/
static
int
QTCreateSequence
(
vout_thread_t
*
p_vout
)
{
OSErr
err
;
ImageDescriptionPtr
p_descr
;
HLock
(
(
Handle
)
p_vout
->
p_sys
->
h_img_descr
);
p_descr
=
*
p_vout
->
p_sys
->
h_img_descr
;
p_descr
->
idSize
=
sizeof
(
ImageDescription
);
p_descr
->
cType
=
p_vout
->
p_sys
->
i_codec
;
p_descr
->
version
=
2
;
p_descr
->
revisionLevel
=
0
;
p_descr
->
vendor
=
'
mpla
'
;
p_descr
->
width
=
p_vout
->
output
.
i_width
;
p_descr
->
height
=
p_vout
->
output
.
i_height
;
p_descr
->
hRes
=
Long2Fix
(
72
);
p_descr
->
vRes
=
Long2Fix
(
72
);
p_descr
->
spatialQuality
=
codecLosslessQuality
;
p_descr
->
frameCount
=
1
;
p_descr
->
clutID
=
-
1
;
p_descr
->
dataSize
=
0
;
p_descr
->
depth
=
24
;
HUnlock
(
(
Handle
)
p_vout
->
p_sys
->
h_img_descr
);
if
(
(
err
=
DecompressSequenceBeginS
(
&
p_vout
->
p_sys
->
i_seq
,
p_vout
->
p_sys
->
h_img_descr
,
NULL
,
(
p_descr
->
width
*
p_descr
->
height
*
16
)
/
8
,
p_vout
->
p_sys
->
p_qdport
,
NULL
,
NULL
,
p_vout
->
p_sys
->
p_matrix
,
srcCopy
,
p_vout
->
p_sys
->
clip_mask
,
codecFlagUseImageBuffer
,
codecLosslessQuality
,
bestSpeedCodec
)
)
)
{
msg_Err
(
p_vout
,
"Failed to initialize QT: DecompressSequenceBeginS failed: %d"
,
err
);
return
(
1
);
}
return
(
0
);
}
/*****************************************************************************
* QTDestroySequence: destroy sequence
*****************************************************************************/
static
void
QTDestroySequence
(
vout_thread_t
*
p_vout
)
{
CDSequenceEnd
(
p_vout
->
p_sys
->
i_seq
);
}
/*****************************************************************************
* QTNewPicture: allocate a picture
*****************************************************************************
* Returns 0 on success, 1 otherwise
*****************************************************************************/
static
int
QTNewPicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
/* We know the chroma, allocate a buffer which will be used
* directly by the decoder */
p_pic
->
p_sys
=
malloc
(
sizeof
(
picture_sys_t
)
);
if
(
p_pic
->
p_sys
==
NULL
)
{
return
(
-
1
);
}
vout_InitPicture
(
VLC_OBJECT
(
p_vout
),
p_pic
,
p_vout
->
output
.
i_chroma
,
p_vout
->
output
.
i_width
,
p_vout
->
output
.
i_height
,
p_vout
->
output
.
i_aspect
);
switch
(
p_vout
->
output
.
i_chroma
)
{
case
VLC_FOURCC
(
'Y'
,
'U'
,
'Y'
,
'2'
):
p_pic
->
p_sys
->
i_size
=
p_vout
->
output
.
i_width
*
p_vout
->
output
.
i_height
*
2
;
/* Allocate the memory buffer */
p_pic
->
p_data_orig
=
p_pic
->
p_data
=
malloc
(
p_pic
->
p_sys
->
i_size
);
/* Memory is always 16-bytes aligned on OSX, so it does not
* posix_memalign() */
assert
(
(((
uintptr_t
)
p_pic
->
p_data
)
%
16
)
==
0
);
p_pic
->
p
[
0
].
p_pixels
=
p_pic
->
p_data
;
p_pic
->
p
[
0
].
i_lines
=
p_vout
->
output
.
i_height
;
p_pic
->
p
[
0
].
i_visible_lines
=
p_vout
->
output
.
i_height
;
p_pic
->
p
[
0
].
i_pitch
=
p_vout
->
output
.
i_width
*
2
;
p_pic
->
p
[
0
].
i_pixel_pitch
=
1
;
p_pic
->
p
[
0
].
i_visible_pitch
=
p_vout
->
output
.
i_width
*
2
;
p_pic
->
i_planes
=
1
;
p_pic
->
p_sys
->
p_data
=
(
void
*
)
p_pic
->
p
[
0
].
p_pixels
;
break
;
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
):
p_pic
->
p_sys
->
p_data
=
(
void
*
)
&
p_pic
->
p_sys
->
pixmap_i420
;
p_pic
->
p_sys
->
i_size
=
sizeof
(
PlanarPixmapInfoYUV420
);
/* Allocate the memory buffer */
p_pic
->
p_data_orig
=
p_pic
->
p_data
=
malloc
(
p_vout
->
output
.
i_width
*
p_vout
->
output
.
i_height
*
3
/
2
);
/* Memory is always 16-bytes aligned on OSX, so it does not
* posix_memalign() */
assert
(
(((
uintptr_t
)
p_pic
->
p_data
)
%
16
)
==
0
);
/* Y buffer */
p_pic
->
Y_PIXELS
=
p_pic
->
p_data
;
p_pic
->
p
[
Y_PLANE
].
i_lines
=
p_vout
->
output
.
i_height
;
p_pic
->
p
[
Y_PLANE
].
i_visible_lines
=
p_vout
->
output
.
i_height
;
p_pic
->
p
[
Y_PLANE
].
i_pitch
=
p_vout
->
output
.
i_width
;
p_pic
->
p
[
Y_PLANE
].
i_pixel_pitch
=
1
;
p_pic
->
p
[
Y_PLANE
].
i_visible_pitch
=
p_vout
->
output
.
i_width
;
/* U buffer */
p_pic
->
U_PIXELS
=
p_pic
->
Y_PIXELS
+
p_vout
->
output
.
i_height
*
p_vout
->
output
.
i_width
;
p_pic
->
p
[
U_PLANE
].
i_lines
=
p_vout
->
output
.
i_height
/
2
;
p_pic
->
p
[
U_PLANE
].
i_visible_lines
=
p_vout
->
output
.
i_height
/
2
;
p_pic
->
p
[
U_PLANE
].
i_pitch
=
p_vout
->
output
.
i_width
/
2
;
p_pic
->
p
[
U_PLANE
].
i_pixel_pitch
=
1
;
p_pic
->
p
[
U_PLANE
].
i_visible_pitch
=
p_vout
->
output
.
i_width
/
2
;
/* V buffer */
p_pic
->
V_PIXELS
=
p_pic
->
U_PIXELS
+
p_vout
->
output
.
i_height
*
p_vout
->
output
.
i_width
/
4
;
p_pic
->
p
[
V_PLANE
].
i_lines
=
p_vout
->
output
.
i_height
/
2
;
p_pic
->
p
[
V_PLANE
].
i_visible_lines
=
p_vout
->
output
.
i_height
/
2
;
p_pic
->
p
[
V_PLANE
].
i_pitch
=
p_vout
->
output
.
i_width
/
2
;
p_pic
->
p
[
V_PLANE
].
i_pixel_pitch
=
1
;
p_pic
->
p
[
V_PLANE
].
i_visible_pitch
=
p_vout
->
output
.
i_width
/
2
;
/* We allocated 3 planes */
p_pic
->
i_planes
=
3
;
#define P p_pic->p_sys->pixmap_i420
P
.
componentInfoY
.
offset
=
(
void
*
)
p_pic
->
Y_PIXELS
-
p_pic
->
p_sys
->
p_data
;
P
.
componentInfoCb
.
offset
=
(
void
*
)
p_pic
->
U_PIXELS
-
p_pic
->
p_sys
->
p_data
;
P
.
componentInfoCr
.
offset
=
(
void
*
)
p_pic
->
V_PIXELS
-
p_pic
->
p_sys
->
p_data
;
P
.
componentInfoY
.
rowBytes
=
p_vout
->
output
.
i_width
;
P
.
componentInfoCb
.
rowBytes
=
p_vout
->
output
.
i_width
/
2
;
P
.
componentInfoCr
.
rowBytes
=
p_vout
->
output
.
i_width
/
2
;
#undef P
break
;
default:
/* Unknown chroma, tell the guy to get lost */
free
(
p_pic
->
p_sys
);
msg_Err
(
p_vout
,
"Unknown chroma format 0x%.8x (%4.4s)"
,
p_vout
->
output
.
i_chroma
,
(
char
*
)
&
p_vout
->
output
.
i_chroma
);
p_pic
->
i_planes
=
0
;
return
(
-
1
);
}
return
(
0
);
}
/*****************************************************************************
* QTFreePicture: destroy a picture allocated with QTNewPicture
*****************************************************************************/
static
void
QTFreePicture
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
switch
(
p_vout
->
output
.
i_chroma
)
{
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
):
free
(
p_pic
->
p_data_orig
);
break
;
}
free
(
p_pic
->
p_sys
);
}
/*****************************************************************************
* VLCQTView implementation
*****************************************************************************/
@implementation
VLCQTView
/* This function will reset the o_vout_view. It's useful to go fullscreen. */
+
(
void
)
resetVout
:
(
vout_thread_t
*
)
p_vout
{
QTDestroySequence
(
p_vout
);
if
(
p_vout
->
b_fullscreen
)
{
if
(
!
p_vout
->
p_sys
->
b_embedded
)
{
/* Save window size and position */
p_vout
->
p_sys
->
s_frame
.
size
=
[
p_vout
->
p_sys
->
o_vout_view
frame
].
size
;
p_vout
->
p_sys
->
s_frame
.
origin
=
[[
p_vout
->
p_sys
->
o_vout_view
getWindow
]
frame
].
origin
;
p_vout
->
p_sys
->
b_saved_frame
=
true
;
}
else
{
var_DelCallback
(
p_vout
->
p_libvlc
,
"drawableredraw"
,
DrawableRedraw
,
p_vout
);
DisposeRgn
(
p_vout
->
p_sys
->
clip_mask
);
}
}
if
(
p_vout
->
b_fullscreen
||
!
p_vout
->
p_sys
->
b_embedded
)
{
Rect
s_rect
;
p_vout
->
p_sys
->
clip_mask
=
NULL
;
#define o_qtview p_vout->p_sys->o_qtview
o_qtview
=
[[
VLCQTView
alloc
]
initWithVout
:
p_vout
];
[
o_qtview
autorelease
];
if
(
p_vout
->
p_sys
->
b_saved_frame
)
{
p_vout
->
p_sys
->
o_vout_view
=
[
VLCVoutView
getVoutView
:
p_vout
subView:
o_qtview
frame:
&
p_vout
->
p_sys
->
s_frame
];
}
else
{
p_vout
->
p_sys
->
o_vout_view
=
[
VLCVoutView
getVoutView
:
p_vout
subView:
o_qtview
frame
:
nil
];
}
/* Retrieve the QuickDraw port */
[
o_qtview
lockFocus
];
p_vout
->
p_sys
->
p_qdport
=
[
o_qtview
qdPort
];
[
o_qtview
unlockFocus
];
#undef o_qtview
GetPortBounds
(
p_vout
->
p_sys
->
p_qdport
,
&
s_rect
);
p_vout
->
p_sys
->
i_origx
=
s_rect
.
left
;
p_vout
->
p_sys
->
i_origy
=
s_rect
.
top
;
p_vout
->
p_sys
->
i_width
=
s_rect
.
right
-
s_rect
.
left
;
p_vout
->
p_sys
->
i_height
=
s_rect
.
bottom
-
s_rect
.
top
;
}
else
{
/* Create the clipping mask */
p_vout
->
p_sys
->
clip_mask
=
NewRgn
();
UpdateEmbeddedGeometry
(
p_vout
);
var_AddCallback
(
p_vout
->
p_libvlc
,
"drawableredraw"
,
DrawableRedraw
,
p_vout
);
}
QTScaleMatrix
(
p_vout
);
if
(
QTCreateSequence
(
p_vout
)
)
{
msg_Err
(
p_vout
,
"unable to initialize QT: QTCreateSequence failed"
);
return
;
}
}
-
(
id
)
initWithVout
:(
vout_thread_t
*
)
_p_vout
{
p_vout
=
_p_vout
;
return
[
super
init
];
}
-
(
void
)
drawRect
:(
NSRect
)
rect
{
[[
NSColor
blackColor
]
set
];
NSRectFill
(
rect
);
[
super
drawRect
:
rect
];
p_vout
->
i_changes
|=
VOUT_SIZE_CHANGE
;
}
@end
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