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
e365f860
Commit
e365f860
authored
Sep 03, 2012
by
Felix Paul Kühne
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
qtcapture: unify and modernize coding style
parent
bdb729ea
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
94 additions
and
112 deletions
+94
-112
modules/access/qtcapture.m
modules/access/qtcapture.m
+94
-112
No files found.
modules/access/qtcapture.m
View file @
e365f860
...
@@ -48,22 +48,22 @@
...
@@ -48,22 +48,22 @@
/*****************************************************************************
/*****************************************************************************
* Local prototypes
* Local prototypes
*****************************************************************************/
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
);
static
int
Open
(
vlc_object_t
*
p_this
);
static
void
Close
(
vlc_object_t
*
p_this
);
static
void
Close
(
vlc_object_t
*
p_this
);
static
int
Demux
(
demux_t
*
p_demux
);
static
int
Demux
(
demux_t
*
p_demux
);
static
int
Control
(
demux_t
*
,
int
,
va_list
);
static
int
Control
(
demux_t
*
,
int
,
va_list
);
/*****************************************************************************
/*****************************************************************************
* Module descriptor
* Module descriptor
*****************************************************************************/
*****************************************************************************/
vlc_module_begin
()
vlc_module_begin
()
set_shortname
(
N_
(
"Quicktime Capture"
)
)
set_shortname
(
N_
(
"Quicktime Capture"
)
)
set_description
(
N_
(
"Quicktime Capture"
)
)
set_description
(
N_
(
"Quicktime Capture"
)
)
set_category
(
CAT_INPUT
)
set_category
(
CAT_INPUT
)
set_subcategory
(
SUBCAT_INPUT_ACCESS
)
set_subcategory
(
SUBCAT_INPUT_ACCESS
)
add_shortcut
(
"qtcapture"
)
add_shortcut
(
"qtcapture"
)
set_capability
(
"access_demux"
,
10
)
set_capability
(
"access_demux"
,
10
)
set_callbacks
(
Open
,
Close
)
set_callbacks
(
Open
,
Close
)
add_integer
(
"qtcapture-width"
,
640
,
QTKIT_WIDTH_TEXT
,
QTKIT_WIDTH_LONGTEXT
,
true
)
add_integer
(
"qtcapture-width"
,
640
,
QTKIT_WIDTH_TEXT
,
QTKIT_WIDTH_LONGTEXT
,
true
)
change_integer_range
(
80
,
1280
)
change_integer_range
(
80
,
1280
)
add_integer
(
"qtcapture-height"
,
480
,
QTKIT_HEIGHT_TEXT
,
QTKIT_HEIGHT_LONGTEXT
,
true
)
add_integer
(
"qtcapture-height"
,
480
,
QTKIT_HEIGHT_TEXT
,
QTKIT_HEIGHT_LONGTEXT
,
true
)
...
@@ -88,10 +88,10 @@ vlc_module_end ()
...
@@ -88,10 +88,10 @@ vlc_module_end ()
/* Apple sample code */
/* Apple sample code */
@implementation
VLCDecompressedVideoOutput
:
QTCaptureDecompressedVideoOutput
@implementation
VLCDecompressedVideoOutput
:
QTCaptureDecompressedVideoOutput
-
(
id
)
init
-
(
id
)
init
{
{
if
(
self
=
[
super
init
]
)
if
(
self
=
[
super
init
])
{
{
currentImageBuffer
=
nil
;
currentImageBuffer
=
nil
;
currentPts
=
0
;
currentPts
=
0
;
previousPts
=
0
;
previousPts
=
0
;
...
@@ -99,10 +99,10 @@ vlc_module_end ()
...
@@ -99,10 +99,10 @@ vlc_module_end ()
}
}
return
self
;
return
self
;
}
}
-
(
void
)
dealloc
-
(
void
)
dealloc
{
{
@synchronized
(
self
)
@synchronized
(
self
)
{
{
CVBufferRelease
(
currentImageBuffer
);
CVBufferRelease
(
currentImageBuffer
);
currentImageBuffer
=
nil
;
currentImageBuffer
=
nil
;
}
}
...
@@ -122,8 +122,7 @@ vlc_module_end ()
...
@@ -122,8 +122,7 @@ vlc_module_end ()
CVBufferRetain
(
videoFrame
);
CVBufferRetain
(
videoFrame
);
@synchronized
(
self
)
@synchronized
(
self
)
{
{
imageBufferToRelease
=
currentImageBuffer
;
imageBufferToRelease
=
currentImageBuffer
;
currentImageBuffer
=
videoFrame
;
currentImageBuffer
=
videoFrame
;
QTTime
timeStamp
=
[
sampleBuffer
presentationTime
];
QTTime
timeStamp
=
[
sampleBuffer
presentationTime
];
...
@@ -132,7 +131,7 @@ vlc_module_end ()
...
@@ -132,7 +131,7 @@ vlc_module_end ()
/* Try to use hosttime of the sample if available, because iSight Pts seems broken */
/* Try to use hosttime of the sample if available, because iSight Pts seems broken */
NSNumber
*
hosttime
=
(
NSNumber
*
)[
sampleBuffer
attributeForKey
:
QTSampleBufferHostTimeAttribute
];
NSNumber
*
hosttime
=
(
NSNumber
*
)[
sampleBuffer
attributeForKey
:
QTSampleBufferHostTimeAttribute
];
if
(
hosttime
)
currentPts
=
(
mtime_t
)
AudioConvertHostTimeToNanos
([
hosttime
unsignedLongLongValue
])
/
1000
;
if
(
hosttime
)
currentPts
=
(
mtime_t
)
AudioConvertHostTimeToNanos
([
hosttime
unsignedLongLongValue
])
/
1000
;
}
}
CVBufferRelease
(
imageBufferToRelease
);
CVBufferRelease
(
imageBufferToRelease
);
}
}
...
@@ -144,25 +143,24 @@ vlc_module_end ()
...
@@ -144,25 +143,24 @@ vlc_module_end ()
void
*
pixels
;
void
*
pixels
;
if
(
!
currentImageBuffer
||
currentPts
==
previousPts
)
if
(
!
currentImageBuffer
||
currentPts
==
previousPts
)
return
0
;
return
0
;
@synchronized
(
self
)
@synchronized
(
self
)
{
{
imageBuffer
=
CVBufferRetain
(
currentImageBuffer
);
imageBuffer
=
CVBufferRetain
(
currentImageBuffer
);
if
(
imageBuffer
)
{
if
(
imageBuffer
)
{
pts
=
previousPts
=
currentPts
;
pts
=
previousPts
=
currentPts
;
CVPixelBufferLockBaseAddress
(
imageBuffer
,
0
);
CVPixelBufferLockBaseAddress
(
imageBuffer
,
0
);
pixels
=
CVPixelBufferGetBaseAddress
(
imageBuffer
);
pixels
=
CVPixelBufferGetBaseAddress
(
imageBuffer
);
if
(
pixels
)
if
(
pixels
)
memcpy
(
buffer
,
pixels
,
CVPixelBufferGetBytesPerRow
(
imageBuffer
)
*
CVPixelBufferGetHeight
(
imageBuffer
));
memcpy
(
buffer
,
pixels
,
CVPixelBufferGetBytesPerRow
(
imageBuffer
)
*
CVPixelBufferGetHeight
(
imageBuffer
));
CVPixelBufferUnlockBaseAddress
(
imageBuffer
,
0
);
CVPixelBufferUnlockBaseAddress
(
imageBuffer
,
0
);
}
}
}
}
CVBufferRelease
(
imageBuffer
);
CVBufferRelease
(
imageBuffer
);
if
(
pixels
)
if
(
pixels
)
return
currentPts
;
return
currentPts
;
else
else
return
0
;
return
0
;
...
@@ -188,7 +186,7 @@ struct demux_sys_t {
...
@@ -188,7 +186,7 @@ struct demux_sys_t {
/*****************************************************************************
/*****************************************************************************
* qtchroma_to_fourcc
* qtchroma_to_fourcc
*****************************************************************************/
*****************************************************************************/
static
int
qtchroma_to_fourcc
(
int
i_qt
)
static
int
qtchroma_to_fourcc
(
int
i_qt
)
{
{
static
const
struct
static
const
struct
{
{
...
@@ -202,10 +200,9 @@ static int qtchroma_to_fourcc( int i_qt )
...
@@ -202,10 +200,9 @@ static int qtchroma_to_fourcc( int i_qt )
{
'
yuvs
'
,
VLC_CODEC_YUYV
},
{
'
yuvs
'
,
VLC_CODEC_YUYV
},
{
0
,
0
}
{
0
,
0
}
};
};
int
i
;
for
(
i
=
0
;
qtchroma_to_fourcc
[
i
].
i_qt
;
i
++
)
for
(
int
i
=
0
;
qtchroma_to_fourcc
[
i
].
i_qt
;
i
++
)
{
{
if
(
qtchroma_to_fourcc
[
i
].
i_qt
==
i_qt
)
if
(
qtchroma_to_fourcc
[
i
].
i_qt
==
i_qt
)
return
qtchroma_to_fourcc
[
i
].
i_fourcc
;
return
qtchroma_to_fourcc
[
i
].
i_fourcc
;
}
}
return
0
;
return
0
;
...
@@ -214,7 +211,7 @@ static int qtchroma_to_fourcc( int i_qt )
...
@@ -214,7 +211,7 @@ static int qtchroma_to_fourcc( int i_qt )
/*****************************************************************************
/*****************************************************************************
* Open:
* Open:
*****************************************************************************/
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
static
int
Open
(
vlc_object_t
*
p_this
)
{
{
demux_t
*
p_demux
=
(
demux_t
*
)
p_this
;
demux_t
*
p_demux
=
(
demux_t
*
)
p_this
;
demux_sys_t
*
p_sys
=
NULL
;
demux_sys_t
*
p_sys
=
NULL
;
...
@@ -225,14 +222,14 @@ static int Open( vlc_object_t *p_this )
...
@@ -225,14 +222,14 @@ static int Open( vlc_object_t *p_this )
char
*
psz_uid
=
NULL
;
char
*
psz_uid
=
NULL
;
/* Only when selected */
/* Only when selected */
if
(
*
p_demux
->
psz_access
==
'\0'
)
if
(
*
p_demux
->
psz_access
==
'\0'
)
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
NSAutoreleasePool
*
pool
=
[[
NSAutoreleasePool
alloc
]
init
];
NSAutoreleasePool
*
pool
=
[[
NSAutoreleasePool
alloc
]
init
];
if
(
p_demux
->
psz_location
&&
*
p_demux
->
psz_location
)
if
(
p_demux
->
psz_location
&&
*
p_demux
->
psz_location
)
psz_uid
=
strdup
(
p_demux
->
psz_location
);
psz_uid
=
strdup
(
p_demux
->
psz_location
);
msg_Dbg
(
p_demux
,
"qtcapture uid = %s"
,
psz_uid
);
msg_Dbg
(
p_demux
,
"qtcapture uid = %s"
,
psz_uid
);
NSString
*
qtk_currdevice_uid
=
[[
NSString
alloc
]
initWithFormat
:
@"%s"
,
psz_uid
];
NSString
*
qtk_currdevice_uid
=
[[
NSString
alloc
]
initWithFormat
:
@"%s"
,
psz_uid
];
/* Set up p_demux */
/* Set up p_demux */
...
@@ -242,69 +239,63 @@ static int Open( vlc_object_t *p_this )
...
@@ -242,69 +239,63 @@ static int Open( vlc_object_t *p_this )
p_demux
->
info
.
i_title
=
0
;
p_demux
->
info
.
i_title
=
0
;
p_demux
->
info
.
i_seekpoint
=
0
;
p_demux
->
info
.
i_seekpoint
=
0
;
p_demux
->
p_sys
=
p_sys
=
calloc
(
1
,
sizeof
(
demux_sys_t
)
);
p_demux
->
p_sys
=
p_sys
=
calloc
(
1
,
sizeof
(
demux_sys_t
)
);
if
(
!
p_sys
)
if
(
!
p_sys
)
return
VLC_ENOMEM
;
return
VLC_ENOMEM
;
NSArray
*
myVideoDevices
=
[[[
QTCaptureDevice
inputDevicesWithMediaType
:
QTMediaTypeVideo
]
arrayByAddingObjectsFromArray
:[
QTCaptureDevice
inputDevicesWithMediaType
:
QTMediaTypeMuxed
]]
retain
];
NSArray
*
myVideoDevices
=
[[[
QTCaptureDevice
inputDevicesWithMediaType
:
QTMediaTypeVideo
]
arrayByAddingObjectsFromArray
:[
QTCaptureDevice
inputDevicesWithMediaType
:
QTMediaTypeMuxed
]]
retain
];
if
([
myVideoDevices
count
]
==
0
)
if
([
myVideoDevices
count
]
==
0
)
{
{
dialog_FatalWait
(
p_demux
,
_
(
"No Input device found"
),
dialog_FatalWait
(
p_demux
,
_
(
"No Input device found"
),
_
(
"Your Mac does not seem to be equipped with a suitable input device. "
_
(
"Your Mac does not seem to be equipped with a suitable input device. "
"Please check your connectors and drivers."
)
);
"Please check your connectors and drivers."
));
msg_Err
(
p_demux
,
"Can't find any Video device"
);
msg_Err
(
p_demux
,
"Can't find any Video device"
);
goto
error
;
goto
error
;
}
}
NSUInteger
ivideo
;
NSUInteger
ivideo
;
NSUInteger
deviceCount
=
[
myVideoDevices
count
];
NSUInteger
deviceCount
=
[
myVideoDevices
count
];
for
(
ivideo
=
0
;
ivideo
<
deviceCount
;
ivideo
++
)
{
for
(
ivideo
=
0
;
ivideo
<
deviceCount
;
ivideo
++
)
{
QTCaptureDevice
*
qtk_device
;
QTCaptureDevice
*
qtk_device
;
qtk_device
=
[
myVideoDevices
objectAtIndex
:
ivideo
];
qtk_device
=
[
myVideoDevices
objectAtIndex
:
ivideo
];
msg_Dbg
(
p_demux
,
"qtcapture %lu/%lu %s %s"
,
ivideo
,
deviceCount
,
[[
qtk_device
localizedDisplayName
]
UTF8String
],
[[
qtk_device
uniqueID
]
UTF8String
]);
msg_Dbg
(
p_demux
,
"qtcapture %lu/%lu %s %s"
,
ivideo
,
deviceCount
,
[[
qtk_device
localizedDisplayName
]
UTF8String
],
[[
qtk_device
uniqueID
]
UTF8String
]);
if
([[[
qtk_device
uniqueID
]
stringByTrimmingCharactersInSet
:[
NSCharacterSet
whitespaceCharacterSet
]]
isEqualToString
:
qtk_currdevice_uid
])
{
if
([[[
qtk_device
uniqueID
]
stringByTrimmingCharactersInSet
:[
NSCharacterSet
whitespaceCharacterSet
]]
isEqualToString
:
qtk_currdevice_uid
])
{
break
;
break
;
}
}
}
}
memset
(
&
p_sys
->
fmt
,
0
,
sizeof
(
es_format_t
)
);
memset
(
&
p_sys
->
fmt
,
0
,
sizeof
(
es_format_t
)
);
QTCaptureDeviceInput
*
input
=
nil
;
QTCaptureDeviceInput
*
input
=
nil
;
NSError
*
o_returnedError
;
NSError
*
o_returnedError
;
if
(
ivideo
<
[
myVideoDevices
count
]
)
if
(
ivideo
<
[
myVideoDevices
count
]
)
p_sys
->
device
=
[
myVideoDevices
objectAtIndex
:
ivideo
];
p_sys
->
device
=
[
myVideoDevices
objectAtIndex
:
ivideo
];
else
else
{
{
/* cannot found designated device, fall back to open default device */
/* cannot found designated device, fall back to open default device */
msg_Dbg
(
p_demux
,
"Cannot find designated uid device as %s, falling back to default."
,
[
qtk_currdevice_uid
UTF8String
]);
msg_Dbg
(
p_demux
,
"Cannot find designated uid device as %s, falling back to default."
,
[
qtk_currdevice_uid
UTF8String
]);
p_sys
->
device
=
[
QTCaptureDevice
defaultInputDeviceWithMediaType
:
QTMediaTypeVideo
];
p_sys
->
device
=
[
QTCaptureDevice
defaultInputDeviceWithMediaType
:
QTMediaTypeVideo
];
}
}
if
(
!
p_sys
->
device
)
if
(
!
p_sys
->
device
)
{
{
dialog_FatalWait
(
p_demux
,
_
(
"No Input device found"
),
dialog_FatalWait
(
p_demux
,
_
(
"No Input device found"
),
_
(
"Your Mac does not seem to be equipped with a suitable input device. "
_
(
"Your Mac does not seem to be equipped with a suitable input device. "
"Please check your connectors and drivers."
)
);
"Please check your connectors and drivers."
));
msg_Err
(
p_demux
,
"Can't find any Video device"
);
msg_Err
(
p_demux
,
"Can't find any Video device"
);
goto
error
;
goto
error
;
}
}
if
(
!
[
p_sys
->
device
open
:
&
o_returnedError
]
)
if
(
!
[
p_sys
->
device
open
:
&
o_returnedError
])
{
{
msg_Err
(
p_demux
,
"Unable to open the capture device (%ld)"
,
[
o_returnedError
code
]);
msg_Err
(
p_demux
,
"Unable to open the capture device (%ld)"
,
[
o_returnedError
code
]
);
goto
error
;
goto
error
;
}
}
if
(
[
p_sys
->
device
isInUseByAnotherApplication
]
==
YES
)
if
([
p_sys
->
device
isInUseByAnotherApplication
]
==
YES
)
{
{
msg_Err
(
p_demux
,
"default capture device is exclusively in use by another application"
);
msg_Err
(
p_demux
,
"default capture device is exclusively in use by another application"
);
goto
error
;
goto
error
;
}
}
input
=
[[
QTCaptureDeviceInput
alloc
]
initWithDevice
:
p_sys
->
device
];
input
=
[[
QTCaptureDeviceInput
alloc
]
initWithDevice
:
p_sys
->
device
];
if
(
!
input
)
if
(
!
input
)
{
{
msg_Err
(
p_demux
,
"can't create a valid capture input facility"
);
msg_Err
(
p_demux
,
"can't create a valid capture input facility"
);
goto
error
;
goto
error
;
}
}
...
@@ -314,22 +305,22 @@ static int Open( vlc_object_t *p_this )
...
@@ -314,22 +305,22 @@ static int Open( vlc_object_t *p_this )
NSArray
*
format_array
=
[
p_sys
->
device
formatDescriptions
];
NSArray
*
format_array
=
[
p_sys
->
device
formatDescriptions
];
QTFormatDescription
*
camera_format
=
NULL
;
QTFormatDescription
*
camera_format
=
NULL
;
NSUInteger
formatCount
=
[
format_array
count
];
NSUInteger
formatCount
=
[
format_array
count
];
for
(
NSUInteger
k
=
0
;
k
<
formatCount
;
k
++
)
for
(
NSUInteger
k
=
0
;
k
<
formatCount
;
k
++
)
{
{
camera_format
=
[
format_array
objectAtIndex
:
k
];
camera_format
=
[
format_array
objectAtIndex
:
k
];
msg_Dbg
(
p_demux
,
"localized Format: %s"
,
[[
camera_format
localizedFormatSummary
]
UTF8String
]
);
msg_Dbg
(
p_demux
,
"localized Format: %s"
,
[[
camera_format
localizedFormatSummary
]
UTF8String
]);
msg_Dbg
(
p_demux
,
"format description: %s"
,
[[[
camera_format
formatDescriptionAttributes
]
description
]
UTF8String
]
);
msg_Dbg
(
p_demux
,
"format description: %s"
,
[[[
camera_format
formatDescriptionAttributes
]
description
]
UTF8String
]);
}
}
if
(
[
format_array
count
]
)
if
([
format_array
count
]
)
camera_format
=
[
format_array
objectAtIndex
:
0
];
camera_format
=
[
format_array
objectAtIndex
:
0
];
else
goto
error
;
else
goto
error
;
int
qtchroma
=
[
camera_format
formatType
];
int
qtchroma
=
[
camera_format
formatType
];
int
chroma
=
VLC_CODEC_UYVY
;
int
chroma
=
VLC_CODEC_UYVY
;
/* Now we can init */
/* Now we can init */
es_format_Init
(
&
p_sys
->
fmt
,
VIDEO_ES
,
chroma
);
es_format_Init
(
&
p_sys
->
fmt
,
VIDEO_ES
,
chroma
);
NSSize
encoded_size
=
[[
camera_format
attributeForKey
:
QTFormatDescriptionVideoEncodedPixelsSizeAttribute
]
sizeValue
];
NSSize
encoded_size
=
[[
camera_format
attributeForKey
:
QTFormatDescriptionVideoEncodedPixelsSizeAttribute
]
sizeValue
];
NSSize
display_size
=
[[
camera_format
attributeForKey
:
QTFormatDescriptionVideoCleanApertureDisplaySizeAttribute
]
sizeValue
];
NSSize
display_size
=
[[
camera_format
attributeForKey
:
QTFormatDescriptionVideoCleanApertureDisplaySizeAttribute
]
sizeValue
];
...
@@ -343,15 +334,14 @@ static int Open( vlc_object_t *p_this )
...
@@ -343,15 +334,14 @@ static int Open( vlc_object_t *p_this )
p_sys
->
fmt
.
video
.
i_width
=
p_sys
->
width
=
encoded_size
.
width
;
p_sys
->
fmt
.
video
.
i_width
=
p_sys
->
width
=
encoded_size
.
width
;
p_sys
->
fmt
.
video
.
i_height
=
p_sys
->
height
=
encoded_size
.
height
;
p_sys
->
fmt
.
video
.
i_height
=
p_sys
->
height
=
encoded_size
.
height
;
p_sys
->
fmt
.
video
.
i_frame_rate
=
25
.
0
;
// cave: check with setMinimumVideoFrameInterval (see below)
p_sys
->
fmt
.
video
.
i_frame_rate
=
25
.
0
;
// cave: check with setMinimumVideoFrameInterval (see below)
if
(
par_size
.
width
!=
encoded_size
.
width
)
if
(
par_size
.
width
!=
encoded_size
.
width
)
{
{
p_sys
->
fmt
.
video
.
i_sar_num
=
(
int64_t
)
encoded_size
.
height
*
par_size
.
width
/
encoded_size
.
width
;
p_sys
->
fmt
.
video
.
i_sar_num
=
(
int64_t
)
encoded_size
.
height
*
par_size
.
width
/
encoded_size
.
width
;
p_sys
->
fmt
.
video
.
i_sar_den
=
encoded_size
.
width
;
p_sys
->
fmt
.
video
.
i_sar_den
=
encoded_size
.
width
;
}
}
msg_Dbg
(
p_demux
,
"encoded_size %i %i"
,
(
int
)
encoded_size
.
width
,
(
int
)
encoded_size
.
height
);
msg_Dbg
(
p_demux
,
"encoded_size %i %i"
,
(
int
)
encoded_size
.
width
,
(
int
)
encoded_size
.
height
);
msg_Dbg
(
p_demux
,
"display_size %i %i"
,
(
int
)
display_size
.
width
,
(
int
)
display_size
.
height
);
msg_Dbg
(
p_demux
,
"display_size %i %i"
,
(
int
)
display_size
.
width
,
(
int
)
display_size
.
height
);
msg_Dbg
(
p_demux
,
"PAR size %i %i"
,
(
int
)
par_size
.
width
,
(
int
)
par_size
.
height
);
msg_Dbg
(
p_demux
,
"PAR size %i %i"
,
(
int
)
par_size
.
width
,
(
int
)
par_size
.
height
);
[
p_sys
->
output
setPixelBufferAttributes
:
[
NSDictionary
dictionaryWithObjectsAndKeys
:
[
p_sys
->
output
setPixelBufferAttributes
:
[
NSDictionary
dictionaryWithObjectsAndKeys
:
[
NSNumber
numberWithUnsignedInt
:
kCVPixelFormatType_422YpCbCr8
],
(
id
)
kCVPixelBufferPixelFormatTypeKey
,
[
NSNumber
numberWithUnsignedInt
:
kCVPixelFormatType_422YpCbCr8
],
(
id
)
kCVPixelBufferPixelFormatTypeKey
,
...
@@ -365,16 +355,14 @@ static int Open( vlc_object_t *p_this )
...
@@ -365,16 +355,14 @@ static int Open( vlc_object_t *p_this )
p_sys
->
session
=
[[
QTCaptureSession
alloc
]
init
];
p_sys
->
session
=
[[
QTCaptureSession
alloc
]
init
];
bool
ret
=
[
p_sys
->
session
addInput
:
input
error
:
&
o_returnedError
];
bool
ret
=
[
p_sys
->
session
addInput
:
input
error
:
&
o_returnedError
];
if
(
!
ret
)
if
(
!
ret
)
{
{
msg_Err
(
p_demux
,
"default video capture device could not be added to capture session (%ld)"
,
[
o_returnedError
code
]);
msg_Err
(
p_demux
,
"default video capture device could not be added to capture session (%ld)"
,
[
o_returnedError
code
]
);
goto
error
;
goto
error
;
}
}
ret
=
[
p_sys
->
session
addOutput
:
p_sys
->
output
error
:
&
o_returnedError
];
ret
=
[
p_sys
->
session
addOutput
:
p_sys
->
output
error
:
&
o_returnedError
];
if
(
!
ret
)
if
(
!
ret
)
{
{
msg_Err
(
p_demux
,
"output could not be added to capture session (%ld)"
,
[
o_returnedError
code
]);
msg_Err
(
p_demux
,
"output could not be added to capture session (%ld)"
,
[
o_returnedError
code
]
);
goto
error
;
goto
error
;
}
}
...
@@ -383,14 +371,14 @@ static int Open( vlc_object_t *p_this )
...
@@ -383,14 +371,14 @@ static int Open( vlc_object_t *p_this )
[
input
release
];
[
input
release
];
[
pool
release
];
[
pool
release
];
msg_Dbg
(
p_demux
,
"QTCapture: We have a video device ready!"
);
msg_Dbg
(
p_demux
,
"QTCapture: We have a video device ready!"
);
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
error:
error:
[
input
release
];
[
input
release
];
[
pool
release
];
[
pool
release
];
free
(
p_sys
);
free
(
p_sys
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
...
@@ -398,7 +386,7 @@ error:
...
@@ -398,7 +386,7 @@ error:
/*****************************************************************************
/*****************************************************************************
* Close:
* Close:
*****************************************************************************/
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
static
void
Close
(
vlc_object_t
*
p_this
)
{
{
NSAutoreleasePool
*
pool
=
[[
NSAutoreleasePool
alloc
]
init
];
NSAutoreleasePool
*
pool
=
[[
NSAutoreleasePool
alloc
]
init
];
...
@@ -408,15 +396,14 @@ static void Close( vlc_object_t *p_this )
...
@@ -408,15 +396,14 @@ static void Close( vlc_object_t *p_this )
/* Hack: if libvlc was killed, main interface thread was,
/* Hack: if libvlc was killed, main interface thread was,
* and poor QTKit needs it, so don't tell him.
* and poor QTKit needs it, so don't tell him.
* Else we dead lock. */
* Else we dead lock. */
if
(
vlc_object_alive
(
p_this
->
p_libvlc
))
if
(
vlc_object_alive
(
p_this
->
p_libvlc
))
{
{
// Perform this on main thread, as the framework itself will sometimes try to synchronously
// Perform this on main thread, as the framework itself will sometimes try to synchronously
// work on main thread. And this will create a dead lock.
// work on main thread. And this will create a dead lock.
[
p_sys
->
session
performSelectorOnMainThread
:
@selector
(
stopRunning
)
withObject
:
nil
waitUntilDone
:
NO
];
[
p_sys
->
session
performSelectorOnMainThread
:
@selector
(
stopRunning
)
withObject
:
nil
waitUntilDone
:
NO
];
[
p_sys
->
output
performSelectorOnMainThread
:
@selector
(
release
)
withObject
:
nil
waitUntilDone
:
NO
];
[
p_sys
->
output
performSelectorOnMainThread
:
@selector
(
release
)
withObject
:
nil
waitUntilDone
:
NO
];
[
p_sys
->
session
performSelectorOnMainThread
:
@selector
(
release
)
withObject
:
nil
waitUntilDone
:
NO
];
[
p_sys
->
session
performSelectorOnMainThread
:
@selector
(
release
)
withObject
:
nil
waitUntilDone
:
NO
];
}
}
free
(
p_sys
);
free
(
p_sys
);
[
pool
release
];
[
pool
release
];
}
}
...
@@ -425,44 +412,39 @@ static void Close( vlc_object_t *p_this )
...
@@ -425,44 +412,39 @@ static void Close( vlc_object_t *p_this )
/*****************************************************************************
/*****************************************************************************
* Demux:
* Demux:
*****************************************************************************/
*****************************************************************************/
static
int
Demux
(
demux_t
*
p_demux
)
static
int
Demux
(
demux_t
*
p_demux
)
{
{
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
block_t
*
p_block
;
block_t
*
p_block
;
p_block
=
block_New
(
p_demux
,
p_sys
->
width
*
p_sys
->
height
*
2
/* FIXME */
);
p_block
=
block_New
(
p_demux
,
p_sys
->
width
*
p_sys
->
height
*
2
/* FIXME */
);
if
(
!
p_block
)
if
(
!
p_block
)
{
{
msg_Err
(
p_demux
,
"cannot get block"
);
msg_Err
(
p_demux
,
"cannot get block"
);
return
0
;
return
0
;
}
}
NSAutoreleasePool
*
pool
=
[[
NSAutoreleasePool
alloc
]
init
];
NSAutoreleasePool
*
pool
=
[[
NSAutoreleasePool
alloc
]
init
];
@synchronized
(
p_sys
->
output
)
@synchronized
(
p_sys
->
output
)
{
{
p_block
->
i_pts
=
[
p_sys
->
output
copyCurrentFrameToBuffer
:
p_block
->
p_buffer
];
p_block
->
i_pts
=
[
p_sys
->
output
copyCurrentFrameToBuffer
:
p_block
->
p_buffer
];
}
}
if
(
!
p_block
->
i_pts
)
if
(
!
p_block
->
i_pts
)
{
{
/* Nothing to display yet, just forget */
/* Nothing to display yet, just forget */
block_Release
(
p_block
);
block_Release
(
p_block
);
[
pool
release
];
[
pool
release
];
msleep
(
10000
);
msleep
(
10000
);
return
1
;
return
1
;
}
}
else
if
(
!
p_sys
->
b_es_setup
)
{
else
if
(
!
p_sys
->
b_es_setup
)
{
p_sys
->
fmt
.
video
.
i_frame_rate_base
=
[
p_sys
->
output
timeScale
];
p_sys
->
fmt
.
video
.
i_frame_rate_base
=
[
p_sys
->
output
timeScale
];
msg_Dbg
(
p_demux
,
"using frame rate base: %i"
,
p_sys
->
fmt
.
video
.
i_frame_rate_base
);
msg_Dbg
(
p_demux
,
"using frame rate base: %i"
,
p_sys
->
fmt
.
video
.
i_frame_rate_base
);
p_sys
->
p_es_video
=
es_out_Add
(
p_demux
->
out
,
&
p_sys
->
fmt
);
p_sys
->
p_es_video
=
es_out_Add
(
p_demux
->
out
,
&
p_sys
->
fmt
);
msg_Dbg
(
p_demux
,
"added new video es %4.4s %dx%d"
,
(
char
*
)
&
p_sys
->
fmt
.
i_codec
,
p_sys
->
fmt
.
video
.
i_width
,
p_sys
->
fmt
.
video
.
i_height
);
msg_Dbg
(
p_demux
,
"added new video es %4.4s %dx%d"
,
(
char
*
)
&
p_sys
->
fmt
.
i_codec
,
p_sys
->
fmt
.
video
.
i_width
,
p_sys
->
fmt
.
video
.
i_height
);
p_sys
->
b_es_setup
=
YES
;
p_sys
->
b_es_setup
=
YES
;
}
}
es_out_Control
(
p_demux
->
out
,
ES_OUT_SET_PCR
,
p_block
->
i_pts
);
es_out_Control
(
p_demux
->
out
,
ES_OUT_SET_PCR
,
p_block
->
i_pts
);
es_out_Send
(
p_demux
->
out
,
p_sys
->
p_es_video
,
p_block
);
es_out_Send
(
p_demux
->
out
,
p_sys
->
p_es_video
,
p_block
);
[
pool
release
];
[
pool
release
];
return
1
;
return
1
;
...
@@ -471,29 +453,29 @@ static int Demux( demux_t *p_demux )
...
@@ -471,29 +453,29 @@ static int Demux( demux_t *p_demux )
/*****************************************************************************
/*****************************************************************************
* Control:
* Control:
*****************************************************************************/
*****************************************************************************/
static
int
Control
(
demux_t
*
p_demux
,
int
i_query
,
va_list
args
)
static
int
Control
(
demux_t
*
p_demux
,
int
i_query
,
va_list
args
)
{
{
bool
*
pb
;
bool
*
pb
;
int64_t
*
pi64
;
int64_t
*
pi64
;
switch
(
i_query
)
switch
(
i_query
)
{
{
/* Special for access_demux */
/* Special for access_demux */
case
DEMUX_CAN_PAUSE
:
case
DEMUX_CAN_PAUSE
:
case
DEMUX_CAN_SEEK
:
case
DEMUX_CAN_SEEK
:
case
DEMUX_SET_PAUSE_STATE
:
case
DEMUX_SET_PAUSE_STATE
:
case
DEMUX_CAN_CONTROL_PACE
:
case
DEMUX_CAN_CONTROL_PACE
:
pb
=
(
bool
*
)
va_arg
(
args
,
bool
*
);
pb
=
(
bool
*
)
va_arg
(
args
,
bool
*
);
*
pb
=
false
;
*
pb
=
false
;
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
case
DEMUX_GET_PTS_DELAY
:
case
DEMUX_GET_PTS_DELAY
:
pi64
=
(
int64_t
*
)
va_arg
(
args
,
int64_t
*
);
pi64
=
(
int64_t
*
)
va_arg
(
args
,
int64_t
*
);
*
pi64
=
INT64_C
(
1000
)
*
var_InheritInteger
(
p_demux
,
"live-caching"
);
*
pi64
=
INT64_C
(
1000
)
*
var_InheritInteger
(
p_demux
,
"live-caching"
);
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
case
DEMUX_GET_TIME
:
case
DEMUX_GET_TIME
:
pi64
=
(
int64_t
*
)
va_arg
(
args
,
int64_t
*
);
pi64
=
(
int64_t
*
)
va_arg
(
args
,
int64_t
*
);
*
pi64
=
mdate
();
*
pi64
=
mdate
();
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
...
...
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