Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / libzmpeg3 / mpeg3ifochk.C
diff --git a/cinelerra-5.1/libzmpeg3/mpeg3ifochk.C b/cinelerra-5.1/libzmpeg3/mpeg3ifochk.C
new file mode 100644 (file)
index 0000000..9fe9d18
--- /dev/null
@@ -0,0 +1,106 @@
+
+#include <stdio.h>
+#include "libzmpeg3.h"
+
+/* reads a ifo file which must be a dvd, and vaidates the title data */
+/*   reports title/program sets which appear to be usable */
+
+int usage(const char *nm)
+{
+  printf("usage: %s <path>\n"
+    "  <path> = path to dvd mount point\n", nm);
+  return 0;
+}
+
+int main(int argc, char **argv)
+{
+  if( argc < 2 ) 
+    return usage(argv[0]);
+
+  int verbose = 0;
+  int program = -1;
+  int limit = 3;
+  const char *path = 0;
+
+  int i;
+  for( i=1; i<argc; ++i ) {
+    if( !strcmp(argv[i], "-v") ) {
+      verbose = 1;
+    }
+    else if( !strcmp(argv[i], "-p") ) {
+      if( ++i < argc ) program = atoi(argv[i]);
+    }
+    else if( !strcmp(argv[i], "-l") ) {
+      if( ++i < argc ) limit = atoi(argv[i]);
+    }
+    else if(argv[i][0] == '-') {
+      fprintf(stderr, "Unrecognized command %s\n", argv[i]);
+      exit(1);
+    }
+    else if(!path) {
+      path = argv[i];
+    }
+    else {
+      fprintf(stderr, "Unknown argument \"%s\"\n", argv[i]);
+      exit(1);
+    }
+  }
+
+  for( i=1; i<100; ++i ) {
+    char ifo_path[PATH_MAX];
+    strncpy(&ifo_path[0], path, sizeof(ifo_path));
+    int l = strnlen(&ifo_path[0],sizeof(ifo_path));
+    snprintf(&ifo_path[l],sizeof(ifo_path)-l,"/VIDEO_TS/VTS_%02d_0.IFO",i);
+    if( access(&ifo_path[0],R_OK) ) break;
+
+    zmpeg3_t *src = new zmpeg3_t(&ifo_path[0]);
+    if( !src ) break;
+    uint32_t bits = src->fs->read_uint32();
+    if( bits == zmpeg3_t::IFO_PREFIX ) {
+      int fd = src->fs->get_fd();
+      zifo_t *ifo = src->ifo_open(fd, 0);
+      if( !ifo ) {
+        fprintf(stderr,"Error opening ifo in %s\n", &ifo_path[0]);
+        continue;
+      }
+
+      zicell_table_t icell_addrs;
+      ifo->icell_addresses(&icell_addrs);
+      int programs = ifo->max_inlv+1;
+      int angles = -1;
+      if( verbose )
+        printf("processing: %s, %d programs\n",&ifo_path[0], programs);
+
+      for( int title=0; title<100; ++title ) {
+        int listed = 0;
+        for( int pgm=0; pgm<programs; ++pgm ) {
+          int sectors = 0, pcells = 0;
+          int ret = ifo->chk(title, 0, pgm, 0, &icell_addrs, sectors, pcells, angles);
+          if( ret < 0 ) break;
+          if( !ret ) continue;
+          if( pcells < limit ) continue;
+          if( program >= 0 && pgm != program ) continue;
+          if( !listed ) {
+            listed = 1;
+            printf("%s, Title = %d, pcells=%d, sectors = %d, angles %d, program ids=%d",
+              &ifo_path[0], title+1, pcells, sectors, angles+1, title*100+pgm);
+          }
+          else
+            printf(", %d",title*100+pgm);
+        }
+        if( listed ) printf("\n");
+      }
+      ifo->ifo_close();
+    }
+
+    delete src;
+  }
+
+  if( i == 1 ) {
+    printf("cant open %s/VIDEO_TS/VTS_01_0.IFO\n",path);
+    exit(1);
+  }
+
+  return 0;
+}
+