bug-vcdimager
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[VCDImager Bugs/Devel] EXT/SCANDATA for VCD2


From: matthias
Subject: [VCDImager Bugs/Devel] EXT/SCANDATA for VCD2
Date: Mon, 04 Feb 2002 08:34:03 +0100 (CET)

Hello,

thanx for the great program. Now I finally got it up and running
and have produced some VCD2's for my Phillips CDI 450/83 Player.
Alas, it seems that it really needs EXT/SCANDATA.DAT for FF/REW
and for error correction. So I've reenabled it for VCD2 and am
enclosing a patch for 0.7.12. Maybe it's not the most elegant
coding possible, but at least it works for me under Linux 2.4.x.
Regards
        Matthias

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

diff -Naur vcdimager-0.7.12/libvcd/vcd.c vcdimager-0.7.12-extpat/libvcd/vcd.c
--- vcdimager-0.7.12/libvcd/vcd.c       Fri Jan  4 03:50:05 2002
+++ vcdimager-0.7.12-extpat/libvcd/vcd.c        Wed Jan 30 16:28:39 2002
@@ -197,6 +197,22 @@
           break;
         }
       break;
+    case _CAP_EXT:
+      switch (obj->type)
+        {
+        case VCD_TYPE_VCD:
+        case VCD_TYPE_VCD11:
+        case VCD_TYPE_INVALID:
+          return false;
+          break;
+
+        case VCD_TYPE_VCD2:
+        case VCD_TYPE_SVCD:
+        case VCD_TYPE_HQVCD:
+          return true;
+          break;
+        }
+      break;
 
     case _CAP_4C_SVCD:
       switch (obj->type)
@@ -1112,7 +1128,7 @@
 
   /* go on with EXT area */
 
-  if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD))
+  if (_vcd_obj_has_cap_p (obj, _CAP_EXT))
     {
       _dict_insert (obj, "scandata", SECTOR_NIL, 
                     _vcd_len2blocks (get_scandata_dat_size (obj),
@@ -1307,7 +1323,7 @@
       vcd_assert (obj->type == VCD_TYPE_VCD2);
     }
 
-  if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD))
+  if (_vcd_obj_has_cap_p (obj, _CAP_EXT))
     {
       /* scandata.dat -- scanpoints */
       _vcd_directory_mkfile (obj->dir, "EXT/SCANDATA.DAT",
@@ -2034,6 +2050,11 @@
       set_tracks_svd (obj, _dict_get_bykey (obj, "tracks")->buf);
       set_search_dat (obj, _dict_get_bykey (obj, "search")->buf);
       set_scandata_dat (obj, _dict_get_bykey (obj, "scandata")->buf);
+    }
+  if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X))
+    {
+      set_scandata_dat_v2 (obj, _dict_get_bykey (obj, "scandata")->buf);
+      
     }
 
   /* start actually writing stuff */
diff -Naur vcdimager-0.7.12/libvcd/vcd_files.c
vcdimager-0.7.12-extpat/libvcd/vcd_files.c
--- vcdimager-0.7.12/libvcd/vcd_files.c Tue Nov 27 18:33:51 2001
+++ vcdimager-0.7.12-extpat/libvcd/vcd_files.c  Wed Jan 30 16:30:01 2002
@@ -920,6 +920,69 @@
   
 }
 
+void
+set_scandata_dat_v2 (VcdObj *obj, void *buf)
+{
+  const unsigned tracks = _vcd_list_length (obj->mpeg_track_list);
+
+  ScandataDat_v2 *scandata_dat1 = (ScandataDat_v2 *) buf;
+  const uint16_t _begin_offset = 0;
+
+  VcdListNode *node;
+  unsigned n;
+  uint16_t _tmp_offset;
+
+  vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_EXT));
+
+  /* memset (buf, 0, get_scandata_dat_size (obj)); */
+
+  /* struct 1 */
+  strncpy (scandata_dat1->file_id, SCANDATA_FILE_ID, sizeof
(SCANDATA_FILE_ID));
+  
+  scandata_dat1->version = ENTRIES_VERSION_VCD2 ;
+  scandata_dat1->reserved = 0x00;
+  scandata_dat1->scan_points = uint16_to_be (_get_scanpoint_count (obj));
+
+
+  _tmp_offset = 0;
+
+
+  n = 0;
+  _VCD_LIST_FOREACH (node, obj->mpeg_track_list)
+    {
+      const mpeg_track_t *track = _vcd_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;
+
+
+      _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); */
+
+          lba_to_msf(lsect + 150,
+                     &(scandata_dat1->points[_tmp_offset + point]));
+        }
+
+      free (_table);
+
+      _tmp_offset += scanpoints;
+      n++;
+    }
+ 
+}
+
+
 vcd_type_t
 vcd_files_info_detect_type (const void *info_buf)
 {
diff -Naur vcdimager-0.7.12/libvcd/vcd_files.h
vcdimager-0.7.12-extpat/libvcd/vcd_files.h
--- vcdimager-0.7.12/libvcd/vcd_files.h Tue Jul 31 02:20:59 2001
+++ vcdimager-0.7.12-extpat/libvcd/vcd_files.h  Wed Jan 30 16:18:17 2002
@@ -66,6 +66,8 @@
 
 void
 set_scandata_dat (VcdObj *obj, void *buf);
+void
+set_scandata_dat_v2 (VcdObj *obj, void *buf);
 
 
 vcd_type_t
diff -Naur vcdimager-0.7.12/libvcd/vcd_obj.h
vcdimager-0.7.12-extpat/libvcd/vcd_obj.h
--- vcdimager-0.7.12/libvcd/vcd_obj.h   Fri Sep 28 22:32:53 2001
+++ vcdimager-0.7.12-extpat/libvcd/vcd_obj.h    Mon Jan 28 21:08:47 2002
@@ -178,6 +178,7 @@
   _CAP_MPEG2,
   _CAP_PBC,
   _CAP_PBC_X,
+  _CAP_EXT,
   _CAP_TRACK_MARGINS,
   _CAP_4C_SVCD,
   _CAP_PAL_BITS



reply via email to

[Prev in Thread] Current Thread [Next in Thread]