Add some cdrdao image reading support from Svend S. Sorensen's

cuetools

cdio.c: remove some complicated and extraneous code for auto-driver
detection.
This commit is contained in:
rocky
2004-05-04 02:06:48 +00:00
parent 8c0d08b480
commit f04f14c312
13 changed files with 1432 additions and 54 deletions

3
THANKS
View File

@@ -1,3 +1,6 @@
Svend S. Sorensen <ssorensen@fastmail.fm>
cdrdao TOC-reading code
Nicolas Boullis <nboullis@debian.org>
Build issues, library symbol versioning, Debian packaging and issues

View File

@@ -1,5 +1,5 @@
/* -*- c -*-
$Id: cdio.h,v 1.44 2004/04/30 06:54:15 rocky Exp $
$Id: cdio.h,v 1.45 2004/05/04 02:06:48 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -79,6 +79,9 @@ extern "C" {
DRIVER_SOLARIS, /**< Sun Solaris Driver */
DRIVER_OSX, /**< Apple OSX Driver */
DRIVER_WIN32, /**< Microsoft Windows Driver */
DRIVER_CDRDAO, /**< cdrdao format CD image. This is listed
before BINCUE, to make the code prefer cdrdao
over BINCUE when both exist. */
DRIVER_BINCUE, /**< BIN/CUE format CD image. This is listed before NRG,
to make the code prefer BINCUE over NRG when both
exist. */
@@ -200,6 +203,13 @@ extern "C" {
*/
const char * cdio_get_driver_name (const CdIo *obj);
/*!
Return the driver id.
if CdIo is NULL (we haven't initialized a specific device driver),
then return DRIVER_UNKNOWN.
*/
driver_id_t cdio_get_driver_id (const CdIo *obj);
/*!
Return the number of the first track.
CDIO_INVALID_TRACK is returned on error.
@@ -361,6 +371,9 @@ extern "C" {
/*! True if BIN/CUE driver is available. */
bool cdio_have_bincue (void);
/*! True if cdrdao CDRDAO driver is available. */
bool cdio_have_cdrdao (void);
/*! Like cdio_have_xxx but uses an enumeration instead. */
bool cdio_have_driver (driver_id_t driver_id);
@@ -403,6 +416,19 @@ extern "C" {
CdIo * cdio_open_am_bincue (const char *psz_cue_name,
const char *psz_access_mode);
/*! Set up cdrdao CD disk-image for reading. Source is the .toc file
NULL is returned on error.
*/
CdIo * cdio_open_cdrdao (const char *psz_toc_name);
/*! Set up cdrdao CD disk-image for reading. Source is the .toc file
NULL is returned on error.
*/
CdIo * cdio_open_am_cdrdao (const char *psz_toc_name,
const char *psz_access_mode);
/*! Return a string containing the default CUE file that would
be used when none is specified.
@@ -412,6 +438,15 @@ extern "C" {
char **cdio_get_devices_bincue(void);
/*! Return a string containing the default CUE file that would
be used when none is specified.
NULL is returned on error or there is no device.
*/
char * cdio_get_default_device_cdrdao(void);
char **cdio_get_devices_cdrdao(void);
/*! Set up CD-ROM for reading. The device_name is
the some sort of device name.
@@ -646,9 +681,13 @@ extern "C" {
*/
char *cdio_is_cuefile(const char *cue_name);
/*! Return true if toc_name is a cdrdao TOC file or false
if not a TOC file.
*/
bool cdio_is_tocfile(const char *toc_name);
/*! Return corresponding CUE file if bin_name is a fin file or NULL
if not a BIN file. NOTE: when we handle TOC something will have to
change here....
if not a BIN file.
*/
char *cdio_is_binfile(const char *bin_name);

View File

@@ -1,5 +1,5 @@
/*
$Id: types.h,v 1.13 2004/04/25 14:07:23 rocky Exp $
$Id: types.h,v 1.14 2004/05/04 02:06:48 rocky Exp $
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -288,6 +288,20 @@ typedef int cdio_fs_anal_t;
(CDIO_DRIVE_CAP_DVD_R|CDIO_DRIVE_CAP_DVD_RAM)
/**< Has some sort of DVD writer ability */
/*!
track flags
Q Sub-channel Control Field (4.2.3.3)
*/
typedef enum {
CDIO_TRACK_FLAG_NONE = 0x00, /**< no flags set */
CDIO_TRACK_FLAG_PRE_EMPHASIS = 0x01, /**< audio track recorded with
pre-emphasis */
CDIO_TRACK_FLAG_COPY_PERMITTED = 0x02, /**< digital copy permitted */
CDIO_TRACK_FLAG_DATA = 0x04, /**< data track */
CDIO_TRACK_FLAG_FOUR_CHANNEL_AUDIO = 0x08, /**< 4 audio channels */
CDIO_TRACK_FLAG_SCMS = 0x10 /**< SCMS (5.29.2.7) */
} cdio_track_flag;
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@@ -1,4 +1,4 @@
# $Id: Makefile.am,v 1.33 2004/04/30 09:59:54 rocky Exp $
# $Id: Makefile.am,v 1.34 2004/05/04 02:06:48 rocky Exp $
#
# Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
#
@@ -72,6 +72,7 @@ libcdio_sources = \
FreeBSD/freebsd_cam.c \
FreeBSD/freebsd_ioctl.c \
image/bincue.c \
image/cdrdao.c \
image_common.h \
image/nrg.c \
logging.c \

View File

@@ -1,5 +1,5 @@
/*
$Id: cdio.c,v 1.48 2004/04/30 06:54:15 rocky Exp $
$Id: cdio.c,v 1.49 2004/05/04 02:06:48 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -37,7 +37,7 @@
#include <cdio/logging.h>
#include "cdio_private.h"
static const char _rcsid[] = "$Id: cdio.c,v 1.48 2004/04/30 06:54:15 rocky Exp $";
static const char _rcsid[] = "$Id: cdio.c,v 1.49 2004/05/04 02:06:48 rocky Exp $";
const char *track_format2str[6] =
@@ -153,6 +153,18 @@ CdIo_driver_t CdIo_all_drivers[CDIO_MAX_DRIVER+1] = {
&cdio_get_devices_win32
},
{DRIVER_CDRDAO,
CDIO_SRC_IS_DISK_IMAGE_MASK,
"CDRDAO",
"cdrdao (TOC) disk image driver",
&cdio_have_cdrdao,
&cdio_open_cdrdao,
&cdio_open_am_cdrdao,
&cdio_get_default_device_cdrdao,
NULL,
&cdio_get_devices_cdrdao
},
{DRIVER_BINCUE,
CDIO_SRC_IS_DISK_IMAGE_MASK,
"BIN/CUE",
@@ -434,9 +446,22 @@ cdio_get_drive_cap_dev (const char *device)
const char *
cdio_get_driver_name (const CdIo *cdio)
{
if (NULL==cdio) return NULL;
return CdIo_all_drivers[cdio->driver_id].name;
}
/*!
Return the driver id.
if CdIo is NULL (we haven't initialized a specific device driver),
then return DRIVER_UNKNOWN.
*/
driver_id_t
cdio_get_driver_id (const CdIo *cdio)
{
if (NULL==cdio) return DRIVER_UNKNOWN;
return cdio->driver_id;
}
/*!
Return the number of of the first track.
@@ -846,43 +871,13 @@ cdio_open (const char *orig_source_name, driver_id_t driver_id)
else
source_name = strdup(orig_source_name);
retry:
switch (driver_id) {
case DRIVER_UNKNOWN:
{
CdIo *cdio=scan_for_driver(CDIO_MIN_DRIVER, CDIO_MAX_DRIVER,
source_name);
if (cdio != NULL && cdio_is_device(source_name, cdio->driver_id)) {
driver_id = cdio->driver_id;
} else {
struct stat buf;
if (0 != stat(source_name, &buf)) {
return NULL;
}
if (S_ISREG(buf.st_mode)) {
/* FIXME: check to see if is a text file. If so, then
set SOURCE_CUE. */
int i=strlen(source_name)-strlen("bin");
if (i > 0
&& ( (source_name)[i] =='n' || (source_name)[i] =='N' )
&& ( (source_name)[i+1] =='r' || (source_name)[i+1] =='R' )
&& ( (source_name)[i+2] =='g' || (source_name)[i+2] =='G' ) )
driver_id = DRIVER_NRG;
else if (i > 0
&& ( (source_name)[i] =='c' || (source_name)[i] =='C')
&& ( (source_name)[i+1] =='u' || (source_name)[i+1] =='U')
&& ( (source_name)[i+2] =='e' || (source_name)[i+2] =='E') )
driver_id = DRIVER_BINCUE;
else
driver_id = DRIVER_BINCUE;
} else {
cdio_destroy(cdio);
return NULL;
}
}
cdio_destroy(cdio);
goto retry;
free(source_name);
return cdio;
}
case DRIVER_DEVICE:
{
@@ -900,6 +895,7 @@ cdio_open (const char *orig_source_name, driver_id_t driver_id)
case DRIVER_OSX:
case DRIVER_NRG:
case DRIVER_BINCUE:
case DRIVER_CDRDAO:
if ((*CdIo_all_drivers[driver_id].have_driver)()) {
CdIo *ret = (*CdIo_all_drivers[driver_id].driver_open)(source_name);
if (ret) ret->driver_id = driver_id;

1249
lib/image/cdrdao.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/*
$Id: cd-info.c,v 1.58 2004/04/25 00:46:34 rocky Exp $
$Id: cd-info.c,v 1.59 2004/05/04 02:06:48 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 1996, 1997, 1998 Gerd Knorr <kraxel@bytesex.org>
@@ -105,6 +105,7 @@ enum {
OP_SOURCE_AUTO,
OP_SOURCE_BIN,
OP_SOURCE_CUE,
OP_SOURCE_CDRDAO,
OP_SOURCE_NRG ,
OP_SOURCE_DEVICE,
@@ -197,6 +198,9 @@ parse_options (int argc, const char *argv[])
{"nrg-file", 'N', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name,
OP_SOURCE_NRG, "set Nero CD-ROM disk image file as source", "FILE"},
{"toc-file", 't', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name,
OP_SOURCE_CDRDAO, "set cdrdao CD-ROM disk image file as source", "FILE"},
{"quiet", 'q', POPT_ARG_NONE, &opts.silent, 0,
"Don't produce warning output" },
@@ -215,6 +219,7 @@ parse_options (int argc, const char *argv[])
case OP_SOURCE_AUTO:
case OP_SOURCE_BIN:
case OP_SOURCE_CUE:
case OP_SOURCE_CDRDAO:
case OP_SOURCE_NRG:
case OP_SOURCE_DEVICE:
if (opts.source_image != IMAGE_UNKNOWN) {
@@ -232,6 +237,9 @@ parse_options (int argc, const char *argv[])
case OP_SOURCE_CUE:
opts.source_image = IMAGE_CUE;
break;
case OP_SOURCE_CDRDAO:
opts.source_image = IMAGE_CDRDAO;
break;
case OP_SOURCE_NRG:
opts.source_image = IMAGE_NRG;
break;
@@ -255,7 +263,8 @@ parse_options (int argc, const char *argv[])
if ( remaining_arg != NULL) {
if (opts.source_image != IMAGE_UNKNOWN) {
fprintf (stderr,
"%s: Source specified in option %s and as %s\n",
"%s: Source '%s' given as an argument of an option and as "
"unnamed option '%s'\n",
program_name, source_name, remaining_arg);
poptFreeContext(optCon);
free(program_name);
@@ -444,10 +453,10 @@ print_cddb_info(CdIo *cdio, track_t num_tracks, track_t first_track_num) {
#ifdef HAVE_VCDINFO
static void
print_vcd_info(void) {
print_vcd_info(driver_id_t driver) {
vcdinfo_open_return_t open_rc;
vcdinfo_obj_t *obj;
open_rc = vcdinfo_open(&obj, &source_name, DRIVER_UNKNOWN, NULL);
open_rc = vcdinfo_open(&obj, &source_name, driver, NULL);
switch (open_rc) {
case VCDINFO_OPEN_VCD:
if (vcdinfo_get_format_version (obj) == VCD_TYPE_INVALID) {
@@ -691,7 +700,7 @@ print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis,
if (fs & (CDIO_FS_ANAL_VIDEOCD|CDIO_FS_ANAL_CVD|CDIO_FS_ANAL_SVCD))
if (!opts.no_vcd) {
printf("\n");
print_vcd_info();
print_vcd_info(cdio_get_driver_id(cdio));
}
#endif
@@ -811,6 +820,14 @@ main(int argc, const char *argv[])
program_name, source_name);
}
break;
case IMAGE_CDRDAO:
cdio = cdio_open (source_name, DRIVER_CDRDAO);
if (cdio==NULL) {
err_exit("%s: Error in opening TOC with input %s\n",
program_name, source_name);
}
break;
}
if (cdio==NULL) {

View File

@@ -1,5 +1,5 @@
/*
$Id: cd-read.c,v 1.16 2004/02/07 02:40:20 rocky Exp $
$Id: cd-read.c,v 1.17 2004/05/04 02:06:48 rocky Exp $
Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -41,6 +41,7 @@ enum {
OP_SOURCE_BIN,
OP_SOURCE_CUE,
OP_SOURCE_NRG = DRIVER_NRG,
OP_SOURCE_CDRDAO = DRIVER_CDRDAO,
OP_SOURCE_DEVICE = DRIVER_DEVICE,
/* These are the remaining configuration options */
@@ -219,6 +220,9 @@ parse_options (int argc, const char *argv[])
{"nrg-file", 'N', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name,
OP_SOURCE_NRG, "set Nero CD-ROM disk image file as source", "FILE"},
{"toc-file", 't', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name,
OP_SOURCE_CDRDAO, "set \"TOC\" CD-ROM disk image file as source", "FILE"},
{"output-file", 'o', POPT_ARG_STRING, &opts.output_file, 0,
"Output blocks to file rather than give a hexdump."},
@@ -472,6 +476,14 @@ main(int argc, const char *argv[])
source_name);
}
break;
case IMAGE_CDRDAO:
cdio = cdio_open (source_name, DRIVER_CDRDAO);
if (cdio==NULL) {
err_exit("Error in opening TOC file %s for input\n",
source_name);
}
break;
}
if (opts.access_mode!=NULL) {

View File

@@ -1,5 +1,5 @@
/*
$Id: util.h,v 1.3 2004/04/25 00:46:34 rocky Exp $
$Id: util.h,v 1.4 2004/05/04 02:06:48 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -85,6 +85,7 @@ typedef enum
IMAGE_BIN,
IMAGE_CUE,
IMAGE_NRG,
IMAGE_CDRDAO,
IMAGE_UNKNOWN
} source_image_t;

View File

@@ -1,4 +1,4 @@
# $Id: Makefile.am,v 1.18 2004/02/29 15:04:27 rocky Exp $
# $Id: Makefile.am,v 1.19 2004/05/04 02:06:48 rocky Exp $
#
# Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
#
@@ -41,8 +41,8 @@ check_PROGRAMS = $(hack)
check_DATA = vcd_demo.right \
videocd.right videocd.nrg \
cdda.right cdda.cue cdda.bin \
isofs-m1.right isofs-m1.cue isofs-m1.bin \
cdda.right cdda.toc cdda.cue cdda.bin \
isofs-m1.right isfs-m1.toc isofs-m1.cue isofs-m1.bin \
check_opts0.right check_opts1.right check_opts2.right \
check_opts3.right check_opts4.right check_opts5.right \
check_opts6.right check_opts7.right \

View File

@@ -1,6 +1,8 @@
#!/bin/sh
#$Id: check_cue.sh.in,v 1.15 2003/10/06 04:04:05 rocky Exp $
# Tests to see that BIN/CUE file iamge reading is correct (via cd-info).
#$Id: check_cue.sh.in,v 1.16 2004/05/04 02:06:49 rocky Exp $
# Tests to see that BIN/CUE and BIN/TOC file iamge reading is correct
# (via cd-info).
if test -n "@VCDINFO_LIBS@" ; then
vcd_opt='--no-vcd'
fi
@@ -29,15 +31,30 @@ test_cdinfo "--quiet --bin-file ${srcdir}/${fname}.bin --no-cddb" \
RC=$?
check_result $RC "cd-info BIN test $testnum"
test_cdinfo "--quiet --toc-file ${srcdir}/${fname}.toc --no-cddb" \
${fname}.dump ${srcdir}/${fname}.right
RC=$?
check_result $RC "cd-info TOC test $testnum"
fname=isofs-m1
testnum='ISO 9660 mode1'
testnum='ISO 9660 mode1 CUE'
if test -f ${srcdir}/${fname}.bin ; then
test_cdinfo "-q --cue-file ${srcdir}/${fname}.cue --iso9660" \
${fname}.dump ${srcdir}/${fname}.right
RC=$?
check_result $RC "cd-info CUE test $testnum"
else
echo "Don't see CUE file ${srcdir}/${fname}.bin. Test $testum skipped."
echo "Don't see CUE file ${srcdir}/${fname}.bin. Test $testnum skipped."
fi
testnum='ISO 9660 mode1 TOC'
if test -f ${srcdir}/${fname}.bin ; then
test_cdinfo "-q --toc-file ${srcdir}/${fname}.toc --iso9660" \
${fname}.dump ${srcdir}/${fname}.right
RC=$?
check_result $RC "cd-info TOC test $testnum"
else
echo "Don't see TOC file ${srcdir}/${fname}.bin. Test $testnum skipped."
fi
fname=vcd_demo
@@ -53,7 +70,16 @@ if test -f ${srcdir}/${fname}.cue ; then
RC=$?
check_result $RC "cd-info CUE test $testnum"
else
echo "Don't see CUE file ${srcdir}/${fname}.cue. Test $testum skipped."
echo "Don't see CUE file ${srcdir}/${fname}.cue. Test $testnum skipped."
fi
if test -f ${srcdir}/${fname}.toc ; then
test_cdinfo "-q -t ${srcdir}/vcd_demo.toc --iso9660" \
${fname}.dump $right
RC=$?
check_result $RC "cd-info TOC test $testnum"
else
echo "Don't see TOC file ${srcdir}/${fname}.toc. Test $testnum skipped."
fi
fname=svcd_ogt_test_ntsc

5
test/isofs-m1.toc Normal file
View File

@@ -0,0 +1,5 @@
CATALOG "0000010271955"
CD_DA
TRACK MODE1_RAW
FILE "isofs-m1.bin" 00:00:00 00:00:00

15
test/vcd_demo.toc Normal file
View File

@@ -0,0 +1,15 @@
CD_DA
TRACK MODE2_RAW
COPY
FILE "vcd_demo.bin" 00:00:00 00:13:57
TRACK MODE2_RAW
COPY
FILE "vcd_demo.bin" 00:13:57 00:07:14
START 00:02:00
TRACK MODE2_RAW
COPY
FILE "vcd_demo.bin" 00:20:71 00:00:00
START 00:02:00