Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / libzmpeg3 / mpeg31trkpony.C
diff --git a/cinelerra-5.1/libzmpeg3/mpeg31trkpony.C b/cinelerra-5.1/libzmpeg3/mpeg31trkpony.C
new file mode 100644 (file)
index 0000000..afc8d1a
--- /dev/null
@@ -0,0 +1,82 @@
+#include <stdio.h>
+#include "libzmpeg3.h"
+
+/* reads a toc file which must refer to a transport stream
+ *  decodes the dvb data and attempts to identify the stream
+ *  nudge values to resync the related audio/video data
+ */
+
+int main(int ac, char **av)
+{
+  int ret, i, n, atrk, vtrk, w, h, channels, apid, vpid;
+  char name[256], enc[32];
+  const char *fmt;
+  double pts, apts, vpts, nudge;
+  zmpeg3_t *src = new zmpeg3_t(av[1],ret,ZIO_UNBUFFERED+ZIO_SINGLE_ACCESS);
+  if( !src || ret != 0 ) {
+    fprintf(stderr,"unable to open %s\n",av[1]);
+    exit(1);
+  }
+  if( !src->has_toc() ) {
+    fprintf(stderr,"not a toc file %s\n",av[1]);
+    exit(1);
+  }
+  char *path = src->title_path(0);
+  int total_atracks = src->total_astreams();
+  int total_vtracks = src->total_vstreams();
+  printf("toc file for %s, %d atracks, %d vtracks\n", path, total_atracks, total_vtracks);
+  if( !src->is_transport_stream() ) {
+    fprintf(stderr,"not a transport stream %s\n",path);
+    exit(1);
+  }
+  src->demuxer->create_title();
+
+  int total_channels = src->dvb.channel_count();
+  for( n=0; n<total_channels; ++n ) {
+    int major, minor, astreams, vstreams;
+    double frame_rate = 0.;
+    int sample_rate = 0;
+    src->dvb.get_channel(n, major, minor);
+    src->dvb.get_station_id(n, name);
+    src->dvb.total_astreams(n, astreams);
+    src->dvb.total_vstreams(n, vstreams);
+    printf("channel %d.%d,  %d video streams, %d audio streams\n",
+      major, minor, vstreams, astreams);
+    apts = vpts = -1.;
+    for( i=0; i<vstreams; ++i ) {
+      src->dvb.vstream_number(n, i, vtrk);
+      w = src->video_width(vtrk);
+      h = src->video_height(vtrk);
+      frame_rate = src->frame_rate(vtrk);
+      src->vtrack[vtrk]->video->rewind_video();
+      vpid = src->vtrack[vtrk]->pid;
+      pts = src->vtrack[vtrk]->demuxer->scan_pts();
+      printf(" vtrk %-2d/%03x stream %2d  %5dx%-5d %f   pts %f\n", 
+        i, vpid, vtrk, w, h, frame_rate, pts);
+      if( pts > vpts ) vpts = pts;
+    }
+    for( i=0; i<astreams; ++i ) {
+      src->dvb.astream_number(n, i, atrk, &enc[0]);
+      channels = src->audio_channels(atrk);
+      fmt = src->audio_format(atrk);
+      sample_rate = src->sample_rate(atrk);
+      src->atrack[atrk]->audio->rewind_audio();
+      apid = src->atrack[atrk]->pid;
+      pts = src->atrack[atrk]->demuxer->scan_pts();
+      printf(" atrk %-2d/%03x stream %2d %6s %2dch %-5d (%s)  pts %f\n", 
+        i, apid, atrk, fmt, channels, sample_rate, &enc[0], pts);
+      if( pts > apts ) apts = pts;
+    }
+    if( astreams > 0 ) {
+      if( apts >= 0. && vpts >= 0. ) {
+        nudge = vpts - apts;
+        printf("   nudge %f (%f frames, %d samples)",
+          -nudge, nudge*frame_rate, (int)(-nudge*sample_rate));
+      }
+      printf("\n");
+    }
+  }
+  delete src;
+  return 0;
+}
+