Some code consolidation.

This commit is contained in:
rocky
2003-12-31 04:41:08 +00:00
parent acb666984f
commit c73df7e090

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_nrg.c,v 1.26 2003/12/31 03:09:31 rocky Exp $ $Id: _cdio_nrg.c,v 1.27 2003/12/31 04:41:08 rocky Exp $
Copyright (C) 2001,2003 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001,2003 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -48,7 +48,7 @@
#include "cdio_private.h" #include "cdio_private.h"
#include "_cdio_stdio.h" #include "_cdio_stdio.h"
static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.26 2003/12/31 03:09:31 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.27 2003/12/31 04:41:08 rocky Exp $";
/* structures used */ /* structures used */
@@ -341,129 +341,82 @@ PRAGMA_END_PACKED
while (pos < size - footer_start) { while (pos < size - footer_start) {
_chunk_t *chunk = (void *) (footer_buf + pos); _chunk_t *chunk = (void *) (footer_buf + pos);
uint32_t opcode = UINT32_FROM_BE (chunk->id);
bool break_out = false; bool break_out = false;
switch (UINT32_FROM_BE (chunk->id)) { switch (opcode) {
case CUES_ID: { /* "CUES" Seems to have sector size 2336 and 150 sector
pregap seems to be included at beginning of image. case CUES_ID: /* "CUES" Seems to have sector size 2336 and 150 sector
pregap seems to be included at beginning of image.
*/ */
case CUEX_ID: /* "CUEX" */
unsigned entries = UINT32_FROM_BE (chunk->len);
_cuex_array_t *_entries = (void *) chunk->data;
cdio_assert (_obj->mapping == NULL);
cdio_assert (sizeof (_cuex_array_t) == 8);
cdio_assert ( UINT32_FROM_BE(chunk->len) % sizeof(_cuex_array_t)
== 0 );
entries /= sizeof (_cuex_array_t);
cdio_info ("CUES type image detected");
{ {
lsn_t lsn = UINT32_FROM_BE (_entries[0].lsn); unsigned entries = UINT32_FROM_BE (chunk->len);
int idx; _cuex_array_t *_entries = (void *) chunk->data;
/*cdio_assert (lsn == 0?);*/ cdio_assert (_obj->mapping == NULL);
_obj->is_cues = true; /* HACK alert. */
_obj->total_tracks = 0;
_obj->first_track_num = 1;
for (idx = 1; idx < entries-1; idx += 2) {
lsn_t sec_count;
cdio_assert (_entries[idx].index == 0);
cdio_assert (_entries[idx].track == _entries[idx + 1].track);
/* lsn and sec_count*2 aren't correct, but it comes closer on the
single example I have: svcdgs.nrg
We are picking up the wrong fields and/or not interpreting
them correctly.
*/
lsn = UINT32_FROM_BE (_entries[idx].lsn);
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, TRACK_FORMAT_XA, true);
}
}
break;
}
case CUEX_ID: /* "CUEX" */ {
unsigned entries = UINT32_FROM_BE (chunk->len);
_cuex_array_t *_entries = (void *) chunk->data;
cdio_assert (_obj->mapping == NULL);
cdio_assert ( sizeof (_cuex_array_t) == 8 );
cdio_assert ( UINT32_FROM_BE (chunk->len) % sizeof(_cuex_array_t)
== 0 );
entries /= sizeof (_cuex_array_t);
cdio_info ("DAO type image detected");
{
uint32_t lsn = UINT32_FROM_BE (_entries[0].lsn);
int idx;
cdio_assert (lsn == 0xffffff6a); cdio_assert ( sizeof (_cuex_array_t) == 8 );
cdio_assert ( UINT32_FROM_BE (chunk->len) % sizeof(_cuex_array_t)
== 0 );
for (idx = 2; idx < entries; idx += 2) { entries /= sizeof (_cuex_array_t);
lsn_t lsn2;
if (CUES_ID == opcode) {
cdio_assert (_entries[idx].index == 1); lsn_t lsn = UINT32_FROM_BE (_entries[0].lsn);
cdio_assert (_entries[idx].track != _entries[idx + 1].track); int idx;
lsn = UINT32_FROM_BE (_entries[idx].lsn); cdio_info ("CUES type image detected" );
lsn2 = UINT32_FROM_BE (_entries[idx + 1].lsn); /*cdio_assert (lsn == 0?);*/
_register_mapping (_obj, lsn, lsn2 - lsn, _obj->is_cues = true; /* HACK alert. */
(lsn + CDIO_PREGAP_SECTORS)*M2RAW_SECTOR_SIZE, _obj->total_tracks = 0;
M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true); _obj->first_track_num = 1;
} for (idx = 1; idx < entries-1; idx += 2) {
} lsn_t sec_count;
break;
} cdio_assert (_entries[idx].index == 0);
cdio_assert (_entries[idx].track == _entries[idx + 1].track);
case DAOI_ID: /* "DAOI" */
{ /* lsn and sec_count*2 aren't correct, but it comes closer on the
_daox_array_t *_entries = (void *) chunk->data; single example I have: svcdgs.nrg
track_format_t track_format; We are picking up the wrong fields and/or not interpreting
int form = _entries->_unknown[18]; them correctly.
_obj->dtyp = _entries->_unknown[36]; */
_obj->is_dao = true;
cdio_debug ("DAOI tag detected, track format %d, form %x\n", lsn = UINT32_FROM_BE (_entries[idx].lsn);
_obj->dtyp, form); sec_count = UINT32_FROM_BE (_entries[idx + 1].lsn);
switch (_obj->dtyp) {
case 0: _register_mapping (_obj, lsn, sec_count*2,
track_format = TRACK_FORMAT_DATA; (lsn+CDIO_PREGAP_SECTORS) * M2RAW_SECTOR_SIZE,
break; M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true);
case 0x20: }
track_format = TRACK_FORMAT_XA; } else {
break; lsn_t lsn = UINT32_FROM_BE (_entries[0].lsn);
default: int idx;
cdio_warn ("Unknown track format %x\n",
_obj->dtyp); cdio_info ("CUEX type image detected");
track_format = TRACK_FORMAT_AUDIO; cdio_assert (lsn == 0xffffff6a);
}
if (0 == form) { for (idx = 2; idx < entries; idx += 2) {
int i; lsn_t sec_count;
for (i=0; i<_obj->total_tracks; i++) {
_obj->tocent[i].track_green = false; cdio_assert (_entries[idx].index == 1);
_obj->tocent[i].track_format= track_format; cdio_assert (_entries[idx].track != _entries[idx + 1].track);
_obj->tocent[i].datasize = CDIO_CD_FRAMESIZE;
_obj->tocent[i].datastart = 0; lsn = UINT32_FROM_BE (_entries[idx].lsn);
sec_count = UINT32_FROM_BE (_entries[idx + 1].lsn);
_register_mapping (_obj, lsn, sec_count - lsn,
(lsn + CDIO_PREGAP_SECTORS)*M2RAW_SECTOR_SIZE,
M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true);
} }
} }
break; break;
} }
case DAOI_ID: /* "DAOI" */
case DAOX_ID: /* "DAOX" */ case DAOX_ID: /* "DAOX" */
{ {
_daox_array_t *_entries = (void *) chunk->data; _daox_array_t *_entries = (void *) chunk->data;
@@ -471,15 +424,19 @@ PRAGMA_END_PACKED
int form = _entries->_unknown[18]; int form = _entries->_unknown[18];
_obj->dtyp = _entries->_unknown[36]; _obj->dtyp = _entries->_unknown[36];
_obj->is_dao = true; _obj->is_dao = true;
cdio_debug ("DAOX tag detected, track format %d, form %x\n", cdio_debug ("DAO%c tag detected, track format %d, form %x\n",
_obj->dtyp, form); opcode==DAOX_ID ? 'X': 'I', _obj->dtyp, form);
switch (_obj->dtyp) { switch (_obj->dtyp) {
case 0: case 0:
track_format = TRACK_FORMAT_DATA; track_format = TRACK_FORMAT_DATA;
break; break;
case 0x6:
case 0x20: case 0x20:
track_format = TRACK_FORMAT_XA; track_format = TRACK_FORMAT_XA;
break; break;
case 0x7:
track_format = TRACK_FORMAT_AUDIO;
break;
default: default:
cdio_warn ("Unknown track format %x\n", cdio_warn ("Unknown track format %x\n",
_obj->dtyp); _obj->dtyp);
@@ -488,25 +445,47 @@ PRAGMA_END_PACKED
if (0 == form) { if (0 == form) {
int i; int i;
for (i=0; i<_obj->total_tracks; i++) { for (i=0; i<_obj->total_tracks; i++) {
_obj->tocent[i].track_format= track_format;
_obj->tocent[i].datastart = 0;
_obj->tocent[i].track_green = false; _obj->tocent[i].track_green = false;
if (TRACK_FORMAT_AUDIO == track_format) {
_obj->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW;
_obj->tocent[i].datasize = CDIO_CD_FRAMESIZE_RAW;
_obj->tocent[i].endsize = 0;
} else {
_obj->tocent[i].datasize = CDIO_CD_FRAMESIZE;
_obj->tocent[i].datastart = 0;
}
}
} else if (2 == form) {
int i;
for (i=0; i<_obj->total_tracks; i++) {
_obj->tocent[i].track_green = true;
_obj->tocent[i].track_format= track_format; _obj->tocent[i].track_format= track_format;
_obj->tocent[i].datasize = CDIO_CD_FRAMESIZE; _obj->tocent[i].datasize = CDIO_CD_FRAMESIZE;
_obj->tocent[i].datastart -= CDIO_CD_SUBHEADER_SIZE; if (TRACK_FORMAT_XA == track_format) {
_obj->tocent[i].datastart = CDIO_CD_SYNC_SIZE
+ CDIO_CD_HEADER_SIZE + CDIO_CD_SUBHEADER_SIZE;
_obj->tocent[i].endsize = CDIO_CD_SYNC_SIZE
+ CDIO_CD_ECC_SIZE;
} else {
_obj->tocent[i].datastart = CDIO_CD_SYNC_SIZE
+ CDIO_CD_HEADER_SIZE;
_obj->tocent[i].endsize = CDIO_CD_EDC_SIZE
+ CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE;
}
} }
} }
break; break;
} }
case NERO_ID: /* "NER0" */
case NER5_ID: /* "NER5" */ case NER5_ID: /* "NER5" */
cdio_error ("unexpected nrg magic ID NER5 detected"); cdio_error ("unexpected nrg magic ID NER%c detected",
opcode==NERO_ID ? 'O': '5');
return -1; return -1;
break; break;
case NERO_ID: /* "NER0" */
cdio_error ("unexpected nrg magic ID NER0 detected");
return -1;
break;
case END1_ID: /* "END!" */ case END1_ID: /* "END!" */
cdio_debug ("nrg end tag detected"); cdio_debug ("nrg end tag detected");
break_out = true; break_out = true;