From cb90369090131f2b356f4cf657a16bcfd3b050f0 Mon Sep 17 00:00:00 2001 From: uid67423 Date: Sun, 28 Dec 2003 08:33:45 +0000 Subject: [PATCH] Attempt getting various non-mode2/form2 track modes correct. --- lib/_cdio_nrg.c | 133 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 105 insertions(+), 28 deletions(-) diff --git a/lib/_cdio_nrg.c b/lib/_cdio_nrg.c index 6e381d04..0060bd98 100644 --- a/lib/_cdio_nrg.c +++ b/lib/_cdio_nrg.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_nrg.c,v 1.23 2003/11/09 15:50:50 rocky Exp $ + $Id: _cdio_nrg.c,v 1.24 2003/12/28 08:33:45 uid67423 Exp $ Copyright (C) 2001,2003 Herbert Valerio Riedel @@ -47,7 +47,7 @@ #include "cdio_private.h" #include "_cdio_stdio.h" -static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.23 2003/11/09 15:50:50 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.24 2003/12/28 08:33:45 uid67423 Exp $"; /* structures used */ @@ -82,6 +82,10 @@ typedef struct { uint32_t lsn GNUC_PACKED; } _cuex_array_t; +typedef struct { + uint8_t _unknown[64] GNUC_PACKED; +} _daox_array_t; + typedef struct { uint32_t id GNUC_PACKED; uint32_t len GNUC_PACKED; @@ -107,6 +111,11 @@ PRAGMA_END_PACKED the right thing is and it sometimes works (and sometimes is wrong). */ +/* Disk track type Values gleaned from DAOX */ +#define DTYP_MODE1 0 +#define DTYP_MODE2_XA 2 +#define DTYP_INVALID 255 + /* reader */ #define DEFAULT_CDIO_DEVICE "image.nrg" @@ -154,7 +163,8 @@ typedef struct { track_t first_track_num; /* track number of first track */ CdioList *mapping; /* List of track information */ uint32_t size; - uint32_t mtyp; /* Value of MTYP tag */ + uint32_t mtyp; /* Value of MTYP (media type?) tag */ + uint8_t dtyp; /* Value of DAOX media type tag */ } _img_private_t; static bool _cdio_parse_nero_footer (_img_private_t *_obj); @@ -165,7 +175,8 @@ static uint32_t _cdio_stat_size (void *env); */ static void _register_mapping (_img_private_t *_obj, lsn_t start_lsn, uint32_t sec_count, - uint64_t img_offset, uint32_t blocksize) + uint64_t img_offset, uint32_t blocksize, + track_format_t track_format, bool track_green) { const int track_num=_obj->total_tracks; track_info_t *this_track=&(_obj->tocent[_obj->total_tracks]); @@ -203,8 +214,8 @@ _register_mapping (_img_private_t *_obj, lsn_t start_lsn, uint32_t sec_count, /* FIXME: These are probably not right. Probably we need to look at "type." But this hasn't been reverse engineered yet. */ - this_track->track_format= TRACK_FORMAT_XA; - this_track->track_green = true; + this_track->track_format= track_format; + this_track->track_green = track_green; /* cdio_debug ("map: %d +%d -> %ld", start_lsn, sec_count, img_offset); */ } @@ -221,8 +232,7 @@ _cdio_parse_nero_footer (_img_private_t *_obj) long unsigned int size; char *footer_buf = NULL; - if (_obj->size) - return 0; + if (_obj->size) return true; size = cdio_stream_stat (_obj->gen.data_source); if (-1 == size) return false; @@ -260,7 +270,7 @@ PRAGMA_END_PACKED else { cdio_warn ("Image not recognized as either v50 or v55 type NRG"); - return -1; + return false; } cdio_debug ("nrg footer start = %ld, length = %ld", @@ -327,8 +337,8 @@ PRAGMA_END_PACKED sec_count = UINT32_FROM_BE (_entries[idx + 1].lsn); _register_mapping (_obj, lsn, sec_count*2, - (lsn+CDIO_PREGAP_SECTORS) * M2RAW_SECTOR_SIZE, - M2RAW_SECTOR_SIZE); + (lsn+CDIO_PREGAP_SECTORS) * M2RAW_SECTOR_SIZE, + M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true); } } break; @@ -365,7 +375,7 @@ PRAGMA_END_PACKED _register_mapping (_obj, lsn, lsn2 - lsn, (lsn + CDIO_PREGAP_SECTORS)*M2RAW_SECTOR_SIZE, - M2RAW_SECTOR_SIZE); + M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true); } } break; @@ -374,9 +384,13 @@ PRAGMA_END_PACKED case DAOI_ID: /* "DAOI" */ cdio_debug ("DAOI tag detected..."); break; - case DAOX_ID: /* "DAOX" */ - cdio_debug ("DAOX tag detected..."); - break; + case DAOX_ID: /* "DAOX" */ + { + _daox_array_t *_entries = (void *) chunk->data; + _obj->dtyp = _entries->_unknown[36]; + cdio_debug ("DAOX tag detected, track format %d", _obj->dtyp); + break; + } case NER5_ID: /* "NER5" */ cdio_error ("unexpected nrg magic ID NER5 detected"); @@ -415,16 +429,42 @@ PRAGMA_END_PACKED uint32_t _len = UINT32_FROM_BE (_entries[idx].length); uint32_t _start = UINT32_FROM_BE (_entries[idx].start_lsn); uint32_t _start2 = UINT32_FROM_BE (_entries[idx].start); + uint32_t track_mode= uint32_from_be (_entries[idx].type); + bool track_green = true; + track_format_t track_format = TRACK_FORMAT_XA; + uint16_t blocksize; - cdio_assert (UINT32_FROM_BE (_entries[idx].type) == 3); - cdio_assert (_len % M2RAW_SECTOR_SIZE == 0); + switch (track_mode) { + case 0: + track_format = TRACK_FORMAT_DATA; + track_green = false; /* ?? */ + blocksize = CDIO_CD_FRAMESIZE; + break; + case 2: + track_format = TRACK_FORMAT_XA; + track_green = false; /* ?? */ + blocksize = CDIO_CD_FRAMESIZE; + break; + case 3: + track_format = TRACK_FORMAT_XA; + track_green = true; + blocksize = M2RAW_SECTOR_SIZE; + break; + default: + cdio_warn ("Don't know how to handle track mode (%d)?", + track_mode); + return false; + } - _len /= M2RAW_SECTOR_SIZE; + cdio_assert (_len % blocksize == 0); - cdio_assert (_start * M2RAW_SECTOR_SIZE == _start2); + _len /= blocksize; + + cdio_assert (_start * blocksize == _start2); _start += idx * CDIO_PREGAP_SECTORS; - _register_mapping (_obj, _start, _len, _start2, M2RAW_SECTOR_SIZE); + _register_mapping (_obj, _start, _len, _start2, blocksize, + track_format, track_green); } } @@ -452,16 +492,43 @@ PRAGMA_END_PACKED uint32_t _len = uint64_from_be (_entries[idx].length); uint32_t _start = uint32_from_be (_entries[idx].start_lsn); uint32_t _start2 = uint64_from_be (_entries[idx].start); + uint32_t track_mode= uint32_from_be (_entries[idx].type); + bool track_green = true; + track_format_t track_format = TRACK_FORMAT_XA; + uint16_t blocksize; + + + switch (track_mode) { + case 0: + track_format = TRACK_FORMAT_DATA; + track_green = false; /* ?? */ + blocksize = CDIO_CD_FRAMESIZE; + break; + case 2: + track_format = TRACK_FORMAT_XA; + track_green = false; /* ?? */ + blocksize = CDIO_CD_FRAMESIZE; + break; + case 3: + track_format = TRACK_FORMAT_XA; + track_green = true; + blocksize = M2RAW_SECTOR_SIZE; + break; + default: + cdio_warn ("Don't know how to handle track mode (%d)?", + track_mode); + return false; + } - cdio_assert (uint32_from_be (_entries[idx].type) == 3); - cdio_assert (_len % M2RAW_SECTOR_SIZE == 0); + cdio_assert (_len % blocksize == 0); - _len /= M2RAW_SECTOR_SIZE; + _len /= blocksize; - cdio_assert (_start * M2RAW_SECTOR_SIZE == _start2); + cdio_assert (_start * blocksize == _start2); _start += idx * CDIO_PREGAP_SECTORS; - _register_mapping (_obj, _start, _len, _start2, M2RAW_SECTOR_SIZE); + _register_mapping (_obj, _start, _len, _start2, blocksize, + track_format, track_green); } } break; @@ -517,7 +584,7 @@ PRAGMA_END_PACKED _obj->tocent[_obj->total_tracks-1].sec_count = cdio_lsn_to_lba(_obj->size - _obj->tocent[_obj->total_tracks-1].start_lba); - return 0; + return true; } /*! @@ -857,7 +924,17 @@ _cdio_get_track_format(void *env, track_t track_num) if (track_num > _obj->total_tracks || track_num == 0) return TRACK_FORMAT_ERROR; - if ( MTYP_AUDIO_CD == _obj->mtyp) return TRACK_FORMAT_AUDIO; + if ( _obj->dtyp != DTYP_INVALID) { + switch (_obj->dtyp) { + case DTYP_MODE2_XA: + return TRACK_FORMAT_XA; + case DTYP_MODE1: + return TRACK_FORMAT_DATA; + default: ; + } + } + + /*if ( MTYP_AUDIO_CD == _obj->mtyp) return TRACK_FORMAT_AUDIO; */ return _obj->tocent[track_num-1].track_format; } @@ -933,9 +1010,9 @@ cdio_open_nrg (const char *source_name) _data = _cdio_malloc (sizeof (_img_private_t)); _data->gen.init = false; - _data->total_tracks = 0; _data->mtyp = 0; + _data->dtyp = DTYP_INVALID; _data->first_track_num= 1; _data->sector_2336 = false; /* FIXME: remove sector_2336 */ _data->is_cues = false; /* FIXME: remove is_cues. */