From: <fla...@gm...> - 2007-05-31 20:28:21
|
# [node 493330760c70fc72bc65a59a10b7db9ca89aae3c part 6] diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/files.c --- a/src/input/vcd/libvcd/files.c Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1020 +0,0 @@ -/* - $Id: files.c,v 1.4 2006/09/26 21:18:18 dgp85 Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hv...@gn...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <string.h> -#include <stdlib.h> -#include <stddef.h> -#include <math.h> - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/util.h> - -/* Public headers */ -#include <libvcd/files.h> -#include <libvcd/types.h> -#include <libvcd/logging.h> - -/* FIXME! Make this local */ -#include <libvcd/files_private.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "mpeg_stream.h" -#include "obj.h" -#include "pbc.h" -#include "util.h" - -static const char _rcsid[] = "$Id: files.c,v 1.4 2006/09/26 21:18:18 dgp85 Exp $"; - -inline static bool -_pal_p (const struct vcd_mpeg_stream_vid_info *_info) -{ - return (_info->vsize == 288 || _info->vsize == 576); -} - -static int -_derive_vid_type (const struct vcd_mpeg_stream_info *_info, bool svcd) -{ - if (_info->shdr[0].seen) - return _pal_p (&_info->shdr[0]) ? 0x7 : 0x3; - - if (_info->shdr[2].seen) - { - if (svcd) - vcd_warn ("stream with 0xE2 still stream id not allowed for IEC62107 compliant SVCDs"); - return _pal_p (&_info->shdr[2]) ? 0x6 : 0x2; - } - - if (_info->shdr[1].seen) - return _pal_p (&_info->shdr[1]) ? 0x5 : 0x1; - - return 0; -} - -static int -_derive_ogt_type (const struct vcd_mpeg_stream_info *_info, bool svcd) -{ - - if (!svcd) - return 0; - - if ((_info->ogt[3] || _info->ogt[2]) - && _info->ogt[1] && _info->ogt[0]) - return 0x3; - - if (_info->ogt[1] && _info->ogt[0]) - return 0x2; - - if (_info->ogt[0]) - return 0x1; - - vcd_debug ("OGT streams available: %d %d %d %d", - _info->ogt[0], _info->ogt[1], - _info->ogt[2], _info->ogt[3]); - - return 0x0; -} - -static int -_derive_aud_type (const struct vcd_mpeg_stream_info *_info, bool svcd) -{ - if (!_info->ahdr[0].seen) - return 0; /* no MPEG audio */ - - if (svcd) - { - if (_info->ahdr[2].seen) - return 3; /* MC */ - - if (_info->ahdr[1].seen) - return 2; /* 2 streams */ - - return 1; /* just one stream */ - } - else - switch (_info->ahdr[0].mode) - { - case MPEG_SINGLE_CHANNEL: - return 1; - break; - - case MPEG_STEREO: - case MPEG_JOINT_STEREO: [... 768 lines omitted ...] - - n = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_track_list) - { - const mpeg_track_t *track = _cdio_list_node_data (node); - uint32_t *_table; - const unsigned scanpoints = _get_scandata_count (track->info); - const unsigned _table_ofs = - (_tmp_offset * sizeof (msf_t)) + _begin_offset; - unsigned point; - - scandata_dat3->mpeg_track_offsets[n].track_num = n + 2; - scandata_dat3->mpeg_track_offsets[n].table_offset = uint16_to_be (_table_ofs); - - _table = _get_scandata_table (track->info); - - for (point = 0; point < scanpoints; point++) - { - uint32_t lsect = _table[point]; - - lsect += obj->iso_size; - lsect += track->relative_start_extent; - lsect += obj->track_front_margin; - - /* vcd_debug ("lsect %d %d", point, lsect); */ - - cdio_lba_to_msf(cdio_lsn_to_lba(lsect), - &(scandata_dat4->scandata_table[_tmp_offset + point])); - } - - free (_table); - - _tmp_offset += scanpoints; - n++; - } - - /* struct 4 */ - - -} - -vcd_type_t -vcd_files_info_detect_type (const void *info_buf) -{ - const InfoVcd_t *_info = info_buf; - vcd_type_t _type = VCD_TYPE_INVALID; - - vcd_assert (info_buf != NULL); - - if (!strncmp (_info->ID, INFO_ID_VCD, sizeof (_info->ID))) - switch (_info->version) - { - case INFO_VERSION_VCD2: - if (_info->sys_prof_tag != INFO_SPTAG_VCD2) - vcd_warn ("INFO.VCD: unexpected system profile tag %d encountered", - _info->version); - _type = VCD_TYPE_VCD2; - break; - - case INFO_VERSION_VCD: - /* case INFO_VERSION_VCD11: */ - switch (_info->sys_prof_tag) - { - case INFO_SPTAG_VCD: - _type = VCD_TYPE_VCD; - break; - case INFO_SPTAG_VCD11: - _type = VCD_TYPE_VCD11; - break; - default: - vcd_warn ("INFO.VCD: unexpected system profile tag %d " - "encountered, assuming VCD 1.1", _info->sys_prof_tag); - break; - } - break; - - default: - vcd_warn ("unexpected VCD version %d encountered -- assuming VCD 2.0", - _info->version); - break; - } - else if (!strncmp (_info->ID, INFO_ID_SVCD, sizeof (_info->ID))) - switch (_info->version) - { - case INFO_VERSION_SVCD: - if (_info->sys_prof_tag != INFO_SPTAG_SVCD) - vcd_warn ("INFO.SVD: unexpected system profile tag value %d " - "-- assuming SVCD", _info->sys_prof_tag); - _type = VCD_TYPE_SVCD; - break; - - default: - vcd_warn ("INFO.SVD: unexpected version value %d seen " - " -- still assuming SVCD", _info->version); - _type = VCD_TYPE_SVCD; - break; - } - else if (!strncmp (_info->ID, INFO_ID_HQVCD, sizeof (_info->ID))) - switch (_info->version) - { - case INFO_VERSION_HQVCD: - if (_info->sys_prof_tag != INFO_SPTAG_HQVCD) - vcd_warn ("INFO.SVD: unexpected system profile tag value -- assuming hqvcd"); - _type = VCD_TYPE_HQVCD; - break; - - default: - vcd_warn ("INFO.SVD: unexpected version value %d seen " - "-- still assuming HQVCD", _info->version); - _type = VCD_TYPE_HQVCD; - break; - } - else - vcd_warn ("INFO.SVD: signature not found"); - - return _type; -} - -/* eof */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/image.c --- a/src/input/vcd/libvcd/image.c Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/* - $Id: image.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hv...@gn...> - 2002 Rocky Bernstein <ro...@pa...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> - -/* Public headers */ -#include <libvcd/sector.h> -#include <cdio/iso9660.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "image_sink.h" -#include "util.h" - -static const char _rcsid[] = "$Id: image.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -/* - * VcdImageSink routines next. - */ - -struct _VcdImageSink { - void *user_data; - vcd_image_sink_funcs op; -}; - -VcdImageSink * -vcd_image_sink_new (void *user_data, const vcd_image_sink_funcs *funcs) -{ - VcdImageSink *new_obj; - - new_obj = _vcd_malloc (sizeof (VcdImageSink)); - - new_obj->user_data = user_data; - new_obj->op = *funcs; - - return new_obj; -} - -void -vcd_image_sink_destroy (VcdImageSink *obj) -{ - vcd_assert (obj != NULL); - - obj->op.free (obj->user_data); - free (obj); -} - -int -vcd_image_sink_set_cuesheet (VcdImageSink *obj, const CdioList *vcd_cue_list) -{ - vcd_assert (obj != NULL); - - return obj->op.set_cuesheet (obj->user_data, vcd_cue_list); -} - -int -vcd_image_sink_write (VcdImageSink *obj, void *buf, lsn_t lsn) -{ - vcd_assert (obj != NULL); - - return obj->op.write (obj->user_data, buf, lsn); -} - -/*! - Set the arg "key" with "value" in the target device. -*/ - -int -vcd_image_sink_set_arg (VcdImageSink *obj, const char key[], - const char value[]) -{ - vcd_assert (obj != NULL); - vcd_assert (obj->op.set_arg != NULL); - vcd_assert (key != NULL); - - return obj->op.set_arg (obj->user_data, key, value); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/image_bincue.c --- a/src/input/vcd/libvcd/image_bincue.c Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,259 +0,0 @@ -/* - $Id: image_bincue.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001, 2004 Herbert Valerio Riedel <hv...@gn...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - - -#include <stdlib.h> -#include <string.h> - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/iso9660.h> - -/* Public headers */ -#include <libvcd/sector.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "image_sink.h" -#include "stream_stdio.h" -#include "util.h" - -static const char _rcsid[] = "$Id: image_bincue.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -/* reader */ - -#define DEFAULT_VCD_DEVICE "videocd.bin" - -/**************************************************************************** - * writer - */ - -typedef struct { - bool sector_2336_flag; - VcdDataSink *bin_snk; - VcdDataSink *cue_snk; - char *bin_fname; - char *cue_fname; - - bool init; -} _img_bincue_snk_t; - -static void -_sink_init (_img_bincue_snk_t *_obj) -{ - if (_obj->init) - return; - - if (!(_obj->bin_snk = vcd_data_sink_new_stdio (_obj->bin_fname))) - vcd_error ("init failed"); - - if (!(_obj->cue_snk = vcd_data_sink_new_stdio (_obj->cue_fname))) - vcd_error ("init failed"); - - _obj->init = true; -} - -static void -_sink_free (void *user_data) -{ - _img_bincue_snk_t *_obj = user_data; - - vcd_data_sink_destroy (_obj->bin_snk); - vcd_data_sink_destroy (_obj->cue_snk); - free (_obj->bin_fname); - free (_obj->cue_fname); - free (_obj); -} - -static int -_set_cuesheet (void *user_data, const CdioList *vcd_cue_list) -{ - _img_bincue_snk_t *_obj = user_data; - CdioListNode *node; - int track_no, index_no; - const vcd_cue_t *_last_cue = 0; - - _sink_init (_obj); - - vcd_data_sink_printf (_obj->cue_snk, "FILE \"%s\" BINARY\r\n", - _obj->bin_fname); - - track_no = 0; - index_no = 0; - _CDIO_LIST_FOREACH (node, (CdioList *) vcd_cue_list) - { - const vcd_cue_t *_cue = _cdio_list_node_data (node); - char *psz_msf; - - msf_t _msf = { 0, 0, 0 }; - - switch (_cue->type) - { - case VCD_CUE_TRACK_START: - track_no++; - index_no = 0; - - vcd_data_sink_printf (_obj->cue_snk, - " TRACK %2.2d MODE2/%d\r\n" - " FLAGS DCP\r\n", - track_no, (_obj->sector_2336_flag ? 2336 : 2352)); - - if (_last_cue && _last_cue->type == VCD_CUE_PREGAP_START) - { [... 7 lines omitted ...] - } - - index_no++; - - cdio_lba_to_msf (_cue->lsn, &_msf); - psz_msf = cdio_msf_to_str(&_msf); - - vcd_data_sink_printf (_obj->cue_snk, - " INDEX %2.2d %s\r\n", - index_no, psz_msf); - free(psz_msf); - break; - - case VCD_CUE_PREGAP_START: - /* handled in next iteration */ - break; - - case VCD_CUE_SUBINDEX: - vcd_assert (_last_cue != 0); - - index_no++; - vcd_assert (index_no <= CDIO_CD_MAX_TRACKS); - - cdio_lba_to_msf (_cue->lsn, &_msf); - psz_msf = cdio_msf_to_str(&_msf); - - vcd_data_sink_printf (_obj->cue_snk, - " INDEX %2.2d %s\r\n", - index_no, psz_msf); - free(psz_msf); - break; - - case VCD_CUE_END: - vcd_data_sink_close (_obj->cue_snk); - return 0; - break; - - case VCD_CUE_LEADIN: - break; - } - - _last_cue = _cue; - } - - vcd_assert_not_reached (); - - return -1; -} - -static int -_vcd_image_bincue_write (void *user_data, const void *data, lsn_t lsn) -{ - const char *buf = data; - _img_bincue_snk_t *_obj = user_data; - long offset = lsn; - - _sink_init (_obj); - - offset *= _obj->sector_2336_flag ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE_RAW; - - vcd_data_sink_seek(_obj->bin_snk, offset); - - if (_obj->sector_2336_flag) - vcd_data_sink_write(_obj->bin_snk, buf + 12 + 4, M2RAW_SECTOR_SIZE, 1); - else - vcd_data_sink_write(_obj->bin_snk, buf, CDIO_CD_FRAMESIZE_RAW, 1); - - return 0; -} - -static int -_sink_set_arg (void *user_data, const char key[], const char value[]) -{ - _img_bincue_snk_t *_obj = user_data; - - if (!strcmp (key, "bin")) - { - free (_obj->bin_fname); - - if (!value) - return -2; - - _obj->bin_fname = strdup (value); - } - else if (!strcmp (key, "cue")) - { - free (_obj->cue_fname); - - if (!value) - return -2; - - _obj->cue_fname = strdup (value); - } - else if (!strcmp (key, "sector")) - { - if (!strcmp (value, "2336")) - _obj->sector_2336_flag = true; - else if (!strcmp (value, "2352")) - _obj->sector_2336_flag = false; - else - return -2; - } - else - return -1; - - return 0; -} - -VcdImageSink * -vcd_image_sink_new_bincue (void) -{ - _img_bincue_snk_t *_data; - - vcd_image_sink_funcs _funcs = { - .set_cuesheet = _set_cuesheet, - .write = _vcd_image_bincue_write, - .free = _sink_free, - .set_arg = _sink_set_arg - }; - - _data = _vcd_malloc (sizeof (_img_bincue_snk_t)); - - _data->bin_fname = strdup ("videocd.bin"); - _data->cue_fname = strdup ("videocd.cue"); - - return vcd_image_sink_new (_data, &_funcs); -} - diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/image_cdrdao.c --- a/src/input/vcd/libvcd/image_cdrdao.c Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,313 +0,0 @@ -/* - $Id: image_cdrdao.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hv...@gn...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -/* Public headers */ -#include <cdio/iso9660.h> -#include <cdio/bytesex.h> -#include <libvcd/sector.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "image_sink.h" -#include "stream_stdio.h" -#include "util.h" -#include "vcd.h" - -static const char _rcsid[] = "$Id: image_cdrdao.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -/* reader */ - -/**************************************************************************** - * writer - */ - -typedef struct { - bool sector_2336_flag; - char *toc_fname; - char *img_base; - - VcdDataSink *last_bin_snk; - int last_snk_idx; - bool last_pause; - - CdioList *vcd_cue_list; -} _img_cdrdao_snk_t; - -static void -_sink_free (void *user_data) -{ - _img_cdrdao_snk_t *_obj = user_data; - - /* fixme -- destroy cue list */ - - vcd_data_sink_destroy (_obj->last_bin_snk); - free (_obj->toc_fname); - free (_obj->img_base); - free (_obj); -} - -static int -_set_cuesheet (void *user_data, const CdioList *vcd_cue_list) -{ - _img_cdrdao_snk_t *_obj = user_data; - VcdDataSink *toc_snk = vcd_data_sink_new_stdio (_obj->toc_fname); - - CdioListNode *node; - - int track_no, index_no; - const vcd_cue_t *_last_cue = 0; - unsigned last_track_lsn = 0; - - vcd_data_sink_printf (toc_snk, - "// CDRDAO TOC\n" - "// generated by %s\n\n" - "CD_ROM_XA\n", vcd_version_string (false)); - - _obj->vcd_cue_list = _cdio_list_new (); - - index_no = track_no = 0; - _CDIO_LIST_FOREACH (node, (CdioList *) vcd_cue_list) - { - const vcd_cue_t *_cue = _cdio_list_node_data (node); - - /* copy cue list while traversing */ - { - vcd_cue_t *_cue2 = _vcd_malloc (sizeof (vcd_cue_t)); - *_cue2 = *_cue; - _cdio_list_append (_obj->vcd_cue_list, _cue2); - } - - switch (_cue->type) - { - case VCD_CUE_TRACK_START: - track_no++; - index_no = 0; - - last_track_lsn = _cue->lsn; - - vcd_data_sink_printf (toc_snk, - "\n// Track %d\n" - "TRACK %s\n COPY\n", - track_no, - (_obj->sector_2336_flag ? "MODE2_FORM_MIX" : "MODE2_RAW")); - - if (_last_cue && _last_cue->type == VCD_CUE_PREGAP_START) - vcd_data_sink_printf (toc_snk, - " DATAFILE \"%s_%.2d_pregap.img\"\n" - " START\n", - _obj->img_base, track_no); [... 61 lines omitted ...] - - int num = 0, in_track = 0; - _CDIO_LIST_FOREACH (node, _obj->vcd_cue_list) - { - const vcd_cue_t *_cue = _cdio_list_node_data (node); - - switch (_cue->type) - { - case VCD_CUE_PREGAP_START: - case VCD_CUE_END: - case VCD_CUE_TRACK_START: - if (_cue->lsn && IN (lsn, _last, _cue->lsn - 1)) - { - vcd_assert (in_track == 0); - in_track = num; - _ofs = _last; - _pregap = _lpregap; - } - - _last = _cue->lsn; - _lpregap = (_cue->type == VCD_CUE_PREGAP_START); - - if (_cue->type == VCD_CUE_TRACK_START) - num++; - break; - - default: - /* noop */ - break; - } - } - - vcd_assert (in_track != 0); - vcd_assert (_obj->last_snk_idx <= in_track); - - if (_obj->last_snk_idx != in_track - || _obj->last_pause != _pregap) - { - char buf[4096] = { 0, }; - - if (_obj->last_bin_snk) - vcd_data_sink_destroy (_obj->last_bin_snk); - - snprintf (buf, sizeof (buf), - "%s_%.2d%s.img", - _obj->img_base, - (_pregap ? in_track + 1 : in_track), - (_pregap ? "_pregap" : "")); - - _obj->last_bin_snk = vcd_data_sink_new_stdio (buf); - _obj->last_snk_idx = in_track; - _obj->last_pause = _pregap; - } - - vcd_assert (lsn >= _ofs); - offset = lsn - _ofs; - } - - offset *= _obj->sector_2336_flag ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE_RAW; - - vcd_data_sink_seek(_obj->last_bin_snk, offset); - - if (_obj->sector_2336_flag) - vcd_data_sink_write(_obj->last_bin_snk, buf + 12 + 4, M2RAW_SECTOR_SIZE, 1); - else - vcd_data_sink_write(_obj->last_bin_snk, buf, CDIO_CD_FRAMESIZE_RAW, 1); - - return 0; -} - -static int -_sink_set_arg (void *user_data, const char key[], const char value[]) -{ - _img_cdrdao_snk_t *_obj = user_data; - - if (!strcmp (key, "toc")) - { - free (_obj->toc_fname); - - if (!value) - return -2; - - _obj->toc_fname = strdup (value); - } - else if (!strcmp (key, "img_base")) - { - free (_obj->img_base); - - if (!value) - return -2; - - _obj->img_base = strdup (value); - } - else if (!strcmp (key, "sector")) - { - if (!strcmp (value, "2336")) - _obj->sector_2336_flag = true; - else if (!strcmp (value, "2352")) - _obj->sector_2336_flag = false; - else - return -2; - } - else - return -1; - - return 0; -} - -VcdImageSink * -vcd_image_sink_new_cdrdao (void) -{ - _img_cdrdao_snk_t *_data; - - vcd_image_sink_funcs _funcs = { - .set_cuesheet = _set_cuesheet, - .write = _vcd_image_cdrdao_write, - .free = _sink_free, - .set_arg = _sink_set_arg - }; - - _data = _vcd_malloc (sizeof (_img_cdrdao_snk_t)); - - _data->toc_fname = strdup ("videocd.toc"); - _data->img_base = strdup ("videocd"); - - return vcd_image_sink_new (_data, &_funcs); -} - diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/image_nrg.c --- a/src/input/vcd/libvcd/image_nrg.c Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,352 +0,0 @@ -/* - $Id: image_nrg.c,v 1.4 2006/09/27 05:41:40 dgp85 Exp $ - - Copyright (C) 2001, 2003, 2004 Herbert Valerio Riedel <hv...@gn...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/*! This code implements low-level access functions for Nero's native - CD-image format residing inside a disk file (*.nrg). -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/iso9660.h> - -/* Public headers */ -#include <libvcd/sector.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "image_sink.h" -#include "stream_stdio.h" -#include "util.h" - -static const char _rcsid[] = "$Id: image_nrg.c,v 1.4 2006/09/27 05:41:40 dgp85 Exp $"; - -/* structures used */ - -/* this ugly image format is typical for lazy win32 programmers... at - least structure were set big endian, so at reverse - engineering wasn't such a big headache... */ - -PRAGMA_BEGIN_PACKED -typedef struct { - uint32_t start GNUC_PACKED; - uint32_t length GNUC_PACKED; - uint32_t type GNUC_PACKED; /* only 0x3 seen so far... - -> MIXED_MODE2 2336 blocksize */ - uint32_t start_lsn GNUC_PACKED; /* does not include any pre-gaps! */ - uint32_t _unknown GNUC_PACKED; /* wtf is this for? -- always zero... */ -} _etnf_array_t; - -/* finally they realized that 32bit offsets are a bit outdated for IA64 *eg* */ -typedef struct { - uint64_t start GNUC_PACKED; - uint64_t length GNUC_PACKED; - uint32_t type GNUC_PACKED; - uint32_t start_lsn GNUC_PACKED; - uint64_t _unknown GNUC_PACKED; /* wtf is this for? -- always zero... */ -} _etn2_array_t; - -typedef struct { - uint8_t _unknown1 GNUC_PACKED; /* 0x41 == 'A' */ - uint8_t track GNUC_PACKED; /* binary or BCD?? */ - uint8_t index GNUC_PACKED; /* makes 0->1 transitions */ - uint8_t _unknown2 GNUC_PACKED; /* ?? */ - uint32_t lsn GNUC_PACKED; -} _cuex_array_t; - -typedef struct { - uint32_t id GNUC_PACKED; - uint32_t len GNUC_PACKED; - char data[EMPTY_ARRAY_SIZE] GNUC_PACKED; -} _chunk_t; - -PRAGMA_END_PACKED - -/* to be converted into BE */ -#define CUEX_ID 0x43554558 -#define CUES_ID 0x43554553 -#define DAOX_ID 0x44414f58 -#define DAOI_ID 0x44414f49 -#define END1_ID 0x454e4421 -#define ETN2_ID 0x45544e32 -#define ETNF_ID 0x45544e46 -#define NER5_ID 0x4e455235 -#define NERO_ID 0x4e45524f -#define SINF_ID 0x53494e46 - -/**************************************************************************** - * writer - */ - -typedef struct { - VcdDataSink *nrg_snk; - char *nrg_fname; - - CdioList *vcd_cue_list; - int tracks; - uint32_t cue_end_lsn; - - bool init; -} _img_nrg_snk_t; - -static void -_sink_init (_img_nrg_snk_t *_obj) -{ - if (_obj->init) - return; - - if (!(_obj->nrg_snk = vcd_data_sink_new_stdio (_obj->nrg_fname))) - vcd_error ("init failed"); [... 100 lines omitted ...] -} - -static int -_write_tail (_img_nrg_snk_t *_obj, uint32_t offset) -{ - CdioListNode *node; - int _size; - _chunk_t _chunk; - - vcd_data_sink_seek (_obj->nrg_snk, offset); - - _size = _obj->tracks * sizeof (_etnf_array_t); - _chunk.id = UINT32_TO_BE (ETNF_ID); - _chunk.len = uint32_to_be (_size); - - vcd_data_sink_write (_obj->nrg_snk, &_chunk, sizeof (_chunk_t), 1); - - _CDIO_LIST_FOREACH (node, _obj->vcd_cue_list) - { - vcd_cue_t *_cue = _cdio_list_node_data (node); - - if (_cue->type == VCD_CUE_TRACK_START) - { - vcd_cue_t *_cue2 = - _cdio_list_node_data (_cdio_list_node_next (node)); - - _etnf_array_t _etnf = { 0, }; - - _etnf.type = UINT32_TO_BE (0x3); - _etnf.start_lsn = uint32_to_be (_map (_obj, _cue->lsn)); - _etnf.start = uint32_to_be (_map (_obj, _cue->lsn) * M2RAW_SECTOR_SIZE); - - _etnf.length = uint32_to_be ((_cue2->lsn - _cue->lsn) * M2RAW_SECTOR_SIZE); - - vcd_data_sink_write (_obj->nrg_snk, &_etnf, sizeof (_etnf_array_t), 1); - } - - } - - { - uint32_t tracks = uint32_to_be (_obj->tracks); - - _chunk.id = UINT32_TO_BE (SINF_ID); - _chunk.len = UINT32_TO_BE (sizeof (uint32_t)); - vcd_data_sink_write (_obj->nrg_snk, &_chunk, sizeof (_chunk_t), 1); - - vcd_data_sink_write (_obj->nrg_snk, &tracks, sizeof (uint32_t), 1); - } - - _chunk.id = UINT32_TO_BE (END1_ID); - _chunk.len = UINT32_TO_BE (0); - vcd_data_sink_write (_obj->nrg_snk, &_chunk, sizeof (_chunk_t), 1); - - _chunk.id = UINT32_TO_BE (NERO_ID); - _chunk.len = uint32_to_be (offset); - vcd_data_sink_write (_obj->nrg_snk, &_chunk, sizeof (_chunk_t), 1); - - return 0; -} - -static int -_vcd_image_nrg_write (void *user_data, const void *data, lsn_t lsn) -{ - const char *buf = data; - _img_nrg_snk_t *_obj = user_data; - uint32_t _lsn = _map (_obj, lsn); - - _sink_init (_obj); - - if (_lsn == -1) - { - /* vcd_debug ("ignoring %d", lsn); */ - return 0; - } - - vcd_data_sink_seek(_obj->nrg_snk, _lsn * M2RAW_SECTOR_SIZE); - vcd_data_sink_write(_obj->nrg_snk, buf + 12 + 4, M2RAW_SECTOR_SIZE, 1); - - if (_obj->cue_end_lsn - 1 == lsn) - { - vcd_debug ("ENDLSN reached! (%lu == %lu)", - (long unsigned int) lsn, (long unsigned int) _lsn); - return _write_tail (_obj, (_lsn + 1) * M2RAW_SECTOR_SIZE); - } - - return 0; -} - -static int -_sink_set_arg (void *user_data, const char key[], const char value[]) -{ - _img_nrg_snk_t *_obj = user_data; - - if (!strcmp (key, "nrg")) - { - free (_obj->nrg_fname); - - if (!value) - return -2; - - _obj->nrg_fname = strdup (value); - } - else - return -1; - - return 0; -} - -VcdImageSink * -vcd_image_sink_new_nrg (void) -{ - _img_nrg_snk_t *_data; - - vcd_image_sink_funcs _funcs = { - .set_cuesheet = _set_cuesheet, - .write = _vcd_image_nrg_write, - .free = _sink_free, - .set_arg = _sink_set_arg - }; - - _data = _vcd_malloc (sizeof (_img_nrg_snk_t)); - _data->nrg_fname = strdup ("videocd.nrg"); - - vcd_warn ("opening TAO NRG image for writing; TAO (S)VCD are NOT 100%% compliant!"); - - return vcd_image_sink_new (_data, &_funcs); -} - diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/image_sink.h --- a/src/input/vcd/libvcd/image_sink.h Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - $Id: image_sink.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hv...@gn...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __VCD_IMAGE_SINK_H__ -#define __VCD_IMAGE_SINK_H__ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> -#include <libvcd/types.h> - -/* Private includes */ -#include "data_structures.h" -#include "stream.h" - -/* VcdImageSink ( --> image writer) */ - -typedef struct _VcdImageSink VcdImageSink; - -typedef struct { - uint32_t lsn; - enum { - VCD_CUE_TRACK_START = 1, /* INDEX 0 -> 1 transition, TOC entry */ - VCD_CUE_PREGAP_START, /* INDEX = 0 start */ - VCD_CUE_SUBINDEX, /* INDEX++; sub-index */ - VCD_CUE_END, /* lead-out start */ - VCD_CUE_LEADIN, /* lead-in start */ - } type; -} vcd_cue_t; - -typedef struct { - int (*set_cuesheet) (void *user_data, const CdioList *vcd_cue_list); - int (*write) (void *user_data, const void *buf, lsn_t lsn); - void (*free) (void *user_data); - int (*set_arg) (void *user_data, const char key[], const char value[]); -} vcd_image_sink_funcs; - -VcdImageSink * -vcd_image_sink_new (void *user_data, const vcd_image_sink_funcs *funcs); - -void -vcd_image_sink_destroy (VcdImageSink *obj); - -int -vcd_image_sink_set_cuesheet (VcdImageSink *obj, const CdioList *vcd_cue_list); - -int -vcd_image_sink_write (VcdImageSink *obj, void *buf, lsn_t lsn); - -/*! - Set the arg "key" with "value" in the target device. -*/ -int -vcd_image_sink_set_arg (VcdImageSink *obj, const char key[], - const char value[]); - -VcdImageSink * vcd_image_sink_new_nrg (void); -VcdImageSink * vcd_image_sink_new_bincue (void); -VcdImageSink * vcd_image_sink_new_cdrdao (void); - -#endif /* __VCD_IMAGE_SINK_H__ */ diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/inf.c --- a/src/input/vcd/libvcd/inf.c Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,531 +0,0 @@ -/* - $Id: inf.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2002,2003 Rocky Bernstein <ro...@pa...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/* - Things here refer to lower-level structures using a structure other - than vcdinfo_t. For higher-level structures via the vcdinfo_t, see - info.c -*/ - - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stddef.h> -#include <errno.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/util.h> - -/* Eventually move above libvcd includes but having vcdinfo including. */ -#include <libvcd/info.h> - -/* Private headers */ -#include "info_private.h" -#include "pbc.h" - -static const char _rcsid[] = "$Id: inf.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -#define BUF_COUNT 16 -#define BUF_SIZE 80 - -/* Return a pointer to a internal free buffer */ -static char * -_getbuf (void) -{ - static char _buf[BUF_COUNT][BUF_SIZE]; - static int _num = -1; - - _num++; - _num %= BUF_COUNT; - - memset (_buf[_num], 0, BUF_SIZE); - - return _buf[_num]; -} - -const char * -vcdinf_area_str (const struct psd_area_t *_area) -{ - char *buf; - - if (!_area->x1 - && !_area->y1 - && !_area->x2 - && !_area->y2) - return "disabled"; - - buf = _getbuf (); - - snprintf (buf, BUF_SIZE, "[%3d,%3d] - [%3d,%3d]", - _area->x1, _area->y1, - _area->x2, _area->y2); - - return buf; -} - -/*! - Return a string containing the VCD album id, or NULL if there is - some problem in getting this. -*/ -const char * -vcdinf_get_album_id(const InfoVcd_t *info) -{ - if (NULL==info) return NULL; - return vcdinfo_strip_trail (info->album_desc, MAX_ALBUM_LEN); -} - -/*! - Get autowait time value for PsdPlayListDescriptor *d. - Time is in seconds unless it is -1 (unlimited). -*/ -int -vcdinf_get_autowait_time (const PsdPlayListDescriptor_t *d) -{ - return vcdinfo_get_wait_time (d->atime); -} - -/*! [... 279 lines omitted ...] -vcdinf_pld_get_prev_offset(const PsdPlayListDescriptor_t *pld) -{ - return (pld != NULL) ? - uint16_from_be (pld->prev_ofs) : VCDINFO_INVALID_OFFSET; -} - -/** - \fn vcdinf_pld_get_return_offset(const PsdPlayListDescriptor *pld); - \brief Get return offset for a given PLD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if pld has no - "return" entry or pld is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_pld_get_return_offset(const PsdPlayListDescriptor_t *pld) -{ - return (pld != NULL) ? - uint16_from_be (pld->return_ofs) : VCDINFO_INVALID_OFFSET; -} - -/** - * \fn vcdinfo_psd_get_default_offset(const PsdSelectionListDescriptor *psd); - * \brief Get next offset for a given PSD selector descriptor. - * \return VCDINFO_INVALID_OFFSET is returned on error or if psd is - * NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_default_offset(const PsdSelectionListDescriptor_t *psd) -{ - if (NULL == psd) return VCDINFO_INVALID_OFFSET; - return uint16_from_be (psd->default_ofs); -} - -/*! - Get the item id for a given selection-list descriptor. - VCDINFO_REJECTED_MASK is returned on error or if psd is NULL. -*/ -uint16_t -vcdinf_psd_get_itemid(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) ? uint16_from_be(psd->itemid) : VCDINFO_REJECTED_MASK; -} - -/*! - Get the LID from a given selection-list descriptor. - VCDINFO_REJECTED_MASK is returned on error or psd is NULL. -*/ -lid_t -vcdinf_psd_get_lid(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) - ? uint16_from_be (psd->lid) & VCDINFO_LID_MASK - : VCDINFO_REJECTED_MASK; -} - -/*! - Get the LID rejected status for a given PSD selector descriptor. - true is also returned d is NULL. -*/ -bool -vcdinf_psd_get_lid_rejected(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) - ? vcdinfo_is_rejected(uint16_from_be(psd->lid)) - : true; -} - -/** - * \fn vcdinf_psd_get_next_offset(const PsdSelectionListDescriptor *psd); - * \brief Get "next" offset for a given PSD selector descriptor. - * \return VCDINFO_INVALID_OFFSET is returned on error or if psd is - * NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_next_offset(const PsdSelectionListDescriptor_t *psd) -{ - if (NULL == psd) return VCDINFO_INVALID_OFFSET; - return uint16_from_be (psd->next_ofs); -} - -/** - * \fn vcdinf_psd_get_offset(const PsdSelectionListDescriptor *d, - * unsigned int entry_num); - * \brief Get offset entry_num for a given PSD selector descriptor. - * \return VCDINFO_INVALID_OFFSET is returned if d on error or d is - * NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_offset(const PsdSelectionListDescriptor_t *psd, - unsigned int entry_num) -{ - return (psd != NULL && entry_num < vcdinf_get_num_selections(psd)) - ? uint16_from_be (psd->ofs[entry_num]) : VCDINFO_INVALID_OFFSET; -} - -/** - \fn vcdinf_psd_get_prev_offset(const PsdSelectionListDescriptor *psd); - \brief Get "prev" offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if psd has no "prev" - entry or psd is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_prev_offset(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) ? - uint16_from_be (psd->prev_ofs) : VCDINFO_INVALID_OFFSET; -} - -/** - * \fn vcdinf_psd_get_return_offset(const PsdSelectionListDescriptor *psd); - * \brief Get return offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if psd has no - "return" entry or psd is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_return_offset(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) ? - uint16_from_be (psd->return_ofs) : VCDINFO_INVALID_OFFSET; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/info.c --- a/src/input/vcd/libvcd/info.c Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2103 +0,0 @@ -/* - $Id: info.c,v 1.8 2007/03/23 21:47:31 dsalt Exp $ - - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <ro...@pa...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -/* - Things here refer to higher-level structures usually accessed via - vcdinfo_t. For lower-level access which generally use - structures other than vcdinfo_t, see inf.c -*/ - - -/* Private headers */ -#include "info_private.h" -#include "vcd_assert.h" -#include "pbc.h" -#include "util.h" -#include "vcd_read.h" - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/cd_types.h> -#include <cdio/util.h> - -/* Eventually move above libvcd includes but having vcdinfo including. */ -#include <libvcd/info.h> - -#include <stdio.h> -#include <stddef.h> -#include <errno.h> - -static const char _rcsid[] = "$Id: info.c,v 1.8 2007/03/23 21:47:31 dsalt Exp $"; - -#define BUF_COUNT 16 -#define BUF_SIZE 80 - -/* Return a pointer to a internal free buffer */ -static char * -_getbuf (void) -{ - static char _buf[BUF_COUNT][BUF_SIZE]; - static int _num = -1; - - _num++; - _num %= BUF_COUNT; - - memset (_buf[_num], 0, BUF_SIZE); - - return _buf[_num]; -} - -/* - Initialize/allocate segment portion of vcdinfo_obj_t. - - Getting exact segments sizes is done in a rather complicated way. - A simple approach would be to use the fixed size allocated on disk, - but players have trouble with the internal fragmentation padding. - More accurate results are obtained by consulting with ISO 9660 - information for the corresponding file entry. - - Another approach to get segment sizes is to read/scan the - MPEGs. That would be rather slow. -*/ -static void -_init_segments (vcdinfo_obj_t *obj) -{ - InfoVcd_t *info = vcdinfo_get_infoVcd(obj); - segnum_t num_segments = vcdinfo_get_num_segments(obj); - CdioListNode *entnode; - CdioList *entlist; - int i; - lsn_t last_lsn=0; - - obj->first_segment_lsn = cdio_msf_to_lsn(&info->first_seg_addr); - obj->seg_sizes = _vcd_malloc( num_segments * sizeof(uint32_t *)); - - if (NULL == obj->seg_sizes || 0 == num_segments) return; - - entlist = iso9660_fs_readdir(obj->img, "SEGMENT", true); - - i=0; - _CDIO_LIST_FOREACH (entnode, entlist) { - iso9660_stat_t *statbuf = _cdio_list_node_data (entnode); - - if (statbuf->type == _STAT_DIR) continue; - - while(info->spi_contents[i].item_cont) { - obj->seg_sizes[i] = VCDINFO_SEGMENT_SECTOR_SIZE; - i++; - } - - /* Should have an entry in the ISO 9660 filesystem. Get and save - in statbuf.secsize this size. - */ [... 1851 lines omitted ...] - if (statbuf->size != LOT_VCD_SIZE * ISO_BLOCKSIZE) - vcd_warn ("LOT_X.VCD size != 65535"); - - free(statbuf); - if (cdio_read_mode2_sectors (img, obj->lot_x, lsn, false, secsize)) - return VCDINFO_OPEN_ERROR; - - } - break; - } - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: { - /* FIXME: Can reduce CD reads by using - iso9660_fs_readdir(img, "SVCD", true) and then scanning for - the files listed below. - */ - statbuf = iso9660_fs_stat (img, "MPEGAV"); - if (NULL != statbuf) { - vcd_warn ("non compliant /MPEGAV folder detected!"); - free(statbuf); - } - - statbuf = iso9660_fs_stat (img, "SVCD/TRACKS.SVD;1"); - if (NULL == statbuf) - vcd_warn ("mandatory /SVCD/TRACKS.SVD not found!"); - else { - vcd_debug ("found TRACKS.SVD signature at sector %lu", - (unsigned long int) statbuf->lsn); - free(statbuf); - } - - statbuf = iso9660_fs_stat (img, "SVCD/SEARCH.DAT;1"); - if (NULL == statbuf) - vcd_warn ("mandatory /SVCD/SEARCH.DAT not found!"); - else { - lsn_t lsn = statbuf->lsn; - uint32_t secsize = statbuf->secsize; - uint32_t stat_size = statbuf->size; - uint32_t size; - - vcd_debug ("found SEARCH.DAT at sector %lu", (unsigned long int) lsn); - - obj->search_buf = _vcd_malloc (ISO_BLOCKSIZE * secsize); - - if (cdio_read_mode2_sectors (img, obj->search_buf, lsn, false, secsize)) - return VCDINFO_OPEN_ERROR; - - size = (3 * uint16_from_be (((SearchDat *)obj->search_buf)->scan_points)) - + sizeof (SearchDat); - - free(statbuf); - if (size > stat_size) { - vcd_warn ("number of scanpoints leads to bigger size than " - "file size of SEARCH.DAT! -- rereading"); - - free (obj->search_buf); - obj->search_buf = _vcd_malloc (ISO_BLOCKSIZE - * _vcd_len2blocks(size, ISO_BLOCKSIZE)); - - if (cdio_read_mode2_sectors (img, obj->search_buf, lsn, false, - secsize)) - return VCDINFO_OPEN_ERROR; - } - } - break; - } - default: - ; - } - - statbuf = iso9660_fs_stat (img, "EXT/SCANDATA.DAT;1"); - if (statbuf != NULL) { - lsn_t lsn = statbuf->lsn; - uint32_t secsize = statbuf->secsize; - - vcd_debug ("found /EXT/SCANDATA.DAT at sector %u", (unsigned int) lsn); - - obj->scandata_buf = _vcd_malloc (ISO_BLOCKSIZE * secsize); - - free(statbuf); - if (cdio_read_mode2_sectors (img, obj->scandata_buf, lsn, false, secsize)) - return VCDINFO_OPEN_ERROR; - } - - return VCDINFO_OPEN_VCD; - -} - -/*! - Dispose of any resources associated with vcdinfo structure "obj". - Call this when "obj" it isn't needed anymore. - - True is returned is everything went okay, and false if not. -*/ -bool -vcdinfo_close(vcdinfo_obj_t *obj) -{ - if (obj != NULL) { - if (obj->offset_list != NULL) - _cdio_list_free(obj->offset_list, true); - if (obj->offset_x_list != NULL) - _cdio_list_free(obj->offset_x_list, true); - free(obj->seg_sizes); - free(obj->lot); - free(obj->lot_x); - if (obj->psd_x) free(obj->psd_x); - if (obj->psd) free(obj->psd); - if (obj->scandata_buf) free(obj->scandata_buf); - free(obj->tracks_buf); - free(obj->search_buf); - free(obj->source_name); - - if (obj->img != NULL) cdio_destroy (obj->img); - _vcdinfo_zero(obj); - } - - free(obj); - return(true); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/info_private.c --- a/src/input/vcd/libvcd/info_private.c Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,328 +0,0 @@ -/* - $Id: info_private.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2003 Rocky Bernstein <ro...@pa...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -/* - Like vcdinfo but exposes more of the internal structure. It is probably - better to use vcdinfo, when possible. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stddef.h> -#include <errno.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/util.h> - -#include <libvcd/types.h> -#include <libvcd/files.h> - -#include <libvcd/info.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "data_structures.h" -#include "info_private.h" -#include "pbc.h" - -static const char _rcsid[] = "$Id: info_private.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -/* - This fills in unassigned LIDs in the offset table. Due to - "rejected" LOT entries, some of these might not have gotten filled - in while scanning PBC (if in fact there even was a PBC). - - Note: We assume that an unassigned LID is one whose value is 0. - */ -static void -vcdinf_update_offset_list(struct _vcdinf_pbc_ctx *obj, bool extended) -{ - if (NULL==obj) return; - { - CdioListNode *node; - CdioList *unused_lids = _cdio_list_new(); - CdioListNode *next_unused_node = _cdio_list_begin(unused_lids); - - unsigned int last_lid=0; - CdioList *offset_list = extended ? obj->offset_x_list : obj->offset_list; - - lid_t max_seen_lid=0; - - _CDIO_LIST_FOREACH (node, offset_list) - { - vcdinfo_offset_t *ofs = _cdio_list_node_data (node); - if (!ofs->lid) { - /* We have a customer! Assign a LID from the free pool - or take one from the end if no skipped LIDs. - */ - CdioListNode *node=_cdio_list_node_next(next_unused_node); - if (node != NULL) { - lid_t *next_unused_lid=_cdio_list_node_data(node); - ofs->lid = *next_unused_lid; - next_unused_node=node; - } else { - max_seen_lid++; - ofs->lid = max_seen_lid; - } - } else { - /* See if we've skipped any LID numbers. */ - last_lid++; - while (last_lid != ofs->lid ) { - lid_t * lid=_vcd_malloc (sizeof(lid_t)); - *lid = last_lid; - _cdio_list_append(unused_lids, lid); - } - if (last_lid > max_seen_lid) max_seen_lid=last_lid; - } - } - _cdio_list_free(unused_lids, true); - } -} - -/*! - Calls recursive routine to populate obj->offset_list or obj->offset_x_list - by going through LOT. - - Returns false if there was some error. -*/ -bool [... 76 lines omitted ...] - _CDIO_LIST_FOREACH (node, offset_list) - { - ofs = _cdio_list_node_data (node); - - if (offset == ofs->offset) - { - if (in_lot) - ofs->in_lot = true; - - if (lid) { - /* Our caller thinks she knows what our LID is. - This should help out getting the LID for end descriptors - if not other things as well. - */ - ofs->lid = lid; - } - - ofs->ext = obj->extended; - - return true; /* already been there... */ - } - } - - ofs = _vcd_malloc (sizeof (vcdinfo_offset_t)); - - ofs->ext = obj->extended; - ofs->in_lot = in_lot; - ofs->lid = lid; - ofs->offset = offset; - ofs->type = psd[_rofs]; - - switch (ofs->type) - { - case PSD_TYPE_PLAY_LIST: - _cdio_list_append (offset_list, ofs); - { - const PsdPlayListDescriptor_t *d = (const void *) (psd + _rofs); - const lid_t lid = vcdinf_pld_get_lid(d); - - if (!ofs->lid) - ofs->lid = lid; - else - if (ofs->lid != lid) - vcd_warn ("LOT entry assigned LID %d, but descriptor has LID %d", - ofs->lid, lid); - - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_prev_offset(d), false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_next_offset(d), false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_return_offset(d), - false); - } - break; - - case PSD_TYPE_EXT_SELECTION_LIST: - case PSD_TYPE_SELECTION_LIST: - _cdio_list_append (offset_list, ofs); - { - const PsdSelectionListDescriptor_t *d = - (const void *) (psd + _rofs); - - int idx; - - if (!ofs->lid) - ofs->lid = uint16_from_be (d->lid) & 0x7fff; - else - if (ofs->lid != (uint16_from_be (d->lid) & 0x7fff)) - vcd_warn ("LOT entry assigned LID %d, but descriptor has LID %d", - ofs->lid, uint16_from_be (d->lid) & 0x7fff); - - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_prev_offset(d), false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_next_offset(d), false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_return_offset(d), - false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_default_offset(d), - false); - ret &= vcdinf_visit_pbc (obj, 0, uint16_from_be (d->timeout_ofs), - false); - - for (idx = 0; idx < vcdinf_get_num_selections(d); idx++) - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_offset(d, idx), - false); - } - break; - - case PSD_TYPE_END_LIST: - _cdio_list_append (offset_list, ofs); - break; - - default: - vcd_warn ("corrupt PSD???????"); - free (ofs); - return false; - break; - } - return ret; -} - -/*! Return the starting LBA (logical block address) for sequence - entry_num in obj. VCDINFO_NULL_LBA is returned if there is no entry. -*/ -lba_t -vcdinf_get_entry_lba(const EntriesVcd_t *entries, unsigned int entry_num) -{ - const msf_t *msf = vcdinf_get_entry_msf(entries, entry_num); - return (msf != NULL) ? cdio_msf_to_lba(msf) : VCDINFO_NULL_LBA; -} - -/*! Return the starting MSF (minutes/secs/frames) for sequence - entry_num in obj. NULL is returned if there is no entry. - The first entry number is 0. -*/ -const msf_t * -vcdinf_get_entry_msf(const EntriesVcd_t *entries, unsigned int entry_num) -{ - const unsigned int entry_count = uint16_from_be (entries->entry_count); - return entry_num < entry_count ? - &(entries->entry[entry_num].msf) - : NULL; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/info_private.h --- a/src/input/vcd/libvcd/info_private.h Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +0,0 @@ -/*! - \file vcdinf.h - - Copyright (C) 2002,2003 Rocky Bernstein <ro...@pa...> - - \verbatim - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Like vcdinfo but exposes more of the internal structure. It is probably - better to use vcdinfo, when possible. - \endverbatim -*/ - -#ifndef _VCD_INFO_PRIVATE_H -#define _VCD_INFO_PRIVATE_H - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> -#include <cdio/ds.h> -#include <cdio/iso9660.h> -#include <libvcd/types.h> -#include <libvcd/files_private.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - struct _VcdInfo { - vcd_type_t vcd_type; - - CdIo *img; - - iso9660_pvd_t pvd; - - InfoVcd_t info; - EntriesVcd_t entries; - - CdioList *offset_list; - CdioList *offset_x_list; - uint32_t *seg_sizes; - lsn_t first_segment_lsn; - - LotVcd_t *lot; - LotVcd_t *lot_x; - uint8_t *psd; - uint8_t *psd_x; - unsigned int psd_x_size; - bool extended; - - bool has_xa; /* True if has extended attributes (XA) */ - - void *tracks_buf; - void *search_buf; - void *scandata_buf; - - char *source_name; /* VCD device or file currently open */ - - }; - - /*! Return the starting MSF (minutes/secs/frames) for sequence - entry_num in obj. NULL is returned if there is no entry. - The first entry number is 0. - */ - const msf_t * vcdinf_get_entry_msf(const EntriesVcd_t *entries, - unsigned int entry_num); - - struct _vcdinf_pbc_ctx { - unsigned int psd_size; - lid_t maximum_lid; - unsigned offset_mult; - CdioList *offset_x_list; - CdioList *offset_list; - - LotVcd_t *lot; - LotVcd_t *lot_x; - uint8_t *psd; - uint8_t *psd_x; - unsigned int psd_x_size; - bool extended; - }; - - /*! - Calls recursive routine to populate obj->offset_list or obj->offset_x_list - by going through LOT. - - Returns false if there was some error. - */ - bool vcdinf_visit_lot (struct _vcdinf_pbc_ctx *obj); - - /*! - Recursive routine to populate obj->offset_list or obj->offset_x_list - by reading playback control entries referred to via lid. - - Returns false if there was some error. - */ - bool vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, - unsigned int offset, bool in_lot); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /*_VCD_INFO_PRIVATE_H*/ diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/libvcd/Makefile.am --- a/src/input/vcd/libvcd/libvcd/Makefile.am Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -noinst_HEADERS = files.h inf.h logging.h types.h files_private.h info.h sector.h version.h diff -r c0274bb77d7924e82703b5299b3b6f308cb331b4 -r 493330760c70fc72bc65a59a10b7db9ca89aae3c src/input/vcd/libvcd/libvcd/files.h --- a/src/input/vcd/libvcd/libvcd/files.h Thu May 31 22:24:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -/* - $Id: files.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hv...@gn...> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef VCDFILES_H -#define VCDFILES_H - -#include <libvcd/types.h> - -#define INFO_VCD_SECTOR 150 -#define ENTRIES_VCD_SECTOR 151 -#define LOT_VCD_SECTOR 152 -#define LOT_VCD_SIZE 32 -#define PSD_VCD_SECTOR (LOT_VCD_SECTOR+LOT_VCD_SIZE) - -#define MAX_SEGMENTS 1980 -#define MAX_ENTRIES 500 -#define MAX_SEQ_ENTRIES 99 - -/* these are used for SVCDs only */ -#define TRACKS_SVD_SECTOR (PSD_VCD_SECTOR+1) -#define SEARCH_DAT_SECTOR (TRACKS_SVD_SECTOR+1) - -/* Maximum index of optional LOT.VCD (the List ID Offset Table.) */ -#define LOT_VCD_OFFSETS ((1 << 15)-1) - -typedef enum { - PSD_TYPE_PLAY_LIST = 0x10, /* Play List */ - PSD_TYPE_SELECTION_LIST = 0x18, /* Selection List (+Ext. for SVCD) */ - PSD_TYPE_EXT_SELECTION_LIST = 0x1a, /* Extended Selection List (VCD2.0) */ - PSD_TYPE_END_LIST = 0x1f, ... [truncated message content] |