On-the-fly DVD decryption

On-the-fly DVD decryption

No need to worry about disk space. The DVD is decrypted on-the-fly directly from the DVD drive as the information is being required by other applications.

Free and open-source

Free and open-source

Delighted to give back to the community. If you are a developer and have an amazing idea for a new feature or just a bug fix we appreciate your contribution.

Basic sequence of operations

Fairmount uses the following process to allow the usage of an encrypted DVD as if it was decrypted:

  • A disc is inserted by the user
  • Fairmount receives a notification that a new disc is available
  • If the disk is a video DVD, the original disk is unmounted
  • Fairmount starts a local web server, accessible only by the local host, to serve the decrypted image
  • The decrypted image is then mounted using hdiutil
  • When the decrypted image is ejected, the web server is stopped and the original disc is ejected

Source files overview

The source code of Fairmount is distributed with the DVDRemaster package. Here is an overview of each source file:

  • Types.h:
    Specifies some data types used throughout the code.
  • Decryption.[h,m]:
    Provides the API for interfacing with dvdcss, which is not distributed with Fairmount. It is rather loaded from the user's disk by searching for VLC Media Player's bundle.
  • FairMount.[h,m]:
    Contains the main classes for Fairmount, the Fairmount class which registers itself with the Disk Arbitration framework to receive disk notifications and the DVDServer class doing the heavywork and containing the web server object.
  • Overlay.[h,m]:
    Contains the code neccessary to show the progress overlay.
  • socketWrap.[h,c]:
    Provides a simplified socket API.
  • FileSize.[h,c]:
    Provides the byte size of block devices.
  • ListFiles.[h,cpp]:
    Lists the files of the ISO9660 filesystem of the DVD. Used by CSSFileAccess to ensure decryption is only applied to VOB files.
  • HTTPServer.[h,cpp]:
    Minimal web server able to serve large files.
  • IFileAccess.h:
    Provides an interface to all data access done by the web server.
  • FileAccess.cpp:
    Simple file access module used for debugging purposes.
  • CSSFileAccess.cpp:
    File access module doing the decryption on the VOB files.
  • CachedFileAccess.cpp:
    File access module providing threaded read-ahead cache.

Working on Fairmount

The first thing to do is to set the DYLD_INSERT_LIBRARIES environment variable to /usr/lib/libMallocDebug.A.dylib. This ensures memory bugs are found sooner.

We welcome comments, suggestions and fixes. Any modifications should be sent to for integration.