From b535c2d4f8d84adb22c741170e6fd11b3cfc4478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20=27Flameeyes=27=20Petten=C3=B2?= Date: Thu, 31 May 2007 22:24:29 +0200 Subject: Move libcdio and libvcd into contrib/ --HG-- rename : src/input/vcd/libcdio/FreeBSD/freebsd.c => contrib/libcdio/FreeBSD/freebsd.c rename : src/input/vcd/libcdio/FreeBSD/freebsd.h => contrib/libcdio/FreeBSD/freebsd.h rename : src/input/vcd/libcdio/FreeBSD/freebsd_cam.c => contrib/libcdio/FreeBSD/freebsd_cam.c rename : src/input/vcd/libcdio/FreeBSD/freebsd_ioctl.c => contrib/libcdio/FreeBSD/freebsd_ioctl.c rename : src/input/vcd/libcdio/MSWindows/Makefile.am => contrib/libcdio/MSWindows/Makefile.am rename : src/input/vcd/libcdio/MSWindows/aspi32.c => contrib/libcdio/MSWindows/aspi32.c rename : src/input/vcd/libcdio/MSWindows/aspi32.h => contrib/libcdio/MSWindows/aspi32.h rename : src/input/vcd/libcdio/MSWindows/win32.c => contrib/libcdio/MSWindows/win32.c rename : src/input/vcd/libcdio/MSWindows/win32.h => contrib/libcdio/MSWindows/win32.h rename : src/input/vcd/libcdio/MSWindows/win32_ioctl.c => contrib/libcdio/MSWindows/win32_ioctl.c rename : src/input/vcd/libcdio/Makefile.am => contrib/libcdio/Makefile.am rename : src/input/vcd/libcdio/_cdio_bsdi.c => contrib/libcdio/_cdio_bsdi.c rename : src/input/vcd/libcdio/_cdio_generic.c => contrib/libcdio/_cdio_generic.c rename : src/input/vcd/libcdio/_cdio_linux.c => contrib/libcdio/_cdio_linux.c rename : src/input/vcd/libcdio/_cdio_osx.c => contrib/libcdio/_cdio_osx.c rename : src/input/vcd/libcdio/_cdio_stdio.c => contrib/libcdio/_cdio_stdio.c rename : src/input/vcd/libcdio/_cdio_stdio.h => contrib/libcdio/_cdio_stdio.h rename : src/input/vcd/libcdio/_cdio_stream.c => contrib/libcdio/_cdio_stream.c rename : src/input/vcd/libcdio/_cdio_stream.h => contrib/libcdio/_cdio_stream.h rename : src/input/vcd/libcdio/_cdio_sunos.c => contrib/libcdio/_cdio_sunos.c rename : src/input/vcd/libcdio/cd_types.c => contrib/libcdio/cd_types.c rename : src/input/vcd/libcdio/cdio.c => contrib/libcdio/cdio.c rename : src/input/vcd/libcdio/cdio/Makefile.am => contrib/libcdio/cdio/Makefile.am rename : src/input/vcd/libcdio/cdio/bytesex.h => contrib/libcdio/cdio/bytesex.h rename : src/input/vcd/libcdio/cdio/bytesex_asm.h => contrib/libcdio/cdio/bytesex_asm.h rename : src/input/vcd/libcdio/cdio/cd_types.h => contrib/libcdio/cdio/cd_types.h rename : src/input/vcd/libcdio/cdio/cdio.h => contrib/libcdio/cdio/cdio.h rename : src/input/vcd/libcdio/cdio/cdtext.h => contrib/libcdio/cdio/cdtext.h rename : src/input/vcd/libcdio/cdio/ds.h => contrib/libcdio/cdio/ds.h rename : src/input/vcd/libcdio/cdio/dvd.h => contrib/libcdio/cdio/dvd.h rename : src/input/vcd/libcdio/cdio/iso9660.h => contrib/libcdio/cdio/iso9660.h rename : src/input/vcd/libcdio/cdio/logging.h => contrib/libcdio/cdio/logging.h rename : src/input/vcd/libcdio/cdio/scsi_mmc.h => contrib/libcdio/cdio/scsi_mmc.h rename : src/input/vcd/libcdio/cdio/sector.h => contrib/libcdio/cdio/sector.h rename : src/input/vcd/libcdio/cdio/types.h => contrib/libcdio/cdio/types.h rename : src/input/vcd/libcdio/cdio/util.h => contrib/libcdio/cdio/util.h rename : src/input/vcd/libcdio/cdio/version.h => contrib/libcdio/cdio/version.h rename : src/input/vcd/libcdio/cdio/xa.h => contrib/libcdio/cdio/xa.h rename : src/input/vcd/libcdio/cdio_assert.h => contrib/libcdio/cdio_assert.h rename : src/input/vcd/libcdio/cdio_private.h => contrib/libcdio/cdio_private.h rename : src/input/vcd/libcdio/cdtext.c => contrib/libcdio/cdtext.c rename : src/input/vcd/libcdio/cdtext_private.h => contrib/libcdio/cdtext_private.h rename : src/input/vcd/libcdio/ds.c => contrib/libcdio/ds.c rename : src/input/vcd/libcdio/generic.h => contrib/libcdio/generic.h rename : src/input/vcd/libcdio/image.h => contrib/libcdio/image.h rename : src/input/vcd/libcdio/image/Makefile.am => contrib/libcdio/image/Makefile.am rename : src/input/vcd/libcdio/image/bincue.c => contrib/libcdio/image/bincue.c rename : src/input/vcd/libcdio/image/cdrdao.c => contrib/libcdio/image/cdrdao.c rename : src/input/vcd/libcdio/image/nrg.c => contrib/libcdio/image/nrg.c rename : src/input/vcd/libcdio/image/nrg.h => contrib/libcdio/image/nrg.h rename : src/input/vcd/libcdio/image_common.h => contrib/libcdio/image_common.h rename : src/input/vcd/libcdio/iso9660.c => contrib/libcdio/iso9660.c rename : src/input/vcd/libcdio/iso9660_fs.c => contrib/libcdio/iso9660_fs.c rename : src/input/vcd/libcdio/iso9660_private.h => contrib/libcdio/iso9660_private.h rename : src/input/vcd/libcdio/logging.c => contrib/libcdio/logging.c rename : src/input/vcd/libcdio/portable.h => contrib/libcdio/portable.h rename : src/input/vcd/libcdio/scsi_mmc.c => contrib/libcdio/scsi_mmc.c rename : src/input/vcd/libcdio/scsi_mmc.h => contrib/libcdio/scsi_mmc.h rename : src/input/vcd/libcdio/scsi_mmc_private.h => contrib/libcdio/scsi_mmc_private.h rename : src/input/vcd/libcdio/sector.c => contrib/libcdio/sector.c rename : src/input/vcd/libcdio/util.c => contrib/libcdio/util.c rename : src/input/vcd/libcdio/xa.c => contrib/libcdio/xa.c rename : src/input/vcd/libvcd/Makefile.am => contrib/libvcd/Makefile.am rename : src/input/vcd/libvcd/bitvec.h => contrib/libvcd/bitvec.h rename : src/input/vcd/libvcd/bytesex.h => contrib/libvcd/bytesex.h rename : src/input/vcd/libvcd/bytesex_asm.h => contrib/libvcd/bytesex_asm.h rename : src/input/vcd/libvcd/data_structures.c => contrib/libvcd/data_structures.c rename : src/input/vcd/libvcd/data_structures.h => contrib/libvcd/data_structures.h rename : src/input/vcd/libvcd/dict.h => contrib/libvcd/dict.h rename : src/input/vcd/libvcd/directory.c => contrib/libvcd/directory.c rename : src/input/vcd/libvcd/directory.h => contrib/libvcd/directory.h rename : src/input/vcd/libvcd/files.c => contrib/libvcd/files.c rename : src/input/vcd/libvcd/image.c => contrib/libvcd/image.c rename : src/input/vcd/libvcd/image_bincue.c => contrib/libvcd/image_bincue.c rename : src/input/vcd/libvcd/image_cdrdao.c => contrib/libvcd/image_cdrdao.c rename : src/input/vcd/libvcd/image_nrg.c => contrib/libvcd/image_nrg.c rename : src/input/vcd/libvcd/image_sink.h => contrib/libvcd/image_sink.h rename : src/input/vcd/libvcd/inf.c => contrib/libvcd/inf.c rename : src/input/vcd/libvcd/info.c => contrib/libvcd/info.c rename : src/input/vcd/libvcd/info_private.c => contrib/libvcd/info_private.c rename : src/input/vcd/libvcd/info_private.h => contrib/libvcd/info_private.h rename : src/input/vcd/libvcd/libvcd/Makefile.am => contrib/libvcd/libvcd/Makefile.am rename : src/input/vcd/libvcd/libvcd/files.h => contrib/libvcd/libvcd/files.h rename : src/input/vcd/libvcd/libvcd/files_private.h => contrib/libvcd/libvcd/files_private.h rename : src/input/vcd/libvcd/libvcd/inf.h => contrib/libvcd/libvcd/inf.h rename : src/input/vcd/libvcd/libvcd/info.h => contrib/libvcd/libvcd/info.h rename : src/input/vcd/libvcd/libvcd/logging.h => contrib/libvcd/libvcd/logging.h rename : src/input/vcd/libvcd/libvcd/sector.h => contrib/libvcd/libvcd/sector.h rename : src/input/vcd/libvcd/libvcd/types.h => contrib/libvcd/libvcd/types.h rename : src/input/vcd/libvcd/libvcd/version.h => contrib/libvcd/libvcd/version.h rename : src/input/vcd/libvcd/logging.c => contrib/libvcd/logging.c rename : src/input/vcd/libvcd/mpeg.c => contrib/libvcd/mpeg.c rename : src/input/vcd/libvcd/mpeg.h => contrib/libvcd/mpeg.h rename : src/input/vcd/libvcd/mpeg_stream.c => contrib/libvcd/mpeg_stream.c rename : src/input/vcd/libvcd/mpeg_stream.h => contrib/libvcd/mpeg_stream.h rename : src/input/vcd/libvcd/obj.h => contrib/libvcd/obj.h rename : src/input/vcd/libvcd/pbc.c => contrib/libvcd/pbc.c rename : src/input/vcd/libvcd/pbc.h => contrib/libvcd/pbc.h rename : src/input/vcd/libvcd/salloc.c => contrib/libvcd/salloc.c rename : src/input/vcd/libvcd/salloc.h => contrib/libvcd/salloc.h rename : src/input/vcd/libvcd/sector.c => contrib/libvcd/sector.c rename : src/input/vcd/libvcd/sector_private.h => contrib/libvcd/sector_private.h rename : src/input/vcd/libvcd/stream.c => contrib/libvcd/stream.c rename : src/input/vcd/libvcd/stream.h => contrib/libvcd/stream.h rename : src/input/vcd/libvcd/stream_stdio.c => contrib/libvcd/stream_stdio.c rename : src/input/vcd/libvcd/stream_stdio.h => contrib/libvcd/stream_stdio.h rename : src/input/vcd/libvcd/util.c => contrib/libvcd/util.c rename : src/input/vcd/libvcd/util.h => contrib/libvcd/util.h rename : src/input/vcd/libvcd/vcd.c => contrib/libvcd/vcd.c rename : src/input/vcd/libvcd/vcd.h => contrib/libvcd/vcd.h rename : src/input/vcd/libvcd/vcd_assert.h => contrib/libvcd/vcd_assert.h rename : src/input/vcd/libvcd/vcd_read.c => contrib/libvcd/vcd_read.c rename : src/input/vcd/libvcd/vcd_read.h => contrib/libvcd/vcd_read.h --- contrib/libvcd/info_private.c | 328 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 contrib/libvcd/info_private.c (limited to 'contrib/libvcd/info_private.c') diff --git a/contrib/libvcd/info_private.c b/contrib/libvcd/info_private.c new file mode 100644 index 000000000..9f89a3dcb --- /dev/null +++ b/contrib/libvcd/info_private.c @@ -0,0 +1,328 @@ +/* + $Id: info_private.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ + + Copyright (C) 2003 Rocky Bernstein + + 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 +#include +#include + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include +#include + +#include +#include + +#include + +/* 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 +vcdinf_visit_lot (struct _vcdinf_pbc_ctx *obj) +{ + const LotVcd_t *lot = obj->extended ? obj->lot_x : obj->lot; + unsigned int n, tmp; + bool ret=true; + + if (obj->extended) { + if (!obj->psd_x_size) return false; + } else if (!obj->psd_size) return false; + + for (n = 0; n < LOT_VCD_OFFSETS; n++) + if ((tmp = vcdinf_get_lot_offset(lot, n)) != PSD_OFS_DISABLED) + ret &= vcdinf_visit_pbc (obj, n + 1, tmp, true); + + _vcd_list_sort (obj->extended ? obj->offset_x_list : obj->offset_list, + (_cdio_list_cmp_func) vcdinf_lid_t_cmp); + + /* Now really complete the offset table with LIDs. This routine + might obviate the need for vcdinf_visit_pbc() or some of it which is + more complex. */ + vcdinf_update_offset_list(obj, obj->extended); + return ret; +} + +/*! + 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) +{ + CdioListNode *node; + vcdinfo_offset_t *ofs; + unsigned int psd_size = obj->extended ? obj->psd_x_size : obj->psd_size; + const uint8_t *psd = obj->extended ? obj->psd_x : obj->psd; + unsigned int _rofs = offset * obj->offset_mult; + CdioList *offset_list; + bool ret=true; + + vcd_assert (psd_size % 8 == 0); + + switch (offset) + { + case PSD_OFS_DISABLED: + case PSD_OFS_MULTI_DEF: + case PSD_OFS_MULTI_DEF_NO_NUM: + return true; + + default: + break; + } + + if (_rofs >= psd_size) + { + if (obj->extended) + vcd_warn ("psd offset out of range in extended PSD (%d >= %d)", + _rofs, psd_size); + else + vcd_warn ("psd offset out of range (%d >= %d)", _rofs, psd_size); + return false; + } + + if (!obj->offset_list) + obj->offset_list = _cdio_list_new (); + + if (!obj->offset_x_list) + obj->offset_x_list = _cdio_list_new (); + + if (obj->extended) { + offset_list = obj->offset_x_list; + } else + offset_list = obj->offset_list; + + _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: + */ -- cgit v1.2.3