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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user