Blame lib/driver/image/nrg.h

Packit dd8086
/*
Packit dd8086
  $Id: nrg.h,v 1.7 2008/06/10 00:45:08 pjcreath Exp $
Packit dd8086
Packit dd8086
  Copyright (C) 2004, 2006, 2008 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
  Copyright (C) 2001, 2003 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
/* NERO (NRG) file format structures. */
Packit dd8086
Packit dd8086
/* this ugly image format is typical for lazy win32 programmers... at
Packit dd8086
   least structure were set big endian, so at reverse
Packit dd8086
   engineering wasn't such a big headache... */
Packit dd8086
Packit dd8086
PRAGMA_BEGIN_PACKED
Packit dd8086
typedef union {
Packit dd8086
  struct {
Packit dd8086
    uint32_t __x          GNUC_PACKED;
Packit dd8086
    uint32_t ID           GNUC_PACKED;
Packit dd8086
    uint32_t footer_ofs   GNUC_PACKED;
Packit dd8086
  } v50;
Packit dd8086
  struct {
Packit dd8086
    uint32_t ID           GNUC_PACKED;
Packit dd8086
    uint64_t footer_ofs   GNUC_PACKED;
Packit dd8086
  } v55;
Packit dd8086
} _footer_t;
Packit dd8086
Packit dd8086
typedef struct {
Packit dd8086
  uint32_t start      GNUC_PACKED;
Packit dd8086
  uint32_t length     GNUC_PACKED;
Packit dd8086
  uint32_t type       GNUC_PACKED; /* 0x0 -> MODE1,  0x2 -> MODE2 form1,
Packit dd8086
				      0x3 -> MIXED_MODE2 2336 blocksize 
Packit dd8086
				   */
Packit dd8086
  uint32_t start_lsn  GNUC_PACKED; /* does not include any pre-gaps! */
Packit dd8086
  uint32_t _unknown   GNUC_PACKED; /* wtf is this for? -- always zero... */
Packit dd8086
} _etnf_array_t;
Packit dd8086
Packit dd8086
/* Finally they realized that 32-bit offsets are a bit outdated for
Packit dd8086
   IA64 *eg* */
Packit dd8086
typedef struct {
Packit dd8086
  uint64_t start      GNUC_PACKED;
Packit dd8086
  uint64_t length     GNUC_PACKED;
Packit dd8086
  uint32_t type       GNUC_PACKED; /* 0x0 -> MODE1,  0x2 -> MODE2 form1,
Packit dd8086
				      0x3 -> MIXED_MODE2 2336 blocksize 
Packit dd8086
				   */
Packit dd8086
  uint32_t start_lsn  GNUC_PACKED;
Packit dd8086
  uint64_t _unknown   GNUC_PACKED; /* wtf is this for? -- always zero... */
Packit dd8086
} _etn2_array_t;
Packit dd8086
Packit dd8086
typedef struct {
Packit dd8086
  uint8_t  type;                   /* has track copy bit and whether audiofile
Packit dd8086
				      or datafile. Is often 0x41 == 'A' */
Packit dd8086
  uint8_t  track;                  /* binary or BCD?? */
Packit dd8086
  uint8_t  addr_ctrl;              /* addresstype: MSF or LBA in lower 4 bits
Packit dd8086
				      control in upper 4 bits. 
Packit dd8086
				      makes 0->1 transitions */
Packit dd8086
  uint8_t  res;                    /* ?? */
Packit dd8086
  uint32_t lsn        GNUC_PACKED; 
Packit dd8086
} _cuex_array_t;
Packit dd8086
Packit dd8086
/* New DAO[XI] Information from http://en.wikipedia.org/wiki/NRG_(file_format)
Packit dd8086
*/
Packit dd8086
Packit dd8086
typedef struct {
Packit dd8086
  char     psz_isrc[CDIO_ISRC_SIZE];
Packit dd8086
  uint8_t  unknown[6];
Packit dd8086
} _dao_array_common_t;
Packit dd8086
Packit dd8086
typedef struct {
Packit dd8086
  _dao_array_common_t common;
Packit dd8086
  uint64_t index0              GNUC_PACKED;
Packit dd8086
  uint64_t index1              GNUC_PACKED;
Packit dd8086
  uint64_t end_of_track        GNUC_PACKED;
Packit dd8086
} _daox_array_t;
Packit dd8086
Packit dd8086
typedef struct {
Packit dd8086
  _dao_array_common_t common;
Packit dd8086
  uint32_t index0              GNUC_PACKED;
Packit dd8086
  uint32_t index1              GNUC_PACKED;
Packit dd8086
  uint32_t end_of_track        GNUC_PACKED;
Packit dd8086
} _daoi_array_t;
Packit dd8086
Packit dd8086
typedef struct GNUC_PACKED {
Packit dd8086
  uint32_t chunk_size_le       GNUC_PACKED;
Packit dd8086
  char     psz_mcn[CDIO_MCN_SIZE];
Packit dd8086
  uint8_t  unknown[3];
Packit dd8086
  uint8_t  first_track;
Packit dd8086
  uint8_t  last_track;
Packit dd8086
} _dao_common_t;
Packit dd8086
Packit dd8086
typedef struct {
Packit dd8086
  _dao_common_t common;
Packit dd8086
  _daox_array_t track_info[EMPTY_ARRAY_SIZE];
Packit dd8086
} _daox_t;
Packit dd8086
Packit dd8086
typedef struct {
Packit dd8086
  _dao_common_t common;
Packit dd8086
  _daoi_array_t track_info[EMPTY_ARRAY_SIZE];
Packit dd8086
} _daoi_t;
Packit dd8086
Packit dd8086
typedef struct {
Packit dd8086
  uint32_t id                    GNUC_PACKED;
Packit dd8086
  uint32_t len                   GNUC_PACKED;
Packit dd8086
  char data[EMPTY_ARRAY_SIZE];
Packit dd8086
} _chunk_t;
Packit dd8086
Packit dd8086
PRAGMA_END_PACKED
Packit dd8086
Packit dd8086
/* Nero images are Big Endian. */
Packit dd8086
typedef enum {
Packit dd8086
  CDTX_ID  = 0x43445458,   /* CD TEXT */
Packit dd8086
  CUEX_ID  = 0x43554558,  /* Nero version 5.5.x-6.x */
Packit dd8086
  CUES_ID  = 0x43554553,  /* Nero pre version 5.5.x-6.x */
Packit dd8086
  DAOX_ID  = 0x44414f58,  /* Nero version 5.5.x-6.x */
Packit dd8086
  DAOI_ID  = 0x44414f49,
Packit dd8086
  END1_ID  = 0x454e4421,
Packit dd8086
  ETN2_ID  = 0x45544e32,
Packit dd8086
  ETNF_ID  = 0x45544e46,
Packit dd8086
  NER5_ID  = 0x4e455235,  /* Nero version 5.5.x */
Packit dd8086
  NERO_ID  = 0x4e45524f,  /* Nero pre 5.5.x */
Packit dd8086
  SINF_ID  = 0x53494e46,  /* Session information */
Packit dd8086
  MTYP_ID  = 0x4d545950,  /* Disc Media type? */
Packit dd8086
} nero_id_t;
Packit dd8086
Packit dd8086
#define MTYP_AUDIO_CD 1 /* This isn't correct. But I don't know the
Packit dd8086
			   the right thing is and it sometimes works (and
Packit dd8086
			   sometimes is wrong). */
Packit dd8086
Packit dd8086
/* Disk track type Values gleaned from DAOX */
Packit dd8086
typedef enum {
Packit dd8086
  DTYP_MODE1    =   0,
Packit dd8086
  DTYP_MODE2_XA =   2,
Packit dd8086
  DTYP_INVALID  = 255
Packit dd8086
} nero_dtype_t;
Packit dd8086
Packit dd8086
/** The below variables are trickery to force the above enum symbol
Packit dd8086
    values to be recorded in debug symbol tables. They are used to
Packit dd8086
    allow one to refer to the enumeration value names in the typedefs
Packit dd8086
    above in a debugger and debugger expressions.
Packit dd8086
*/
Packit dd8086
extern nero_id_t    nero_id;
Packit dd8086
extern nero_dtype_t nero_dtype;
Packit dd8086