summaryrefslogtreecommitdiff
path: root/contrib/libvcd/info_private.c
diff options
context:
space:
mode:
authorDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2007-05-31 22:24:29 +0200
committerDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2007-05-31 22:24:29 +0200
commitb535c2d4f8d84adb22c741170e6fd11b3cfc4478 (patch)
tree5407f0612431d38a40d3aae1919010a76175d10c /contrib/libvcd/info_private.c
parent5fbadac433d89261d4d00830d7d3ed55503285d5 (diff)
downloadxine-lib-b535c2d4f8d84adb22c741170e6fd11b3cfc4478.tar.gz
xine-lib-b535c2d4f8d84adb22c741170e6fd11b3cfc4478.tar.bz2
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
Diffstat (limited to 'contrib/libvcd/info_private.c')
-rw-r--r--contrib/libvcd/info_private.c328
1 files changed, 328 insertions, 0 deletions
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 <rocky@panix.com>
+
+ 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
+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:
+ */