Blame include/cdio/sector.h

Packit dd8086
/*
Packit dd8086
    Copyright (C) 2003, 2004, 2005, 2006, 2008, 2012
Packit dd8086
     Rocky Bernstein <rocky@gnu.org>
Packit dd8086
    Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
Packit dd8086
Packit dd8086
    This program is free software: you can redistribute it and/or modify
Packit dd8086
    it under the terms of the GNU General Public License as published by
Packit dd8086
    the Free Software Foundation, either version 3 of the License, or
Packit dd8086
    (at your option) any later version.
Packit dd8086
Packit dd8086
    This program is distributed in the hope that it will be useful,
Packit dd8086
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
    GNU General Public License for more details.
Packit dd8086
Packit dd8086
    You should have received a copy of the GNU General Public License
Packit dd8086
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
/*!
Packit dd8086
   \file sector.h 
Packit dd8086
   \brief Things related to CD-ROM layout: tracks, sector sizes, MSFs, LBAs.
Packit dd8086
Packit dd8086
  A CD-ROM physical sector size is 2048, 2052, 2056, 2324, 2332, 2336,
Packit dd8086
  2340, or 2352 bytes long.
Packit dd8086
Packit dd8086
  Sector types of the standard CD-ROM data formats:
Packit dd8086
Packit dd8086
\verbatim 
Packit dd8086
  format   sector type               user data size (bytes)
Packit dd8086
  -----------------------------------------------------------------------------
Packit dd8086
    1     (Red Book)    CD-DA          2352    (CDIO_CD_FRAMESIZE_RAW)
Packit dd8086
    2     (Yellow Book) Mode1 Form1    2048    (CDIO_CD_FRAMESIZE)
Packit dd8086
    3     (Yellow Book) Mode1 Form2    2336    (M2RAW_SECTOR_SIZE)
Packit dd8086
    4     (Green Book)  Mode2 Form1    2048    (CDIO_CD_FRAMESIZE)
Packit dd8086
    5     (Green Book)  Mode2 Form2    2328    (2324+4 spare bytes)
Packit dd8086
 
Packit dd8086
 
Packit dd8086
        The layout of the standard CD-ROM data formats:
Packit dd8086
  -----------------------------------------------------------------------------
Packit dd8086
  - audio (red):                  | audio_sample_bytes |
Packit dd8086
                                  |        2352        |
Packit dd8086
 
Packit dd8086
  - data (yellow, mode1):         | sync - head - data - EDC - zero - ECC |
Packit dd8086
                                  |  12  -   4  - 2048 -  4  -   8  - 276 |
Packit dd8086
 
Packit dd8086
  - data (yellow, mode2):         | sync - head - data |
Packit dd8086
                                 |  12  -   4  - 2336 |
Packit dd8086
 
Packit dd8086
  - XA data (green, mode2 form1): | sync - head - sub - data - EDC - ECC |
Packit dd8086
                                  |  12  -   4  -  8  - 2048 -  4  - 276 |
Packit dd8086
 
Packit dd8086
  - XA data (green, mode2 form2): | sync - head - sub - data - Spare |
Packit dd8086
                                  |  12  -   4  -  8  - 2324 -  4    |
Packit dd8086
\endverbatim
Packit dd8086
 
Packit dd8086
Packit dd8086
*/
Packit dd8086

