At least parse DATAFILE lines more fully. Things are better but we're

still having problems reading the ISO-9660 of sms VCD's.
This commit is contained in:
rocky
2005-01-16 04:28:02 +00:00
parent 49d5e4dca2
commit b0772e83a6

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdrdao.c,v 1.4 2005/01/04 04:33:36 rocky Exp $ $Id: cdrdao.c,v 1.5 2005/01/16 04:28:02 rocky Exp $
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
toc reading routine adapted from cuetools toc reading routine adapted from cuetools
@@ -25,7 +25,7 @@
(*.cue). (*.cue).
*/ */
static const char _rcsid[] = "$Id: cdrdao.c,v 1.4 2005/01/04 04:33:36 rocky Exp $"; static const char _rcsid[] = "$Id: cdrdao.c,v 1.5 2005/01/16 04:28:02 rocky Exp $";
#include "image.h" #include "image.h"
#include "cdio_assert.h" #include "cdio_assert.h"
@@ -625,11 +625,12 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name)
} else if (0 == strcmp ("ZERO", psz_keyword)) { } else if (0 == strcmp ("ZERO", psz_keyword)) {
UNIMPLIMENTED_MSG; UNIMPLIMENTED_MSG;
/* [FILE|AUDIOFILE] "<filename>" <start> [<length>] */ /* [FILE|AUDIOFILE] "<filename>" <start-msf> [<length-msf>] */
} else if (0 == strcmp ("FILE", psz_keyword) } else if (0 == strcmp ("FILE", psz_keyword)
|| 0 == strcmp ("AUDIOFILE", psz_keyword)) { || 0 == strcmp ("AUDIOFILE", psz_keyword)) {
if (0 <= i) { if (0 <= i) {
if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) { if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) {
/* Handle "<filename>" */
if (NULL != cd) { if (NULL != cd) {
cd->tocent[i].filename = strdup (psz_field); cd->tocent[i].filename = strdup (psz_field);
/* Todo: do something about reusing existing files. */ /* Todo: do something about reusing existing files. */
@@ -643,6 +644,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name)
} }
if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
/* Handle <start-msf> */
lba_t lba = cdio_lsn_to_lba(cdio_mmssff_to_lba (psz_field)); lba_t lba = cdio_lsn_to_lba(cdio_mmssff_to_lba (psz_field));
if (CDIO_INVALID_LBA == lba) { if (CDIO_INVALID_LBA == lba) {
cdio_log(log_level, "%s line %d: invalid MSF string %s", cdio_log(log_level, "%s line %d: invalid MSF string %s",
@@ -656,6 +658,7 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name)
} }
} }
if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) if (NULL != (psz_field = strtok (NULL, " \t\n\r")))
/* Handle <length-msf> */
if (NULL != cd) if (NULL != cd)
cd->tocent[i].length = cdio_mmssff_to_lba (psz_field); cd->tocent[i].length = cdio_mmssff_to_lba (psz_field);
if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
@@ -665,9 +668,59 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name)
goto not_in_global_section; goto not_in_global_section;
} }
/* DATAFILE "<filename>" <start> [<length>] */ /* DATAFILE "<filename>" #byte-offset <start-msf> */
} else if (0 == strcmp ("DATAFILE", psz_keyword)) { } else if (0 == strcmp ("DATAFILE", psz_keyword)) {
goto unimplimented_error; if (0 <= i) {
if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) {
/* Handle <filename> */
if (NULL != cd) {
cd->tocent[i].filename = strdup (psz_field);
/* Todo: do something about reusing existing files. */
if (!(cd->tocent[i].data_source = cdio_stdio_new (psz_field))) {
cdio_log (log_level,
"%s line %d: can't open file `%s' for reading",
psz_cue_name, i_line, psz_field);
goto err_exit;
}
}
}
if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) {
/* Handle optional #byte-offset */
if ( psz_field[0] == '#') {
long int datastart;
psz_field++;
datastart = strtol(psz_field, (char **)NULL, 10);
if ( 0 != errno ) {
cdio_log (log_level,
"%s line %d: can't convert `%s' to byte offset",
psz_cue_name, i_line, psz_field);
goto err_exit;
} else {
if (NULL != cd) {
cd->tocent[i].datastart = datastart;
}
}
psz_field = strtok (NULL, " \t\n\r");
}
}
if (NULL != psz_field) {
/* Handle start-msf */
lba_t lba = cdio_mmssff_to_lba (psz_field);
if (CDIO_INVALID_LBA == lba) {
cdio_log(log_level, "%s line %d: invalid MSF string %s",
psz_cue_name, i_line, psz_field);
goto err_exit;
}
if (NULL != cd) {
cd->tocent[i].start_lba = lba;
cdio_lba_to_msf(cd->tocent[i].start_lba,
&(cd->tocent[i].start_msf));
}
}
} else {
goto not_in_global_section;
}
/* FIFO "<fifo path>" [<length>] */ /* FIFO "<fifo path>" [<length>] */
} else if (0 == strcmp ("FIFO", psz_keyword)) { } else if (0 == strcmp ("FIFO", psz_keyword)) {
@@ -913,6 +966,12 @@ _read_mode2_sector_cdrdao (void *user_data, void *data, lsn_t lsn,
_img_private_t *env = user_data; _img_private_t *env = user_data;
int ret; int ret;
char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
long unsigned int i_off = lsn * CDIO_CD_FRAMESIZE_RAW;
/* For sms's VCD's (mwc1.toc) it is more like this:
if (i_off > 272) i_off -= 272;
There is that magic 272 that we find in read_audio_sectors_cdrdao again.
*/
/* NOTE: The logic below seems a bit wrong and convoluted /* NOTE: The logic below seems a bit wrong and convoluted
to me, but passes the regression tests. (Perhaps it is why we get to me, but passes the regression tests. (Perhaps it is why we get
@@ -920,8 +979,7 @@ _read_mode2_sector_cdrdao (void *user_data, void *data, lsn_t lsn,
Review this sector 2336 stuff later. Review this sector 2336 stuff later.
*/ */
ret = cdio_stream_seek (env->tocent[0].data_source, ret = cdio_stream_seek (env->tocent[0].data_source, i_off, SEEK_SET);
lsn * CDIO_CD_FRAMESIZE_RAW, SEEK_SET);
if (ret!=0) return ret; if (ret!=0) return ret;
ret = cdio_stream_read (env->tocent[0].data_source, buf, ret = cdio_stream_read (env->tocent[0].data_source, buf,
@@ -1053,16 +1111,16 @@ _get_track_green_cdrdao(void *user_data, track_t i_track)
False is returned if there is no track entry. False is returned if there is no track entry.
*/ */
static lba_t static lba_t
_get_lba_track_cdrdao(void *user_data, track_t i_track) _get_lba_track_cdrdao(void *p_user_data, track_t i_track)
{ {
_img_private_t *env = user_data; _img_private_t *p_env = p_user_data;
_init_cdrdao (env); _init_cdrdao (p_env);
if (i_track == CDIO_CDROM_LEADOUT_TRACK) if (i_track == CDIO_CDROM_LEADOUT_TRACK)
i_track = env->gen.i_tracks+1; i_track = p_env->gen.i_tracks+1;
if (i_track <= env->gen.i_tracks+1 && i_track != 0) { if (i_track <= p_env->gen.i_tracks+1 && i_track != 0) {
return env->tocent[i_track-1].start_lba; return p_env->tocent[i_track-1].start_lba;
} else } else
return CDIO_INVALID_LBA; return CDIO_INVALID_LBA;
} }