Commit d4f18c4e authored by Sam Hocevar's avatar Sam Hocevar

  * ./extras/MacOSX_dvdioctl: removed outdated files.
  * ./plugins/fx/scope.c: fixed an infinite loop error.
  * ./plugins: fixed segfaults in various demux plugins.
  * ./plugins/sdl/vout_sdl.c: SDL_VIDEODRIVER can be specified from the
    command line; try "--vout sdl:aalib"
parent aaee289a
......@@ -10,17 +10,10 @@ A typical way to configure vlc is:
See `./configure --help' for more information.
Here is a shortcut to copy-paste for a complete build:
make distclean ; ./configure --prefix=/usr --enable-gnome \
--enable-fb --with-glide --with-ggi --enable-esd --enable-qt
If you intend to debug stuff, you may want to compile with debugging
symbols:
make distclean ; ./configure --prefix=/usr --enable-gnome \
--enable-fb --with-glide --with-ggi --enable-esd --enable-qt \
--enable-debug
make distclean ; ./configure --prefix=/usr --enable-gnome --enable-debug
It is also possible to cross-compile for the Win32 platform using mingw32:
......
APPLE PUBLIC SOURCE LICENSE
Version 1.1 - April 19,1999
Please read this License carefully before downloading this software.
By downloading and using this software, you are agreeing to be bound
by the terms of this License. If you do not or cannot agree to the
terms of this License, please do not download or use the software.
1. General; Definitions. This License applies to any program or other
work which Apple Computer, Inc. ("Apple") publicly announces as
subject to this Apple Public Source License and which contains a
notice placed by Apple identifying such program or work as "Original
Code" and stating that it is subject to the terms of this Apple Public
Source License version 1.1 (or subsequent version thereof), as it may
be revised from time to time by Apple ("License"). As used in this
License:
1.1 "Affected Original Code" means only those specific portions of
Original Code that allegedly infringe upon any party's intellectual
property rights or are otherwise the subject of a claim of
infringement.
1.2 "Applicable Patent Rights" mean: (a) in the case where Apple is
the grantor of rights, (i) claims of patents that are now or hereafter
acquired, owned by or assigned to Apple and (ii) that cover subject
matter contained in the Original Code, but only to the extent
necessary to use, reproduce and/or distribute the Original Code
without infringement; and (b) in the case where You are the grantor of
rights, (i) claims of patents that are now or hereafter acquired,
owned by or assigned to You and (ii) that cover subject matter in Your
Modifications, taken alone or in combination with Original Code.
1.3 "Covered Code" means the Original Code, Modifications, the
combination of Original Code and any Modifications, and/or any
respective portions thereof.
1.4 "Deploy" means to use, sublicense or distribute Covered Code other
than for Your internal research and development (R&D), and includes
without limitation, any and all internal use or distribution of
Covered Code within Your business or organization except for R&D use,
as well as direct or indirect sublicensing or distribution of Covered
Code by You to any third party in any form or manner.
1.5 "Larger Work" means a work which combines Covered Code or portions
thereof with code not governed by the terms of this License.
1.6 "Modifications" mean any addition to, deletion from, and/or change
to, the substance and/or structure of Covered Code. When code is
released as a series of files, a Modification is: (a) any addition to
or deletion from the contents of a file containing Covered Code;
and/or (b) any new file or other representation of computer program
statements that contains any part of Covered Code.
1.7 "Original Code" means (a) the Source Code of a program or other
work as originally made available by Apple under this License,
including the Source Code of any updates or upgrades to such programs
or works made available by Apple under this License, and that has been
expressly identified by Apple as such in the header file(s) of such
work; and (b) the object code compiled from such Source Code and
originally made available by Apple under this License.
1.8 "Source Code" means the human readable form of a program or other
work that is suitable for making modifications to it, including all
modules it contains, plus any associated interface definition files,
scripts used to control compilation and installation of an executable
(object code).
1.9 "You" or "Your" means an individual or a legal entity exercising
rights under this License. For legal entities, "You" or "Your"
includes any entity which controls, is controlled by, or is under
common control with, You, where "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of fifty percent
(50%) or more of the outstanding shares or beneficial ownership of
such entity.
2. Permitted Uses; Conditions & Restrictions. Subject to the terms
and conditions of this License, Apple hereby grants You, effective on
the date You accept this License and download the Original Code, a
world-wide, royalty-free, non- exclusive license, to the extent of
Apple's Applicable Patent Rights and copyrights covering the Original
Code, to do the following:
2.1 You may use, copy, modify and distribute Original Code, with or
without Modifications, solely for Your internal research and
development, provided that You must in each instance:
(a) retain and reproduce in all copies of Original Code the copyright
and other proprietary notices and disclaimers of Apple as they appear
in the Original Code, and keep intact all notices in the Original Code
that refer to this License;
(b) include a copy of this License with every copy of Source Code of
Covered Code and documentation You distribute, and You may not offer
or impose any terms on such Source Code that alter or restrict this
License or the recipients' rights hereunder, except as permitted under
Section 6; and
(c) completely and accurately document all Modifications that you have
made and the date of each such Modification, designate the version of
the Original Code you used, prominently include a file carrying such
information with the Modifications, and duplicate the notice in
Exhibit A in each file of the Source Code of all such Modifications.
2.2 You may Deploy Covered Code, provided that You must in each
instance:
(a) satisfy all the conditions of Section 2.1 with respect to the
Source Code of the Covered Code;
(b) make all Your Deployed Modifications publicly available in Source
Code form via electronic distribution (e.g. download from a web site)
under the terms of this License and subject to the license grants set
forth in Section 3 below, and any additional terms You may choose to
offer under Section 6. You must continue to make the Source Code of
Your Deployed Modifications available for as long as you Deploy the
Covered Code or twelve (12) months from the date of initial
Deployment, whichever is longer;
(c) if You Deploy Covered Code containing Modifications made by You,
inform others of how to obtain those Modifications by filling out and
submitting the information found at
http://www.apple.com/publicsource/modifications.html, if available;
and
(d) if You Deploy Covered Code in object code, executable form only,
include a prominent notice, in the code itself as well as in related
documentation, stating that Source Code of the Covered Code is
available under the terms of this License with information on how and
where to obtain such Source Code.
3. Your Grants. In consideration of, and as a condition to, the
licenses granted to You under this License:
(a) You hereby grant to Apple and all third parties a non-exclusive,
royalty-free license, under Your Applicable Patent Rights and other
intellectual property rights owned or controlled by You, to use,
reproduce, modify, distribute and Deploy Your Modifications of the
same scope and extent as Apple's licenses under Sections 2.1 and 2.2;
and
(b) You hereby grant to Apple and its subsidiaries a non-exclusive,
worldwide, royalty-free, perpetual and irrevocable license, under Your
Applicable Patent Rights and other intellectual property rights owned
or controlled by You, to use, reproduce, execute, compile, display,
perform, modify or have modified (for Apple and/or its subsidiaries),
sublicense and distribute Your Modifications, in any form, through
multiple tiers of distribution.
4. Larger Works. You may create a Larger Work by combining Covered
Code with other code not governed by the terms of this License and
distribute the Larger Work as a single product. In each such
instance, You must make sure the requirements of this License are
fulfilled for the Covered Code or any portion thereof.
5. Limitations on Patent License. Except as expressly stated in
Section 2, no other patent rights, express or implied, are granted by
Apple herein. Modifications and/or Larger Works may require
additional patent licenses from Apple which Apple may grant in its
sole discretion.
6. Additional Terms. You may choose to offer, and to charge a fee
for, warranty, support, indemnity or liability obligations and/or
other rights consistent with the scope of the license granted herein
("Additional Terms") to one or more recipients of Covered
Code. However, You may do so only on Your own behalf and as Your sole
responsibility, and not on behalf of Apple. You must obtain the
recipient's agreement that any such Additional Terms are offered by
You alone, and You hereby agree to indemnify, defend and hold Apple
harmless for any liability incurred by or claims asserted against
Apple by reason of any such Additional Terms.
7. Versions of the License. Apple may publish revised and/or new
versions of this License from time to time. Each version will be
given a distinguishing version number. Once Original Code has been
published under a particular version of this License, You may continue
to use it under the terms of that version. You may also choose to use
such Original Code under the terms of any subsequent version of this
License published by Apple. No one other than Apple has the right to
modify the terms applicable to Covered Code created under this
License.
8. NO WARRANTY OR SUPPORT. The Original Code may contain in whole or
in part pre-release, untested, or not fully tested works. The
Original Code may contain errors that could cause failures or loss of
data, and may be incomplete or contain inaccuracies. You expressly
acknowledge and agree that use of the Original Code, or any portion
thereof, is at Your sole and entire risk. THE ORIGINAL CODE IS
PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND
AND APPLE AND APPLE'S LICENSOR(S) (FOR THE PURPOSES OF SECTIONS 8 AND
9, APPLE AND APPLE'S LICENSOR(S) ARE COLLECTIVELY REFERRED TO AS
"APPLE") EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
AND/OR CONDITIONS OF MERCHANTABILITY OR SATISFACTORY QUALITY AND
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
RIGHTS. APPLE DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE
ORIGINAL CODE WILL MEET YOUR REQUIREMENTS, OR THAT THE OPERATION OF
THE ORIGINAL CODE WILL BE UNINTERRUPTED OR ERROR- FREE, OR THAT
DEFECTS IN THE ORIGINAL CODE WILL BE CORRECTED. NO ORAL OR WRITTEN
INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED
REPRESENTATIVE SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE
SCOPE OF THIS WARRANTY. You acknowledge that the Original Code is not
intended for use in the operation of nuclear facilities, aircraft
navigation, communication systems, or air traffic control machines in
which case the failure of the Original Code could lead to death,
personal injury, or severe physical or environmental damage.
9. Liability.
9.1 Infringement. If any portion of, or functionality implemented by,
the Original Code becomes the subject of a claim of infringement,
Apple may, at its option: (a) attempt to procure the rights necessary
for Apple and You to continue using the Affected Original Code; (b)
modify the Affected Original Code so that it is no longer infringing;
or (c) suspend Your rights to use, reproduce, modify, sublicense and
distribute the Affected Original Code until a final determination of
the claim is made by a court or governmental administrative agency of
competent jurisdiction and Apple lifts the suspension as set forth
below. Such suspension of rights will be effective immediately upon
Apple's posting of a notice to such effect on the Apple web site that
is used for implementation of this License. Upon such final
determination being made, if Apple is legally able, without the
payment of a fee or royalty, to resume use, reproduction,
modification, sublicensing and distribution of the Affected Original
Code, Apple will lift the suspension of rights to the Affected
Original Code by posting a notice to such effect on the Apple web site
that is used for implementation of this License. If Apple suspends
Your rights to Affected Original Code, nothing in this License shall
be construed to restrict You, at Your option and subject to applicable
law, from replacing the Affected Original Code with non-infringing
code or independently negotiating for necessary rights from such third
party.
9.2 LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES SHALL APPLE BE
LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES
ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO
USE THE ORIGINAL CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY
OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY
OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF
ANY REMEDY. In no event shall Apple's total liability to You for all
damages under this License exceed the amount of fifty dollars
($50.00).
10. Trademarks. This License does not grant any rights to use the
trademarks or trade names "Apple", "Apple Computer", "Mac OS X", "Mac
OS X Server" or any other trademarks or trade names belonging to Apple
(collectively "Apple Marks") and no Apple Marks may be used to endorse
or promote products derived from the Original Code other than as
permitted by and in strict compliance at all times with Apple's third
party trademark usage guidelines which are posted at
http://www.apple.com/legal/guidelinesfor3rdparties.html.
11. Ownership. Apple retains all rights, title and interest in and to
the Original Code and any Modifications made by or on behalf of Apple
("Apple Modifications"), and such Apple Modifications will not be
automatically subject to this License. Apple may, at its sole
discretion, choose to license such Apple Modifications under this
License, or on different terms from those contained in this License or
may choose not to license them at all. Apple's development, use,
reproduction, modification, sublicensing and distribution of Covered
Code will not be subject to this License.
12. Termination.
12.1 Termination. This License and the rights granted hereunder will
terminate:
(a) automatically without notice from Apple if You fail to comply with
any term(s) of this License and fail to cure such breach within 30
days of becoming aware of such breach; (b) immediately in the event of
the circumstances described in Section 13.5(b); or (c) automatically
without notice from Apple if You, at any time during the term of this
License, commence an action for patent infringement against Apple.
12.2 Effect of Termination. Upon termination, You agree to
immediately stop any further use, reproduction, modification,
sublicensing and distribution of the Covered Code and to destroy all
copies of the Covered Code that are in your possession or control.
All sublicenses to the Covered Code which have been properly granted
prior to termination shall survive any termination of this License.
Provisions which, by their nature, should remain in effect beyond the
termination of this License shall survive, including but not limited
to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. Neither party will be
liable to the other for compensation, indemnity or damages of any sort
solely as a result of terminating this License in accordance with its
terms, and termination of this License will be without prejudice to
any other right or remedy of either party.
13. Miscellaneous.
13.1 Government End Users. The Covered Code is a "commercial item" as
defined in FAR 2.101. Government software and technical data rights
in the Covered Code include only those rights customarily provided to
the public as defined in this License. This customary commercial
license in technical data and software is provided in accordance with
FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for
Department of Defense purchases, DFAR 252.227-7015 (Technical Data --
Commercial Items) and 227.7202-3 (Rights in Commercial Computer
Software or Computer Software Documentation). Accordingly, all U.S.
Government End Users acquire Covered Code with only those rights set
forth herein.
13.2 Relationship of Parties. This License will not be construed as
creating an agency, partnership, joint venture or any other form of
legal association between You and Apple, and You will not represent to
the contrary, whether expressly, by implication, appearance or
otherwise.
13.3 Independent Development. Nothing in this License will impair
Apple's right to acquire, license, develop, have others develop for
it, market and/or distribute technology or products that perform the
same or similar functions as, or otherwise compete with,
Modifications, Larger Works, technology or products that You may
develop, produce, market or distribute.
13.4 Waiver; Construction. Failure by Apple to enforce any provision
of this License will not be deemed a waiver of future enforcement of
that or any other provision. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
will not apply to this License.
13.5 Severability. (a) If for any reason a court of competent
jurisdiction finds any provision of this License, or portion thereof,
to be unenforceable, that provision of the License will be enforced to
the maximum extent permissible so as to effect the economic benefits
and intent of the parties, and the remainder of this License will
continue in full force and effect. (b) Notwithstanding the foregoing,
if applicable law prohibits or restricts You from fully and/or
specifically complying with Sections 2 and/or 3 or prevents the
enforceability of either of those Sections, this License will
immediately terminate and You must immediately discontinue any use of
the Covered Code and destroy all copies of it that are in your
possession or control.
13.6 Dispute Resolution. Any litigation or other dispute resolution
between You and Apple relating to this License shall take place in the
Northern District of California, and You and Apple hereby consent to
the personal jurisdiction of, and venue in, the state and federal
courts within that District with respect to this License. The
application of the United Nations Convention on Contracts for the
International Sale of Goods is expressly excluded.
13.7 Entire Agreement; Governing Law. This License constitutes the
entire agreement between the parties with respect to the subject
matter hereof. This License shall be governed by the laws of the
United States and the State of California, except that body of
California law concerning conflicts of law.
Where You are located in the province of Quebec, Canada, the following
clause applies: The parties hereby confirm that they have requested
that this License and all related documents be drafted in English. Les
parties ont exige que le present contrat et tous les documents
connexes soient rediges en anglais.
EXHIBIT A.
"Portions Copyright (c) 1999-2000 Apple Computer, Inc. All Rights
Reserved. This file contains Original Code and/or Modifications of
Original Code as defined in and that are subject to the Apple Public
Source License Version 1.1 (the "License"). You may not use this file
except in compliance with the License. Please obtain a copy of the
License at http://www.apple.com/publicsource and read it before using
this file.
The Original Code and all software distributed under the License are
distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
License for the specific language governing rights and limitations
under the License."
/*****************************************************************************
* DVDioctl.cpp: Linux-like DVD driver for Darwin and MacOS X
*****************************************************************************
* Copyright (C) 1998-2000 Apple Computer, Inc. All rights reserved.
* Copyright (C) 2001 VideoLAN
* $Id: DVDioctl.cpp,v 1.7 2001/06/25 11:34:08 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Eugenio Jarosiewicz <ej0@cise.ufl.edu>
*
* The contents of this file constitute Original Code as defined in and
* are subject to the Apple Public Source License Version 1.1 (the
* "License"). You may not use this file except in compliance with the
* License. Please obtain a copy of the License at
* http://www.apple.com/publicsource and read it before using this file.
*
* This Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
*****************************************************************************/
/*****************************************************************************
* TODO:
* - add a timeout to waitForService() so that we don't wait forever
* - find a way to prevent user from ejecting DVD using the GUI while
* it is still in use
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
extern "C"
{
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/syslog.h>
#include <sys/systm.h>
#include <sys/ioccom.h>
#include <sys/fcntl.h>
#include <sys/buf.h>
#include <sys/uio.h>
#include <miscfs/devfs/devfs.h>
#include <mach/mach_types.h>
}
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
#include <IOKit/storage/IOMedia.h>
#include <IOKit/storage/IODVDMedia.h>
#include <IOKit/storage/IODVDBlockStorageDriver.h>
#undef CONTROL //some include above #defines this and breaks the next include...grr.
#include <IOKit/scsi-commands/IOSCSIMultimediaCommandsDevice.h>
#include <IOKit/scsi-commands/IODVDServices.h>
#include "DVDioctl.h"
/*****************************************************************************
* Driver class
*****************************************************************************/
class DVDioctl : public IOService
{
OSDeclareDefaultStructors( DVDioctl )
public:
virtual bool init ( OSDictionary *dictionary = 0 );
virtual IOService *probe ( IOService *provider, SInt32 *score );
virtual bool start ( IOService *provider );
virtual void stop ( IOService *provider );
virtual void free ( void );
};
#define super IOService
OSDefineMetaClassAndStructors( DVDioctl, IOService )
/*****************************************************************************
* Variable typedefs
*****************************************************************************/
typedef enum { DKRTYPE_BUF, DKRTYPE_DIO } dkrtype_t;
typedef struct dio { dev_t dev; struct uio * uio; } dio_t;
typedef struct buf buf_t;
typedef void * dkr_t;
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static int DVDClose ( dev_t, int, int, struct proc * );
static int DVDBlockIoctl ( dev_t, u_long, caddr_t, int, struct proc * );
static int DVDOpen ( dev_t, int, int, struct proc * );
static int DVDSize ( dev_t );
static void DVDStrategy ( buf_t * );
static int DVDReadWrite ( dkr_t, dkrtype_t );
static void DVDReadWriteCompletion( void *, void *, IOReturn, UInt64 );
static struct bdevsw device_functions =
{
DVDOpen, DVDClose, DVDStrategy, DVDBlockIoctl, eno_dump, DVDSize, D_DISK
};
/*****************************************************************************
* Local variables
*****************************************************************************/
static DVDioctl * p_this = NULL;
static bool b_inuse;
static int i_major;
static void *p_node;
static IODVDMedia *p_dvd;
static IODVDBlockStorageDriver *p_drive;
static IODVDServices *p_services;
static IOSCSIMultimediaCommandsDevice *p_scsi_mcd;
/*****************************************************************************
* DKR_GET_DEV: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline dev_t DKR_GET_DEV(dkr_t dkr, dkrtype_t dkrtype)
{
return (dkrtype == DKRTYPE_BUF)
? ((buf_t *)dkr)->b_dev : ((dio_t *)dkr)->dev;
}
/*****************************************************************************
* DKR_GET_BYTE_COUNT: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline UInt64 DKR_GET_BYTE_COUNT(dkr_t dkr, dkrtype_t dkrtype)
{
return (dkrtype == DKRTYPE_BUF)
? ((buf_t *)dkr)->b_bcount : ((dio_t *)dkr)->uio->uio_resid;
}
/*****************************************************************************
* DKR_GET_BYTE_START: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline UInt64 DKR_GET_BYTE_START(dkr_t dkr, dkrtype_t dkrtype)
{
if (dkrtype == DKRTYPE_BUF)
{
buf_t * bp = (buf_t *)dkr;
return bp->b_blkno * p_dvd->getPreferredBlockSize();
}
return ((dio_t *)dkr)->uio->uio_offset;
}
/*****************************************************************************
* DKR_IS_READ: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline bool DKR_IS_READ(dkr_t dkr, dkrtype_t dkrtype)
{
return (dkrtype == DKRTYPE_BUF)
? ((((buf_t *)dkr)->b_flags & B_READ) == B_READ)
: ((((dio_t *)dkr)->uio->uio_rw) == UIO_READ);
}
/*****************************************************************************
* DKR_IS_ASYNCHRONOUS: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline bool DKR_IS_ASYNCHRONOUS(dkr_t dkr, dkrtype_t dkrtype)
{
return (dkrtype == DKRTYPE_BUF) ? true : false;
}
/*****************************************************************************
* DKR_IS_RAW: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline bool DKR_IS_RAW(dkr_t dkr, dkrtype_t dkrtype)
{
return (dkrtype == DKRTYPE_BUF) ? false : true;
}
/*****************************************************************************
* DKR_SET_BYTE_COUNT: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline void DKR_SET_BYTE_COUNT(dkr_t dkr, dkrtype_t dkrtype, UInt64 bcount)
{
if (dkrtype == DKRTYPE_BUF)
{
((buf_t *)dkr)->b_resid = ((buf_t *)dkr)->b_bcount - bcount;
}
else
{
((dio_t *)dkr)->uio->uio_resid -= bcount;
}
}
/*****************************************************************************
* DKR_RUN_COMPLETION: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline void DKR_RUN_COMPLETION(dkr_t dkr, dkrtype_t dkrtype, IOReturn status)
{
if (dkrtype == DKRTYPE_BUF)
{
buf_t * bp = (buf_t *)dkr;
bp->b_error = p_this->errnoFromReturn(status);
bp->b_flags |= (status != kIOReturnSuccess) ? B_ERROR : 0;
biodone(bp);
}
}
/*****************************************************************************
* DKR_GET_BUFFER: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static inline IOMemoryDescriptor * DKR_GET_BUFFER(dkr_t dkr, dkrtype_t dkrtype)
{
if (dkrtype == DKRTYPE_BUF)
{
buf_t * bp = (buf_t *)dkr;
if ( (bp->b_flags & B_VECTORLIST) )
{
assert(sizeof(IOPhysicalRange ) == sizeof(iovec ));
assert(sizeof(IOPhysicalRange::address) == sizeof(iovec::iov_base));
assert(sizeof(IOPhysicalRange::length ) == sizeof(iovec::iov_len ));
return IOMemoryDescriptor::withPhysicalRanges(
(IOPhysicalRange *) bp->b_vectorlist,
(UInt32) bp->b_vectorcount,
(bp->b_flags & B_READ) ? kIODirectionIn : kIODirectionOut,
true );
}
return IOMemoryDescriptor::withAddress(
(vm_address_t) bp->b_data,
(vm_size_t) bp->b_bcount,
(bp->b_flags & B_READ) ? kIODirectionIn : kIODirectionOut,
(bp->b_flags & B_PHYS) ? current_task() : kernel_task );
}
else
{
struct uio * uio = ((dio_t *)dkr)->uio;
assert(sizeof(IOVirtualRange ) == sizeof(iovec ));
assert(sizeof(IOVirtualRange::address) == sizeof(iovec::iov_base));
assert(sizeof(IOVirtualRange::length ) == sizeof(iovec::iov_len ));
return IOMemoryDescriptor::withRanges(
(IOVirtualRange *) uio->uio_iov,
(UInt32) uio->uio_iovcnt,
(uio->uio_rw == UIO_READ ) ? kIODirectionIn : kIODirectionOut,
(uio->uio_segflg != UIO_SYSSPACE) ? current_task() : kernel_task,
true );
}
}
/*****************************************************************************
* DVDioctl::init: initialize the driver structure
*****************************************************************************/
bool DVDioctl::init( OSDictionary *p_dict = 0 )
{
//IOLog( "DVD ioctl: initializing\n" );
p_this = this;
p_node = NULL;
p_dvd = NULL;
p_drive = NULL;
p_services = NULL;
p_scsi_mcd = NULL;
i_major = -1;
b_inuse = false;
bool res = super::init( p_dict );
return res;
}
/*****************************************************************************
* DVDioctl::probe: check whether the driver can be safely activated
*****************************************************************************/
IOService * DVDioctl::probe( IOService *provider, SInt32 *score )
{
//IOLog( "DVD ioctl: probing\n" );
IOService * res = super::probe( provider, score );
return res;
}
/*****************************************************************************
* DVDioctl::start: start the driver
*****************************************************************************/
bool DVDioctl::start( IOService *provider )
{
//IOLog( "DVD ioctl: starting\n" );
if( !super::start( provider ) )
{
return false;
}
//IOLog( "DVD ioctl: creating device\n" );
i_major = bdevsw_add( -1, &device_functions );
if( i_major == -1 )
{
//log(LOG_INFO, "DVD ioctl: failed to allocate a major number\n");
return false;
}
p_node = devfs_make_node ( makedev( i_major, 0 ), DEVFS_BLOCK,
UID_ROOT, GID_WHEEL, 0666, "dvd" );
if( p_node == NULL )
{
//log( LOG_INFO, "DVD ioctl: failed creating node\n" );
if( bdevsw_remove(i_major, &device_functions) == -1 )
{
//log( LOG_INFO, "DVD ioctl: bdevsw_remove failed\n" );
}
return false;
}
return true;
}
/*****************************************************************************
* DVDioctl::stop: stop the driver
*****************************************************************************/
void DVDioctl::stop( IOService *provider )
{
//IOLog( "DVD ioctl: removing device\n" );
if( p_node != NULL )
{
devfs_remove( p_node );
}
if( i_major != -1 )
{
if( bdevsw_remove(i_major, &device_functions) == -1 )
{
//log( LOG_INFO, "DVD ioctl: bdevsw_remove failed\n" );
}
}
//IOLog( "DVD ioctl: stopping\n" );
super::stop( provider );
}
/*****************************************************************************
* DVDioctl::free: free all resources allocated by the driver
*****************************************************************************/
void DVDioctl::free( void )
{
//IOLog( "DVD ioctl: freeing\n" );
super::free( );
}
/* following functions are local */
/*****************************************************************************
* DVDOpen: look for an IODVDMedia object and open it
*****************************************************************************/
static int DVDOpen( dev_t dev, int flags, int devtype, struct proc * )
{
IOStorageAccess level;
/* Check that the device hasn't already been opened */
if( b_inuse )
{
//log( LOG_INFO, "DVD ioctl: already opened\n" );
return EBUSY;
}
else
{
b_inuse = true;
}
IOService * p_root = IOService::getServiceRoot();
if( p_root == NULL )
{
//log( LOG_INFO, "DVD ioctl: couldn't find root\n" );
b_inuse = false;
return ENXIO;
}
OSDictionary * p_dict = p_root->serviceMatching( kIODVDMediaClass );
if( p_dict == NULL )
{
//log( LOG_INFO, "DVD ioctl: couldn't find dictionary\n" );
b_inuse = false;
return ENXIO;
}
p_dvd = OSDynamicCast( IODVDMedia, p_root->waitForService( p_dict ) );
if( p_dvd == NULL )
{
//log( LOG_INFO, "DVD ioctl: couldn't find service\n" );
b_inuse = false;
return ENXIO;
}
//log( LOG_INFO, "DVD ioctl: found DVD\n" );
level = (flags & FWRITE) ? kIOStorageAccessReaderWriter
: kIOStorageAccessReader;
if( ! p_dvd->open( p_this, 0, level) )
{
log( LOG_INFO, "DVD ioctl: IODVDMedia object busy\n" );
b_inuse = false;
return EBUSY;
}
p_drive = p_dvd->getProvider();
p_services = OSDynamicCast( IODVDServices, p_drive->getProvider() );
p_scsi_mcd = OSDynamicCast( IOSCSIMultimediaCommandsDevice, p_services->getProvider() );
log( LOG_INFO, "DVD ioctl: IODVDMedia->open()\n" );
return 0;
}
/*****************************************************************************
* DVDClose: close the IODVDMedia object
*****************************************************************************/
static int DVDClose( dev_t dev, int flags, int devtype, struct proc * )
{
/* Release the device */
p_dvd->close( p_this );
p_dvd = NULL;
p_drive = NULL;
p_services = NULL;
p_scsi_mcd = NULL;
b_inuse = false;
log( LOG_INFO, "DVD ioctl: IODVDMedia->close()\n" );
return 0;
}
/*****************************************************************************
* DVDSize: return the device size
*****************************************************************************/
static int DVDSize( dev_t dev )
{
return p_dvd->getPreferredBlockSize();
}
/*****************************************************************************
* DVDStrategy: perform read or write operations
*****************************************************************************/
static void DVDStrategy( buf_t * bp )
{
DVDReadWrite(bp, DKRTYPE_BUF);
return;
}
/*****************************************************************************
* DVDBlockIoctl: issue an ioctl on the block device
*****************************************************************************/
static int DVDBlockIoctl( dev_t dev, u_long cmd, caddr_t addr, int flags,
struct proc *p )
{
#define p_data (((dvdioctl_data_t *)addr))
IOReturn i_ret = EINVAL;
/* Only needed for IODVD_READ_STRUCTURE */
SCSITask *p_request;
SCSIServiceResponse response;
IOMemoryDescriptor *p_mem;
p_mem = IOMemoryDescriptor::withAddress( p_data->p_buffer,
p_data->i_size,
kIODirectionOutIn );
switch( cmd )
{
case IODVD_READ_STRUCTURE:
log( LOG_INFO, "DVD ioctl: IODVD_READ_STRUCTURE\n" );
i_ret = kIOReturnUnsupported;
response = kSCSIServiceResponse_SERVICE_DELIVERY_OR_TARGET_FAILURE;
/* HACK! - Make GetSCSITask and friends in /System/Library/Frameworks/Kernel.framework/Versions/A/Headers/IOKit/scsi-commands/IOSCSIPrimaryCommandsDevice.h public by moving public: from line 96 to line 79 (as root). It's only a compile time check - not a link time thing, so it should be ok. */
p_request = p_scsi_mcd->GetSCSITask( );
if ( p_scsi_mcd->READ_DVD_STRUCTURE ( p_request,
p_mem,
p_data->i_lba,
0,//?LAYER_NUMBER
p_data->i_keyformat,
p_mem->getLength(),//p_data->i_size ?
p_data->i_agid,
0x00 //?CONTROL
) == true )
{
/* The command was successfully built, now send it */
response = p_scsi_mcd->SendCommand( p_request );
}
else
{
#if 0
exit -1;
PANIC_NOW(( "IOSCSIMultimediaCommandsDevice:: "
"readDVDstruct malformed command" ));
#endif
}
if( ( response == kSCSIServiceResponse_TASK_COMPLETE ) &&
( p_request->GetTaskStatus ( ) == kSCSITaskStatus_GOOD ) )
{
i_ret = kIOReturnSuccess;
}
else
{
i_ret = kIOReturnError;
}
p_scsi_mcd->ReleaseSCSITask( p_request );
}
break;
case IODVD_SEND_KEY:
log( LOG_INFO, "DVD ioctl: send key to `%s', "
"buf %d, class %d, lba N/A, agid %d, format %d\n",
p_drive->getDeviceTypeName(),
(int)p_data->p_buffer, p_data->i_keyclass,
p_data->i_agid, p_data->i_keyformat );
i_ret = p_drive->sendKey( p_mem, (DVDKeyClass)p_data->i_keyclass,
p_data->i_agid,
(DVDKeyFormat)p_data->i_keyformat );
break;
case IODVD_REPORT_KEY:
log( LOG_INFO, "DVD ioctl: report key from `%s', "
"buf %d, class %d, lba %d, agid %d, format %d\n",
p_drive->getDeviceTypeName(),
(int)p_data->p_buffer, p_data->i_keyclass, p_data->i_lba,
p_data->i_agid, p_data->i_keyformat );
i_ret = p_drive->reportKey( p_mem, (DVDKeyClass)p_data->i_keyclass,
p_data->i_lba, p_data->i_agid,
(DVDKeyFormat)p_data->i_keyformat );
break;
default:
log( LOG_INFO, "DVD ioctl: unknown ioctl\n" );
i_ret = EINVAL;
break;
}
return i_ret;
#undef p_data
}
/*****************************************************************************
* DVDReadWrite: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static int DVDReadWrite(dkr_t dkr, dkrtype_t dkrtype)
{
IOMemoryDescriptor * buffer;
register UInt64 byteCount;
register UInt64 byteStart;
UInt64 mediaSize;
IOReturn status;
byteCount = DKR_GET_BYTE_COUNT(dkr, dkrtype);
byteStart = DKR_GET_BYTE_START(dkr, dkrtype);
mediaSize = p_dvd->getSize();
if ( byteStart >= mediaSize )
{
status = DKR_IS_READ(dkr,dkrtype) ? kIOReturnSuccess : kIOReturnIOError; goto dkreadwriteErr;
}
if ( DKR_IS_RAW(dkr, dkrtype) )
{
UInt64 mediaBlockSize = p_dvd->getPreferredBlockSize();
if ( (byteStart % mediaBlockSize) || (byteCount % mediaBlockSize) )
{
status = kIOReturnNotAligned;
goto dkreadwriteErr;
}
}
buffer = DKR_GET_BUFFER(dkr, dkrtype);
if ( buffer == 0 )
{
status = kIOReturnNoMemory;
goto dkreadwriteErr;
}
if ( byteCount > mediaSize - byteStart )
{
IOMemoryDescriptor * originalBuffer = buffer;
buffer = IOMemoryDescriptor::withSubRange( originalBuffer, 0,
mediaSize - byteStart, originalBuffer->getDirection() );
originalBuffer->release();
if ( buffer == 0 )
{
status = kIOReturnNoMemory;
goto dkreadwriteErr;
}
}
if ( DKR_IS_ASYNCHRONOUS(dkr, dkrtype) )
{
IOStorageCompletion completion;
completion.target = dkr;
completion.action = DVDReadWriteCompletion;
completion.parameter = (void *) dkrtype;
if ( DKR_IS_READ(dkr, dkrtype) )
{
p_dvd->read( p_this, byteStart, buffer, completion );
}
else
{
p_dvd->write( p_this, byteStart, buffer, completion );
}
status = kIOReturnSuccess;
}
else
{
if ( DKR_IS_READ(dkr, dkrtype) )
{
status = p_dvd->IOStorage::read( p_this, byteStart,
buffer, &byteCount );
}
else
{
status = p_dvd->IOStorage::write( p_this, byteStart,
buffer, &byteCount );
}
DVDReadWriteCompletion(dkr, (void *)dkrtype, status, byteCount);
}
buffer->release();
return p_this->errnoFromReturn(status);
dkreadwriteErr:
DVDReadWriteCompletion(dkr, (void *)dkrtype, status, 0);
return p_this->errnoFromReturn(status);
}
/*****************************************************************************
* DVDReadWriteCompletion: borrowed from IOMediaBSDClient.cpp
*****************************************************************************/
static void DVDReadWriteCompletion( void * target,
void * parameter,
IOReturn status,
UInt64 actualByteCount )
{
dkr_t dkr = (dkr_t) target;
dkrtype_t dkrtype = (dkrtype_t) (int) parameter;
dev_t dev = DKR_GET_DEV(dkr, dkrtype);
if ( status != kIOReturnSuccess )
{
IOLog( "DVD ioctl: %s (is the disc authenticated ?)\n",
p_this->stringFromReturn(status) );
}
DKR_SET_BYTE_COUNT(dkr, dkrtype, actualByteCount);
DKR_RUN_COMPLETION(dkr, dkrtype, status);
}
/*****************************************************************************
* DVDioctl.h: Linux-like DVD driver for Darwin and MacOS X
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: DVDioctl.h,v 1.4 2001/06/25 11:34:08 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Eugenio Jarosiewicz <ej0@cise.ufl.edu>
*
* The contents of this file constitute Original Code as defined in and
* are subject to the Apple Public Source License Version 1.1 (the
* "License"). You may not use this file except in compliance with the
* License. Please obtain a copy of the License at
* http://www.apple.com/publicsource and read it before using this file.
*
* This Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
*****************************************************************************/
#if defined(KERNEL)
/* Everything has already been defined */
#else
enum DVDKeyFormat
{
kCSSAGID = 0x00,
kChallengeKey = 0x01,
kKey1 = 0x02,
kKey2 = 0x03,
kTitleKey = 0x04,
kASF = 0x05,
kSetRegion = 0x06,
kRPCState = 0x08,
kCSS2AGID = 0x10,
kCPRMAGID = 0x11,
kInvalidateAGID = 0x3f
};
enum DVDKeyClass
{
kCSS_CSS2_CPRM = 0x00,
kRSSA = 0x01
};
#endif
typedef struct dvdioctl_data
{
void *p_buffer;
#if defined(KERNEL)
UInt32 i_size;
UInt32 i_lba;
UInt8 i_agid;
#else
u32 i_size;
u32 i_lba;
u8 i_agid;
#endif
int i_keyclass;
int i_keyformat;
} dvdioctl_data_t;
#define IODVD_READ_STRUCTURE _IOWR('B', 1, dvdioctl_data_t)
#define IODVD_SEND_KEY _IOWR('B', 2, dvdioctl_data_t)
#define IODVD_REPORT_KEY _IOWR('B', 3, dvdioctl_data_t)
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 32;
objects = {
06AA1264FFB2107B11CA28AA = {
buildActionMask = 2147483647;
files = (
);
generatedFileNames = (
);
isa = PBXShellScriptBuildPhase;
name = "Shell Script";
neededFileNames = (
);
shellPath = /bin/sh;
shellScript = "script=\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPostprocess\";\nif [ -x \"$script\" ]; then\n . \"$script\"\nfi";
};
06AA1265FFB2107B11CA28AA = {
buildRules = (
);
buildSettings = {
COPY_PHASE_STRIP = NO;
};
isa = PBXBuildStyle;
name = Development;
};
06AA1266FFB2107B11CA28AA = {
buildRules = (
);
buildSettings = {
COPY_PHASE_STRIP = YES;
};
isa = PBXBuildStyle;
name = Deployment;
};
06AA1267FFB2110C11CA28AA = {
buildActionMask = 2147483647;
files = (
);
generatedFileNames = (
);
isa = PBXShellScriptBuildPhase;
name = "Shell Script";
neededFileNames = (
);
shellPath = /bin/sh;
shellScript = "script=\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPreprocess\";\nif [ -x \"$script\" ]; then\n . \"$script\"\nfi";
};
089C1669FE841209C02AAC07 = {
buildStyles = (
06AA1265FFB2107B11CA28AA,
06AA1266FFB2107B11CA28AA,
);
isa = PBXProject;
mainGroup = 089C166AFE841209C02AAC07;
projectDirPath = .;
targets = (
089C1673FE841209C02AAC07,
);
};
089C166AFE841209C02AAC07 = {
children = (
247142CAFF3F8F9811CA285C,
089C167CFE841241C02AAC07,
19C28FB6FE9D52B211CA2CBB,
);
isa = PBXGroup;
name = DVDioctl;
refType = 4;
};
089C1673FE841209C02AAC07 = {
buildPhases = (
06AA1267FFB2110C11CA28AA,
089C1674FE841209C02AAC07,
089C1675FE841209C02AAC07,
089C1676FE841209C02AAC07,
089C1677FE841209C02AAC07,
089C1679FE841209C02AAC07,
06AA1264FFB2107B11CA28AA,
);
buildSettings = {
FRAMEWORK_SEARCH_PATHS = "";
HEADER_SEARCH_PATHS = "";
INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions";
KERNEL_MODULE = YES;
LIBRARY_SEARCH_PATHS = "";
MODULE_IOKIT = YES;
MODULE_NAME = DVDioctl;
MODULE_VERSION = 1.0.0d1;
OPTIMIZATION_CFLAGS = "";
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
OTHER_REZFLAGS = "";
PRODUCT_NAME = DVDioctl;
SECTORDER_FLAGS = "";
WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
WRAPPER_EXTENSION = kext;
};
conditionalBuildSettings = {
};
dependencies = (
);
isa = PBXBundleTarget;
name = DVDioctl;
productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Extensions";
productName = DVDioctl;
productReference = 0B81C263FFB7832611CA28AA;
productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\">
<plist version=\"0.9\">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>DVDioctl</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>DVDioctl</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.0d1</string>
<key>IOKitPersonalities</key>
<dict>
<key>DVDioctl</key>
<dict>
<key>CFBundleIdentifier</key>
<string>DVDioctl</string>
<key>IOClass</key>
<string>DVDioctl</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOMatchCategory</key>
<string>DVDioctl</string>
<key>IOProviderClass</key>
<string>IOResources</string>
<key>IOResourceMatch</key>
<string>IOKit</string>
</dict>
</dict>
<key>OSBundleLibraries</key>
<dict/>
</dict>
</plist>
";
shouldUseHeadermap = 1;
};
089C1674FE841209C02AAC07 = {
buildActionMask = 2147483647;
files = (
1A224C40FF42367911CA2CB7,
);
isa = PBXHeadersBuildPhase;
name = Headers;
};
089C1675FE841209C02AAC07 = {
buildActionMask = 2147483647;
files = (
089C1680FE841241C02AAC07,
);
isa = PBXResourcesBuildPhase;
name = "Bundle Resources";
};
089C1676FE841209C02AAC07 = {
buildActionMask = 2147483647;
files = (
1A224C41FF42367911CA2CB7,
);
isa = PBXSourcesBuildPhase;
name = Sources;
};
089C1677FE841209C02AAC07 = {
buildActionMask = 2147483647;
files = (
);
isa = PBXFrameworksBuildPhase;
name = "Frameworks & Libraries";
};
089C1679FE841209C02AAC07 = {
buildActionMask = 2147483647;
files = (
);
isa = PBXRezBuildPhase;
name = "ResourceManager Resources";
};
089C167CFE841241C02AAC07 = {
children = (
089C167DFE841241C02AAC07,
);
isa = PBXGroup;
name = Resources;
refType = 4;
};
089C167DFE841241C02AAC07 = {
children = (
089C167EFE841241C02AAC07,
);
isa = PBXVariantGroup;
name = InfoPlist.strings;
refType = 4;
};
089C167EFE841241C02AAC07 = {
fileEncoding = 10;
isa = PBXFileReference;
name = English;
path = English.lproj/InfoPlist.strings;
refType = 4;
};
089C1680FE841241C02AAC07 = {
fileRef = 089C167DFE841241C02AAC07;
isa = PBXBuildFile;
settings = {
};
};
0B81C263FFB7832611CA28AA = {
isa = PBXBundleReference;
path = DVDioctl.kext;
refType = 3;
};
19C28FB6FE9D52B211CA2CBB = {
children = (
0B81C263FFB7832611CA28AA,
);
isa = PBXGroup;
name = Products;
refType = 4;
};
1A224C3EFF42367911CA2CB7 = {
isa = PBXFileReference;
path = DVDioctl.h;
refType = 4;
};
1A224C3FFF42367911CA2CB7 = {
isa = PBXFileReference;
path = DVDioctl.cpp;
refType = 4;
};
1A224C40FF42367911CA2CB7 = {
fileRef = 1A224C3EFF42367911CA2CB7;
isa = PBXBuildFile;
settings = {
};
};
1A224C41FF42367911CA2CB7 = {
fileRef = 1A224C3FFF42367911CA2CB7;
isa = PBXBuildFile;
settings = {
ATTRIBUTES = (
);
};
};
247142CAFF3F8F9811CA285C = {
children = (
1A224C3EFF42367911CA2CB7,
1A224C3FFF42367911CA2CB7,
);
isa = PBXGroup;
name = Source;
path = "";
refType = 4;
};
};
rootObject = 089C1669FE841209C02AAC07;
}
Binary files a/extras/MacOSX_dvdioctl/English.lproj/InfoPlist.strings and /dev/null differ
DVD driver for Darwin and Mac OS X
==================================
This experimental kernel extension (KEXT) for Darwin is a wrapper for
the DVD-related kernel IOKit functions. It was written for two main reasons:
- the lack of userland support for DVD key negociation functions
- the fact that the kernel locks mounted device, preventing raw device
reads if the DVD is mounted
Building the driver
===================
You can either load the project in Project Builder and press the "build"
icon, or open a terminal window and type "pbxbuild".
Installing the driver
=====================
Open a terminal window, and type "kextload build/DVDioctl.kext", or whatever
the path to the build tree is. You need to be root in order to do this.
Using the driver
================
The driver creates a special /dev/dvd block device upon loading. When a
process tries to open this device, it looks for an IODVDMedia object and
opens it. All further operation done to the /dev/dvd device are then
forwarded to the IODVDMedia device.
......@@ -8,7 +8,7 @@
* -dvd_udf to find files
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
* $Id: dvd_access.c,v 1.8 2002/03/15 04:41:54 sam Exp $
* $Id: dvd_access.c,v 1.9 2002/03/18 19:14:52 sam Exp $
*
* Author: Stphane Borel <stef@via.ecp.fr>
*
......@@ -787,7 +787,7 @@ static char * DVDParse( input_thread_t * p_input )
/* check block device */
if( stat( psz_device, &stat_info ) == -1 )
{
intf_ErrMsg( "input error: cannot stat() device `%s' (%s)",
intf_ErrMsg( "dvd error: cannot stat() device `%s' (%s)",
psz_device, strerror(errno));
return NULL;
}
......
/* dvd_demux.c: DVD demux functions.
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
* $Id: dvd_demux.c,v 1.3 2002/03/09 16:48:33 stef Exp $
* $Id: dvd_demux.c,v 1.4 2002/03/18 19:14:52 sam Exp $
*
* Author: Stphane Borel <stef@via.ecp.fr>
*
......@@ -88,6 +88,11 @@ void _M( demux_getfunctions)( function_list_t * p_function_list )
*****************************************************************************/
static int DVDInit( input_thread_t * p_input )
{
if( p_input->stream.i_method != INPUT_METHOD_DVD )
{
return -1;
}
vlc_mutex_lock( &p_input->stream.stream_lock );
DVDLaunchDecoders( p_input );
......
......@@ -6,7 +6,7 @@
* It depends on: libdvdread for ifo files and block reading.
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: input_dvdread.c,v 1.33 2002/03/12 18:37:46 stef Exp $
* $Id: input_dvdread.c,v 1.34 2002/03/18 19:14:52 sam Exp $
*
* Author: Stphane Borel <stef@via.ecp.fr>
*
......@@ -131,6 +131,11 @@ void _M( demux_getfunctions )( function_list_t * p_function_list )
*****************************************************************************/
static int DvdReadInit( input_thread_t * p_input )
{
if( p_input->stream.i_method != INPUT_METHOD_DVD )
{
return -1;
}
vlc_mutex_lock( &p_input->stream.stream_lock );
DvdReadLauchDecoders( p_input );
......
......@@ -2,7 +2,7 @@
* scope.c : Scope effect module
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: scope.c,v 1.4 2002/03/02 03:51:23 sam Exp $
* $Id: scope.c,v 1.5 2002/03/18 19:14:52 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
......@@ -106,6 +106,8 @@ static void aout_getfunctions( function_list_t * p_function_list )
*****************************************************************************/
static int aout_Open( aout_thread_t *p_aout )
{
char *psz_method;
/* Allocate structure */
p_aout->p_sys = malloc( sizeof( aout_sys_t ) );
if( p_aout->p_sys == NULL )
......@@ -114,11 +116,32 @@ static int aout_Open( aout_thread_t *p_aout )
return -1;
}
psz_method = config_GetPszVariable( "aout" );
if( psz_method )
{
if( !*psz_method )
{
free( psz_method );
return -1;
}
}
else
{
return -1;
}
/* Open video output */
p_aout->p_sys->p_vout =
vout_CreateThread( NULL, SCOPE_WIDTH, SCOPE_HEIGHT,
FOURCC_I420, SCOPE_ASPECT );
if( p_aout->p_sys->p_vout == NULL )
{
intf_ErrMsg( "aout scope error: no suitable vout module" );
free( p_aout->p_sys );
return -1;
}
/* Open audio output */
p_aout->p_sys->aout.i_format = p_aout->i_format;
p_aout->p_sys->aout.i_rate = p_aout->i_rate;
......@@ -128,7 +151,7 @@ static int aout_Open( aout_thread_t *p_aout )
(void *)&p_aout->p_sys->aout );
if( p_aout->p_sys->aout.p_module == NULL )
{
intf_ErrMsg( "aout error: no suitable aout module" );
intf_ErrMsg( "aout scope error: no suitable aout module" );
vout_DestroyThread( p_aout->p_sys->p_vout, NULL );
free( p_aout->p_sys );
return -1;
......
......@@ -2,7 +2,7 @@
* mpeg_es.c : Elementary Stream input module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: mpeg_es.c,v 1.5 2002/03/15 17:17:35 sam Exp $
* $Id: mpeg_es.c,v 1.6 2002/03/18 19:14:52 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -113,10 +113,10 @@ static int ESInit( input_thread_t * p_input )
if( *p_peek || *(p_peek + 1) || *(p_peek + 2) != 1 )
{
if( *p_input->psz_demux && strncmp( p_input->psz_demux, "es", 3 ) )
if( *p_input->psz_demux && strncmp( !p_input->psz_demux, "es", 3 ) )
{
/* User forced */
intf_ErrMsg( "input error: this doesn't seem like an MPEG stream, continuing" );
intf_ErrMsg( "input error: this doesn't look like an MPEG ES stream, continuing" );
}
else
{
......@@ -126,7 +126,7 @@ static int ESInit( input_thread_t * p_input )
}
else if( *(p_peek + 3) > 0xb9 )
{
if( *p_input->psz_demux && strncmp( p_input->psz_demux, "es", 3 ) )
if( *p_input->psz_demux && strncmp( !p_input->psz_demux, "es", 3 ) )
{
/* User forced */
intf_ErrMsg( "input error: this seems to be a system stream (PS plug-in ?), but continuing" );
......
......@@ -2,7 +2,7 @@
* mpeg_ps.c : Program Stream input module for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
* $Id: mpeg_ps.c,v 1.7 2002/03/15 17:17:35 sam Exp $
* $Id: mpeg_ps.c,v 1.8 2002/03/18 19:14:52 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -107,10 +107,10 @@ static int PSInit( input_thread_t * p_input )
if( *p_peek || *(p_peek + 1) || *(p_peek + 2) != 1 )
{
if( *p_input->psz_demux && strncmp( p_input->psz_demux, "ps", 3 ) )
if( *p_input->psz_demux && !strncmp( p_input->psz_demux, "ps", 3 ) )
{
/* User forced */
intf_ErrMsg( "input error: this doesn't seem like an MPEG stream, continuing" );
intf_ErrMsg( "input error: this doesn't look like an MPEG PS stream, continuing" );
}
else
{
......@@ -120,7 +120,7 @@ static int PSInit( input_thread_t * p_input )
}
else if( *(p_peek + 3) <= 0xb9 )
{
if( *p_input->psz_demux && strncmp( p_input->psz_demux, "ps", 3 ) )
if( *p_input->psz_demux && !strncmp( p_input->psz_demux, "ps", 3 ) )
{
/* User forced */
intf_ErrMsg( "input error: this seems to be an elementary stream (ES plug-in ?),");
......
......@@ -2,7 +2,7 @@
* mpeg_ts.c : Transport Stream input module for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
* $Id: mpeg_ts.c,v 1.6 2002/03/15 17:17:35 sam Exp $
* $Id: mpeg_ts.c,v 1.7 2002/03/18 19:14:52 sam Exp $
*
* Authors: Henri Fallon <henri@via.ecp.fr>
*
......@@ -107,10 +107,10 @@ static int TSInit( input_thread_t * p_input )
if( *p_peek != TS_SYNC_CODE )
{
if( *p_input->psz_demux && strncmp( p_input->psz_demux, "ts", 3 ) )
if( *p_input->psz_demux && !strncmp( p_input->psz_demux, "ts", 3 ) )
{
/* User forced */
intf_ErrMsg( "input error: this doesn't seem like a TS stream, continuing" );
intf_ErrMsg( "input error: this doesn't look like a TS stream, continuing" );
}
else
{
......
......@@ -2,7 +2,7 @@
* vout_sdl.c: SDL video output display method
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
* $Id: vout_sdl.c,v 1.84 2002/03/17 17:00:38 sam Exp $
* $Id: vout_sdl.c,v 1.85 2002/03/18 19:14:52 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Pierre Baillet <oct@zoy.org>
......@@ -154,6 +154,8 @@ void _M( vout_getfunctions )( function_list_t * p_function_list )
*****************************************************************************/
static int vout_Create( vout_thread_t *p_vout )
{
char *psz_method;
if( SDL_WasInit( SDL_INIT_VIDEO ) != 0 )
{
return( 1 );
......@@ -167,6 +169,20 @@ static int vout_Create( vout_thread_t *p_vout )
return( 1 );
}
psz_method = config_GetPszVariable( "vout" );
if( psz_method )
{
while( *psz_method && *psz_method != ':' )
{
psz_method++;
}
if( *psz_method )
{
setenv( "SDL_VIDEODRIVER", psz_method + 1, 1 );
}
}
/* Initialize library */
if( SDL_Init( SDL_INIT_VIDEO
#ifndef WIN32
......
......@@ -454,6 +454,11 @@ static int VCDInit( input_thread_t * p_input )
{
es_descriptor_t * p_es;
if( p_input->stream.i_method != INPUT_METHOD_VCD )
{
return -1;
}
vlc_mutex_lock( &p_input->stream.stream_lock );
/* Set program information. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment