|
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 |
|