Packit dd8086
#ifndef CDIO_SECTOR_H_
Packit dd8086
#define CDIO_SECTOR_H_
Packit dd8086
Packit dd8086
#ifdef __cplusplus
Packit dd8086
    extern "C" {
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/types.h>
Packit dd8086
Packit dd8086
      /*! Information that can be obtained through a Read Subchannel
Packit dd8086
        command.
Packit dd8086
      */
Packit dd8086
      typedef enum cdio_subchannel
Packit dd8086
        {
Packit dd8086
          CDIO_SUBCHANNEL_SUBQ_DATA             = 0,
Packit dd8086
          CDIO_SUBCHANNEL_CURRENT_POSITION      = 1,
Packit dd8086
          CDIO_SUBCHANNEL_MEDIA_CATALOG         = 2,
Packit dd8086
          CDIO_SUBCHANNEL_TRACK_ISRC            = 3
Packit dd8086
        } cdio_subchannel;
Packit dd8086
      
Packit dd8086
      /*! track flags
Packit dd8086
       * Q Sub-channel Control Field (4.2.3.3)
Packit dd8086
       */
Packit dd8086
      typedef enum {
Packit dd8086
        NONE =                  0x00,   /* no flags set */
Packit dd8086
        PRE_EMPHASIS =          0x01,   /* audio track recorded with pre-emphasis */
Packit dd8086
        COPY_PERMITTED =        0x02,   /* digital copy permitted */
Packit dd8086
        DATA =                  0x04,   /* data track */
Packit dd8086
        FOUR_CHANNEL_AUDIO =    0x08,   /* 4 audio channels */
Packit dd8086
        SCMS =                  0x10    /* SCMS (5.29.2.7) */
Packit dd8086
      } flag_t;
Packit dd8086
      
Packit dd8086
#define CDIO_PREGAP_SECTORS  150
Packit dd8086
#define CDIO_POSTGAP_SECTORS 150
Packit dd8086
      
Packit dd8086
      /*! An enumeration for some of the CDIO_CD \#defines below. This isn't
Packit dd8086
        really an enumeration one would really use in a program it is to
Packit dd8086
        be helpful in debuggers where wants just to refer to the CDIO_CD_
Packit dd8086
        names and get something.
Packit dd8086
      */
Packit dd8086
      extern enum cdio_cd_enums {
Packit dd8086
        CDIO_CD_MINS =              74,   /**< max. minutes per CD, not really
Packit dd8086
                                             a limit */
Packit dd8086
        CDIO_CD_SECS_PER_MIN =      60,   /**< seconds per minute */
Packit dd8086
        CDIO_CD_FRAMES_PER_SEC =    75,   /**< frames per second */
Packit dd8086
        CDIO_CD_SYNC_SIZE =         12,   /**< 12 sync bytes per raw data 
Packit dd8086
                                             frame */
Packit dd8086
        CDIO_CD_CHUNK_SIZE =        24,   /**< lowest-level "data bytes 
Packit dd8086
                                             piece" */
Packit dd8086
        CDIO_CD_NUM_OF_CHUNKS =     98,   /**< chunks per frame */
Packit dd8086
        CDIO_CD_FRAMESIZE_SUB =     96,   /**< subchannel data "frame" size */
Packit dd8086
        CDIO_CD_HEADER_SIZE =        4,   /**< header (address) bytes per raw
Packit dd8086
                                             frame */
Packit dd8086
        CDIO_CD_SUBHEADER_SIZE =     8,   /**< subheader bytes per raw XA data 
Packit dd8086
                                             frame */
Packit dd8086
        CDIO_CD_ECC_SIZE =         276,   /**< bytes ECC per most raw data 
Packit dd8086
                                             frame types */
Packit dd8086
        CDIO_CD_FRAMESIZE =       2048,   /**< bytes per frame, "cooked" 
Packit dd8086
                                             mode */
Packit dd8086
        CDIO_CD_FRAMESIZE_RAW =   2352,   /**< bytes per frame, "raw" mode */
Packit dd8086
        CDIO_CD_FRAMESIZE_RAWER = 2646,   /**< The maximum possible 
Packit dd8086
                                             returned  */
Packit dd8086
        CDIO_CD_FRAMESIZE_RAW1  = 2340,
Packit dd8086
        CDIO_CD_FRAMESIZE_RAW0  = 2336,
Packit dd8086
        CDIO_CD_MAX_SESSIONS =      99, 
Packit dd8086
        CDIO_CD_MIN_SESSION_NO =     1,   /**<, Smallest CD session number */
Packit dd8086
        CDIO_CD_MAX_LSN =       450150,   /**< Largest LSN in a CD */
Packit dd8086
        CDIO_CD_MIN_LSN      = -450150,   /**< Smallest LSN in a CD */
Packit dd8086
      } cdio_cd_enums;
Packit dd8086
        
Packit dd8086
      /*!
Packit dd8086
        Some generally useful CD-ROM information -- mostly based on the above.
Packit dd8086
        This is from linux.h - not to slight other OS's. This was the first
Packit dd8086
        place I came across such useful stuff.
Packit dd8086
      */
Packit dd8086
#define CDIO_CD_MINS              74   /**< max. minutes per CD, not really
Packit dd8086
                                          a limit */
Packit dd8086
#define CDIO_CD_SECS_PER_MIN      60   /**< seconds per minute */
Packit dd8086
#define CDIO_CD_FRAMES_PER_SEC    75   /**< frames per second */
Packit dd8086
#define CDIO_CD_SYNC_SIZE         12   /**< 12 sync bytes per raw data frame */
Packit dd8086
#define CDIO_CD_CHUNK_SIZE        24   /**< lowest-level "data bytes piece" */
Packit dd8086
#define CDIO_CD_NUM_OF_CHUNKS     98   /**< chunks per frame */
Packit dd8086
#define CDIO_CD_FRAMESIZE_SUB     96   /**< subchannel data "frame" size */
Packit dd8086
#define CDIO_CD_HEADER_SIZE        4   /**< header (address) bytes per raw
Packit dd8086
                                          data frame */
Packit dd8086
#define CDIO_CD_SUBHEADER_SIZE     8   /**< subheader bytes per raw XA data 
Packit dd8086
                                            frame */
Packit dd8086
#define CDIO_CD_EDC_SIZE           4   /**< bytes EDC per most raw data
Packit dd8086
                                          frame types */
Packit dd8086
#define CDIO_CD_M1F1_ZERO_SIZE     8   /**< bytes zero per yellow book mode
Packit dd8086
                                          1 frame */
Packit dd8086
#define CDIO_CD_ECC_SIZE         276   /**< bytes ECC per most raw data frame 
Packit dd8086
                                          types */
Packit dd8086
#define CDIO_CD_FRAMESIZE       2048   /**< bytes per frame, "cooked" mode */
Packit dd8086
#define CDIO_CD_FRAMESIZE_RAW   2352   /**< bytes per frame, "raw" mode */
Packit dd8086
#define CDIO_CD_FRAMESIZE_RAWER 2646   /**< The maximum possible returned 
Packit dd8086
                                          bytes */ 
Packit dd8086
#define CDIO_CD_FRAMESIZE_RAW1 (CDIO_CD_FRAMESIZE_RAW-CDIO_CD_SYNC_SIZE) /*2340*/
Packit dd8086
#define CDIO_CD_FRAMESIZE_RAW0 (CDIO_CD_FRAMESIZE_RAW-CDIO_CD_SYNC_SIZE-CDIO_CD_HEADER_SIZE) /*2336*/
Packit dd8086
      
Packit dd8086
      /*! "before data" part of raw XA (green, mode2) frame */
Packit dd8086
#define CDIO_CD_XA_HEADER (CDIO_CD_HEADER_SIZE+CDIO_CD_SUBHEADER_SIZE) 
Packit dd8086
      
Packit dd8086
      /*! "after data" part of raw XA (green, mode2 form1) frame */
Packit dd8086
#define CDIO_CD_XA_TAIL   (CDIO_CD_EDC_SIZE+CDIO_CD_ECC_SIZE) 
Packit dd8086
      
Packit dd8086
      /*! "before data" sync bytes + header of XA (green, mode2) frame */
Packit dd8086
#define CDIO_CD_XA_SYNC_HEADER   (CDIO_CD_SYNC_SIZE+CDIO_CD_XA_HEADER) 
Packit dd8086
      
Packit dd8086
      /*! String of bytes used to identify the beginning of a Mode 1 or
Packit dd8086
          Mode 2 sector. */
Packit dd8086
      extern const uint8_t CDIO_SECTOR_SYNC_HEADER[CDIO_CD_SYNC_SIZE];
Packit dd8086
      /**<  
Packit dd8086
        {0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0};
Packit dd8086
      */
Packit dd8086
      
Packit dd8086
      /*! An enumeration for some of the M2*_SECTOR_SIZE \#defines
Packit dd8086
        below. This isn't really an enumeration one would really use in a
Packit dd8086
        program it is to be helpful in debuggers where wants just to refer
Packit dd8086
        to the M2*_SECTOR_SIZE names and get something.
Packit dd8086
      */
Packit dd8086
      extern enum m2_sector_enums {
Packit dd8086
        M2F2_SECTOR_SIZE  = 2324,
Packit dd8086
        M2SUB_SECTOR_SIZE = 2332,
Packit dd8086
        M2RAW_SECTOR_SIZE = 2336
Packit dd8086
      } m2_sector_enums;
Packit dd8086
      
Packit dd8086
#define M2F2_SECTOR_SIZE    2324
Packit dd8086
#define M2SUB_SECTOR_SIZE   2332
Packit dd8086
#define M2RAW_SECTOR_SIZE   2336
Packit dd8086
      
Packit dd8086
      /*! Largest CD session number */
Packit dd8086
#define CDIO_CD_MAX_SESSIONS    99 
Packit dd8086
      /*! Smallest CD session number */
Packit dd8086
#define CDIO_CD_MIN_SESSION_NO   1
Packit dd8086
      
Packit dd8086
      /*! Largest LSN in a CD */
Packit dd8086
#define CDIO_CD_MAX_LSN   450150
Packit dd8086
      /*! Smallest LSN in a CD */
Packit dd8086
#define CDIO_CD_MIN_LSN  -450150
Packit dd8086
      
Packit dd8086
      
Packit dd8086
#define CDIO_CD_FRAMES_PER_MIN                          \
Packit dd8086
      (CDIO_CD_FRAMES_PER_SEC*CDIO_CD_SECS_PER_MIN)
Packit dd8086
      
Packit dd8086
typedef enum cdio_cd_minutes_sectors
Packit dd8086
{
Packit dd8086
        CDIO_CD_74MIN_SECTORS = UINT32_C(74) * CDIO_CD_FRAMES_PER_MIN,
Packit dd8086
        CDIO_CD_80MIN_SECTORS = UINT32_C(80) * CDIO_CD_FRAMES_PER_MIN,
Packit dd8086
        CDIO_CD_90MIN_SECTORS = UINT32_C(90) * CDIO_CD_FRAMES_PER_MIN,
Packit dd8086
      
Packit dd8086
        CDIO_CD_MAX_SECTORS   = UINT32_C(100) * CDIO_CD_FRAMES_PER_MIN - CDIO_PREGAP_SECTORS
Packit dd8086
} cdio_cd_minutes_sectors;
Packit dd8086
      
Packit dd8086
#define msf_t_SIZEOF 3
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert an LBA into a string representation of the MSF.
Packit dd8086
        \warning cdio_lba_to_msf_str returns new allocated string */
Packit dd8086
      char *cdio_lba_to_msf_str (lba_t i_lba);
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert an MSF into a string representation of the MSF.
Packit dd8086
        \warning cdio_msf_to_msf_str returns new allocated string */
Packit dd8086
      char *cdio_msf_to_str (const msf_t *p_msf);
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert an LBA into the corresponding LSN.
Packit dd8086
      */
Packit dd8086
      lba_t cdio_lba_to_lsn (lba_t i_lba);
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert an LBA into the corresponding MSF.
Packit dd8086
      */
Packit dd8086
      void  cdio_lba_to_msf(lba_t i_lba, msf_t *p_msf);
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert an LSN into the corresponding LBA.
Packit dd8086
        CDIO_INVALID_LBA is returned if there is an error.
Packit dd8086
      */
Packit dd8086
      lba_t cdio_lsn_to_lba (lsn_t i_lsn);
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert an LSN into the corresponding MSF.
Packit dd8086
      */
Packit dd8086
      void  cdio_lsn_to_msf (lsn_t i_lsn, msf_t *p_msf);
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert a MSF into the corresponding LBA.
Packit dd8086
        CDIO_INVALID_LBA is returned if there is an error.
Packit dd8086
      */
Packit dd8086
      lba_t cdio_msf_to_lba (const msf_t *p_msf);
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert a MSF into the corresponding LSN.
Packit dd8086
        CDIO_INVALID_LSN is returned if there is an error.
Packit dd8086
      */
Packit dd8086
      lsn_t cdio_msf_to_lsn (const msf_t *p_msf);
Packit dd8086
      
Packit dd8086
      /*!  
Packit dd8086
        Convert a MSF - broken out as 3 integer components into the
Packit dd8086
        corresponding LBA.  
Packit dd8086
        CDIO_INVALID_LBA is returned if there is an error.
Packit dd8086
      */
Packit dd8086
      lba_t cdio_msf3_to_lba (unsigned int minutes, unsigned int seconds, 
Packit dd8086
                              unsigned int frames);
Packit dd8086
      
Packit dd8086
      /*! 
Packit dd8086
        Convert a string of the form MM:SS:FF into the corresponding LBA.
Packit dd8086
        CDIO_INVALID_LBA is returned if there is an error.
Packit dd8086
      */
Packit dd8086
      lba_t cdio_mmssff_to_lba (const char *psz_mmssff);
Packit dd8086
      
Packit dd8086
#ifdef __cplusplus
Packit dd8086
    }
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef DO_NOT_WANT_PARANOIA_COMPATIBILITY
Packit dd8086
/** For compatibility with good ol' paranoia */
Packit dd8086
#define CD_FRAMESIZE_RAW        CDIO_CD_FRAMESIZE_RAW
Packit dd8086
#endif /*DO_NOT_WANT_PARANOIA_COMPATIBILITY*/
Packit dd8086
Packit dd8086
#endif /* CDIO_SECTOR_H_ */
Packit dd8086
Packit dd8086

Packit dd8086
/* 
Packit dd8086
 * Local variables:
Packit dd8086
 *  c-file-style: "gnu"
Packit dd8086
 *  tab-width: 8
Packit dd8086
 *  indent-tabs-mode: nil
Packit dd8086
 * End:
Packit dd8086
 */