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
9400b572
Commit
9400b572
authored
Feb 20, 2002
by
Jon Lech Johansen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* MacOS X VCD support.
parent
ff619dd6
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
441 additions
and
13 deletions
+441
-13
Makefile.opts.in
Makefile.opts.in
+1
-0
configure
configure
+7
-0
configure.in
configure.in
+7
-0
plugins/vcd/Makefile
plugins/vcd/Makefile
+1
-1
plugins/vcd/cdrom_tools.c
plugins/vcd/cdrom_tools.c
+416
-0
plugins/vcd/cdrom_tools.h
plugins/vcd/cdrom_tools.h
+4
-9
plugins/vcd/input_vcd.c
plugins/vcd/input_vcd.c
+5
-3
No files found.
Makefile.opts.in
View file @
9400b572
...
...
@@ -96,6 +96,7 @@ LIB_QNX = @LIB_QNX@
LIB_QT
=
@LIB_QT@
LIB_RC
=
@LIB_RC@
LIB_SDL
=
@LIB_SDL@
LIB_VCD
=
@LIB_VCD@
LIB_WAVEOUT
=
@LIB_WAVEOUT@
LIB_WIN32
=
@LIB_WIN32@
LIB_X11
=
@LIB_X11@
...
...
configure
View file @
9400b572
...
...
@@ -6494,6 +6494,12 @@ then
BUILTINS
=
"
${
BUILTINS
}
vcd"
fi
if
test
x
$enable_vcd
!=
xno
-a
"
${
SYS
}
"
=
"darwin"
then
BUILTINS
=
"
${
BUILTINS
}
vcd"
LIB_VCD
=
"
${
LIB_VCD
}
-framework IOKit"
fi
# Check whether --enable-dummy or --disable-dummy was given.
if
test
"
${
enable_dummy
+set
}
"
=
set
;
then
enableval
=
"
$enable_dummy
"
...
...
@@ -8331,6 +8337,7 @@ s%@LIB_QNX@%$LIB_QNX%g
s%@LIB_QT@%
$LIB_QT
%g
s%@LIB_RC@%
$LIB_RC
%g
s%@LIB_SDL@%
$LIB_SDL
%g
s%@LIB_VCD@%
$LIB_VCD
%g
s%@LIB_WAVEOUT@%
$LIB_WAVEOUT
%g
s%@LIB_WIN32@%
$LIB_WIN32
%g
s%@LIB_X11@%
$LIB_X11
%g
...
...
configure.in
View file @
9400b572
...
...
@@ -903,6 +903,12 @@ then
BUILTINS="${BUILTINS} vcd"
fi
if test x$enable_vcd != xno -a "${SYS}" = "darwin"
then
BUILTINS="${BUILTINS} vcd"
LIB_VCD="${LIB_VCD} -framework IOKit"
fi
dnl
dnl dummy plugin
dnl
...
...
@@ -1541,6 +1547,7 @@ AC_SUBST(LIB_QNX)
AC_SUBST(LIB_QT)
AC_SUBST(LIB_RC)
AC_SUBST(LIB_SDL)
AC_SUBST(LIB_VCD)
AC_SUBST(LIB_WAVEOUT)
AC_SUBST(LIB_WIN32)
AC_SUBST(LIB_X11)
...
...
plugins/vcd/Makefile
View file @
9400b572
vcd_SOURCES
=
vcd.c input_vcd.c
linux_
cdrom_tools.c
vcd_SOURCES
=
vcd.c input_vcd.c cdrom_tools.c
plugins/vcd/
linux_
cdrom_tools.c
→
plugins/vcd/cdrom_tools.c
View file @
9400b572
/****************************************************************************
*
linux_cdrom_tools.c: linux
cdrom tools
*
cdrom_tools.c:
cdrom tools
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
* $Id: cdrom_tools.c,v 1.1 2002/02/20 05:50:00 jlj Exp $
*
* Author: Johan Bilien <jobi@via.ecp.fr>
* 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
...
...
@@ -39,13 +41,57 @@
#include <sys/ioctl.h>
#include "linux_cdrom_tools.h"
#if defined(HAVE_BSD_DVD_STRUCT) || \
defined(DVD_STRUCT_IN_BSDI_DVDIOCTL_DVD_H) || \
defined(DVD_STRUCT_IN_DVD_H)
# include <dvd.h>
#elif defined ( SYS_DARWIN )
# include <CoreFoundation/CFBase.h>
# include <IOKit/IOKitLib.h>
# include <IOKit/storage/IOCDTypes.h>
# include <IOKit/storage/IOCDMedia.h>
# include <IOKit/storage/IOCDMediaBSDClient.h>
#else
# include <linux/cdrom.h>
#endif
#include "cdrom_tools.h"
/*****************************************************************************
* Platform specific
*****************************************************************************/
#if defined( SYS_DARWIN )
CDTOC
*
getTOC
(
const
char
*
);
#define freeTOC( p ) free( (void*)p )
int
getNumberOfDescriptors
(
CDTOC
*
);
int
getNumberOfTracks
(
CDTOC
*
,
int
);
#define CD_MIN_TRACK_NO 01
#define CD_MAX_TRACK_NO 99
#endif
/*****************************************************************************
* ioctl_ReadTocHeader: Read the TOC header and return the track number.
*****************************************************************************/
int
ioctl_GetTrackCount
(
int
i_fd
)
int
ioctl_GetTrackCount
(
int
i_fd
,
const
char
*
psz_dev
)
{
int
i_count
=
-
1
;
#if defined( SYS_DARWIN )
CDTOC
*
pTOC
;
int
i_descriptors
;
if
(
(
pTOC
=
getTOC
(
psz_dev
)
)
==
NULL
)
{
intf_ErrMsg
(
"vcd error: failed to get the TOC"
);
return
(
-
1
);
}
i_descriptors
=
getNumberOfDescriptors
(
pTOC
);
i_count
=
getNumberOfTracks
(
pTOC
,
i_descriptors
);
freeTOC
(
pTOC
);
#else
struct
cdrom_tochdr
tochdr
;
/* First we read the TOC header */
...
...
@@ -55,16 +101,75 @@ int ioctl_GetTrackCount( int i_fd )
return
-
1
;
}
return
tochdr
.
cdth_trk1
-
tochdr
.
cdth_trk0
+
1
;
i_count
=
tochdr
.
cdth_trk1
-
tochdr
.
cdth_trk0
+
1
;
#endif
return
(
i_count
);
}
/*****************************************************************************
* ioctl_GetSectors: Read the Table of Contents and fill p_vcd.
*****************************************************************************/
int
*
ioctl_GetSectors
(
int
i_fd
)
int
*
ioctl_GetSectors
(
int
i_fd
,
const
char
*
psz_dev
)
{
int
i
,
i_tracks
;
int
*
p_sectors
;
int
*
p_sectors
=
NULL
;
#if defined( SYS_DARWIN )
CDTOC
*
pTOC
;
u_char
track
;
int
i_descriptors
;
int
i_leadout
=
-
1
;
CDTOCDescriptor
*
pTrackDescriptors
;
if
(
(
pTOC
=
getTOC
(
psz_dev
)
)
==
NULL
)
{
intf_ErrMsg
(
"vcd error: failed to get the TOC"
);
return
(
NULL
);
}
i_descriptors
=
getNumberOfDescriptors
(
pTOC
);
i_tracks
=
getNumberOfTracks
(
pTOC
,
i_descriptors
);
p_sectors
=
malloc
(
(
i_tracks
+
1
)
*
sizeof
(
int
)
);
if
(
p_sectors
==
NULL
)
{
intf_ErrMsg
(
"vcd error: could not allocate p_sectors"
);
freeTOC
(
pTOC
);
return
NULL
;
}
pTrackDescriptors
=
pTOC
->
descriptors
;
for
(
i_tracks
=
0
,
i
=
0
;
i
<=
i_descriptors
;
i
++
)
{
track
=
pTrackDescriptors
[
i
].
point
;
if
(
track
==
0xA2
)
i_leadout
=
i
;
if
(
track
>
CD_MAX_TRACK_NO
||
track
<
CD_MIN_TRACK_NO
)
continue
;
p_sectors
[
i_tracks
++
]
=
CDConvertMSFToLBA
(
pTrackDescriptors
[
i
].
p
);
}
if
(
i_leadout
==
-
1
)
{
intf_ErrMsg
(
"vcd error: leadout not found"
);
free
(
p_sectors
);
freeTOC
(
pTOC
);
return
(
NULL
);
}
/* set leadout sector */
p_sectors
[
i_tracks
]
=
CDConvertMSFToLBA
(
pTrackDescriptors
[
i_leadout
].
p
);
freeTOC
(
pTOC
);
#else
struct
cdrom_tochdr
tochdr
;
struct
cdrom_tocentry
tocent
;
...
...
@@ -100,6 +205,7 @@ int * ioctl_GetSectors( int i_fd )
p_sectors
[
i
]
=
tocent
.
cdte_addr
.
lba
;
}
#endif
return
p_sectors
;
}
...
...
@@ -110,6 +216,28 @@ int * ioctl_GetSectors( int i_fd )
int
ioctl_ReadSector
(
int
i_fd
,
int
i_sector
,
byte_t
*
p_buffer
)
{
byte_t
p_block
[
VCD_SECTOR_SIZE
];
#if defined( SYS_DARWIN )
dk_cd_read_t
cd_read
;
memset
(
&
cd_read
,
0
,
sizeof
(
cd_read
)
);
cd_read
.
offset
=
i_sector
*
VCD_SECTOR_SIZE
;
cd_read
.
sectorArea
=
kCDSectorAreaSync
|
kCDSectorAreaHeader
|
kCDSectorAreaSubHeader
|
kCDSectorAreaUser
|
kCDSectorAreaAuxiliary
;
cd_read
.
sectorType
=
kCDSectorTypeUnknown
;
cd_read
.
buffer
=
p_block
;
cd_read
.
bufferLength
=
sizeof
(
p_block
);
if
(
ioctl
(
i_fd
,
DKIOCCDREAD
,
&
cd_read
)
==
-
1
)
{
intf_ErrMsg
(
"vcd error: could not read block %d"
,
i_sector
);
return
(
-
1
);
}
#else
int
i_dummy
=
i_sector
+
2
*
CD_FRAMES
;
#define p_msf ((struct cdrom_msf0 *)p_block)
...
...
@@ -122,12 +250,167 @@ int ioctl_ReadSector( int i_fd, int i_sector, byte_t * p_buffer )
{
intf_ErrMsg
(
"vcd error: could not read block %i from disc"
,
i_sector
);
return
-
1
;
return
(
-
1
)
;
}
#endif
/* We don't want to keep the header of the read sector */
FAST_MEMCPY
(
p_buffer
,
p_block
+
VCD_DATA_START
,
VCD_DATA_SIZE
);
return
0
;
return
(
0
)
;
}
#if defined( SYS_DARWIN )
/****************************************************************************
* getTOC: get the TOC
****************************************************************************/
CDTOC
*
getTOC
(
const
char
*
psz_dev
)
{
mach_port_t
port
;
char
*
psz_devname
;
kern_return_t
ret
;
CDTOC
*
pTOC
=
NULL
;
io_iterator_t
iterator
;
io_registry_entry_t
service
;
CFDictionaryRef
properties
;
CFDataRef
data
;
if
(
psz_dev
==
NULL
)
{
intf_ErrMsg
(
"vcd error: invalid device path"
);
return
(
NULL
);
}
/* get the device name */
if
(
(
psz_devname
=
strrchr
(
psz_dev
,
'/'
)
)
!=
NULL
)
++
psz_devname
;
else
psz_devname
=
(
char
*
)
psz_dev
;
/* unraw the device name */
if
(
*
psz_devname
==
'r'
)
++
psz_devname
;
/* get port for IOKit communication */
if
(
(
ret
=
IOMasterPort
(
MACH_PORT_NULL
,
&
port
)
)
!=
KERN_SUCCESS
)
{
intf_ErrMsg
(
"vcd error: IOMasterPort: 0x%08x"
,
ret
);
return
(
NULL
);
}
/* get service iterator for the device */
if
(
(
ret
=
IOServiceGetMatchingServices
(
port
,
IOBSDNameMatching
(
port
,
0
,
psz_devname
),
&
iterator
)
)
!=
KERN_SUCCESS
)
{
intf_ErrMsg
(
"vcd error: IOServiceGetMatchingServices: 0x%08x"
,
ret
);
return
(
NULL
);
}
/* first service */
service
=
IOIteratorNext
(
iterator
);
IOObjectRelease
(
iterator
);
/* search for kIOCDMediaClass */
while
(
service
&&
!
IOObjectConformsTo
(
service
,
kIOCDMediaClass
)
)
{
if
(
(
ret
=
IORegistryEntryGetParentIterator
(
service
,
kIOServicePlane
,
&
iterator
)
)
!=
KERN_SUCCESS
)
{
intf_ErrMsg
(
"vcd error: "
\
"IORegistryEntryGetParentIterator: 0x%08x"
,
ret
);
IOObjectRelease
(
service
);
return
(
NULL
);
}
IOObjectRelease
(
service
);
service
=
IOIteratorNext
(
iterator
);
IOObjectRelease
(
iterator
);
}
if
(
service
==
NULL
)
{
intf_ErrMsg
(
"vcd error: search for kIOCDMediaClass came up empty"
);
return
(
NULL
);
}
/* create a CF dictionary containing the TOC */
if
(
(
ret
=
IORegistryEntryCreateCFProperties
(
service
,
&
properties
,
kCFAllocatorDefault
,
kNilOptions
)
)
!=
KERN_SUCCESS
)
{
intf_ErrMsg
(
"vcd error: "
\
" IORegistryEntryCreateCFProperties: 0x%08x"
,
ret
);
IOObjectRelease
(
service
);
return
(
NULL
);
}
/* get the TOC from the dictionary */
if
(
(
data
=
(
CFDataRef
)
CFDictionaryGetValue
(
properties
,
CFSTR
(
kIOCDMediaTOCKey
)
)
)
!=
NULL
)
{
CFRange
range
;
CFIndex
buf_len
;
buf_len
=
CFDataGetLength
(
data
)
+
1
;
range
=
CFRangeMake
(
0
,
buf_len
);
if
(
(
pTOC
=
(
CDTOC
*
)
malloc
(
buf_len
)
)
!=
NULL
)
{
CFDataGetBytes
(
data
,
range
,
(
u_char
*
)
pTOC
);
}
}
else
{
intf_ErrMsg
(
"vcd error: CFDictionaryGetValue failed"
);
}
CFRelease
(
properties
);
IOObjectRelease
(
service
);
return
(
pTOC
);
}
/****************************************************************************
* getNumberOfDescriptors: get number of descriptors in TOC
****************************************************************************/
int
getNumberOfDescriptors
(
CDTOC
*
pTOC
)
{
int
i_descriptors
;
/* get TOC length */
i_descriptors
=
pTOC
->
length
;
/* remove the first and last session */
i_descriptors
-=
(
sizeof
(
pTOC
->
sessionFirst
)
+
sizeof
(
pTOC
->
sessionLast
)
);
/* divide the length by the size of a single descriptor */
i_descriptors
/=
sizeof
(
CDTOCDescriptor
);
return
(
i_descriptors
);
}
/****************************************************************************
* getNumberOfTracks: get number of tracks in TOC
****************************************************************************/
int
getNumberOfTracks
(
CDTOC
*
pTOC
,
int
i_descriptors
)
{
u_char
track
;
int
i
,
i_tracks
=
0
;
CDTOCDescriptor
*
pTrackDescriptors
;
pTrackDescriptors
=
pTOC
->
descriptors
;
for
(
i
=
i_descriptors
;
i
>=
0
;
i
--
)
{
track
=
pTrackDescriptors
[
i
].
point
;
if
(
track
>
CD_MAX_TRACK_NO
||
track
<
CD_MIN_TRACK_NO
)
continue
;
i_tracks
++
;
}
return
(
i_tracks
);
}
#endif
plugins/vcd/
linux_
cdrom_tools.h
→
plugins/vcd/cdrom_tools.h
View file @
9400b572
/****************************************************************************
*
linux_cdrom_tools.h: linux
cdrom tools header
*
cdrom_tools.h:
cdrom tools header
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
* $Id: cdrom_tools.h,v 1.1 2002/02/20 05:50:00 jlj Exp $
*
* Author: Johan Bilien <jobi@via.ecp.fr>
*
...
...
@@ -20,12 +21,6 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#if defined(HAVE_BSD_DVD_STRUCT) || defined(DVD_STRUCT_IN_BSDI_DVDIOCTL_DVD_H) || defined(DVD_STRUCT_IN_DVD_H)
# include <dvd.h>
#else
# include <linux/cdrom.h>
#endif
/* where the data start on a VCD sector */
#define VCD_DATA_START 24
/* size of the availablr data on a VCD sector */
...
...
@@ -36,7 +31,7 @@
/******************************************************************************
* Prototypes *
******************************************************************************/
int
ioctl_GetTrackCount
(
int
);
int
*
ioctl_GetSectors
(
int
);
int
ioctl_GetTrackCount
(
int
,
const
char
*
psz_dev
);
int
*
ioctl_GetSectors
(
int
,
const
char
*
psz_dev
);
int
ioctl_ReadSector
(
int
,
int
,
byte_t
*
);
plugins/vcd/input_vcd.c
View file @
9400b572
...
...
@@ -59,7 +59,7 @@
#include "debug.h"
#include "input_vcd.h"
#include "
linux_
cdrom_tools.h"
#include "cdrom_tools.h"
/* how many blocks VCDRead will read in each loop */
#define VCD_BLOCKS_ONCE 4
...
...
@@ -217,7 +217,8 @@ static void VCDInit( input_thread_t * p_input )
p_vcd
->
i_handle
=
p_input
->
i_handle
;
/* We read the Table Of Content information */
p_vcd
->
nb_tracks
=
ioctl_GetTrackCount
(
p_input
->
i_handle
);
p_vcd
->
nb_tracks
=
ioctl_GetTrackCount
(
p_input
->
i_handle
,
p_input
->
p_source
);
if
(
p_vcd
->
nb_tracks
<
0
)
{
input_BuffersEnd
(
p_input
->
p_method_data
);
...
...
@@ -234,7 +235,8 @@ static void VCDInit( input_thread_t * p_input )
return
;
}
p_vcd
->
p_sectors
=
ioctl_GetSectors
(
p_input
->
i_handle
);
p_vcd
->
p_sectors
=
ioctl_GetSectors
(
p_input
->
i_handle
,
p_input
->
p_source
);
if
(
p_vcd
->
p_sectors
==
NULL
)
{
input_BuffersEnd
(
p_input
->
p_method_data
);
...
...
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