4 /* reads a toc file which must refer to a transport stream
5 * decodes the dvb data and attempts to identify the stream
6 * nudge values to resync the related audio/video data
9 int main(int ac, char **av)
11 int ret, i, n, atrk, vtrk, w, h, channels, apid, vpid;
12 char name[256], enc[32];
14 double pts, apts, vpts, nudge;
15 zmpeg3_t *src = new zmpeg3_t(av[1],ret,ZIO_UNBUFFERED+ZIO_SINGLE_ACCESS);
16 if( !src || ret != 0 ) {
17 fprintf(stderr,"unable to open %s\n",av[1]);
20 if( !src->has_toc() ) {
21 fprintf(stderr,"not a toc file %s\n",av[1]);
24 char *path = src->title_path(0);
25 int total_atracks = src->total_astreams();
26 int total_vtracks = src->total_vstreams();
27 printf("toc file for %s, %d atracks, %d vtracks\n", path, total_atracks, total_vtracks);
28 if( !src->is_transport_stream() ) {
29 fprintf(stderr,"not a transport stream %s\n",path);
32 src->demuxer->create_title();
34 int total_channels = src->dvb.channel_count();
35 for( n=0; n<total_channels; ++n ) {
36 int major, minor, astreams, vstreams;
37 double frame_rate = 0.;
39 src->dvb.get_channel(n, major, minor);
40 src->dvb.get_station_id(n, name);
41 src->dvb.total_astreams(n, astreams);
42 src->dvb.total_vstreams(n, vstreams);
43 printf("channel %d.%d, %d video streams, %d audio streams\n",
44 major, minor, vstreams, astreams);
46 for( i=0; i<vstreams; ++i ) {
47 src->dvb.vstream_number(n, i, vtrk);
48 w = src->video_width(vtrk);
49 h = src->video_height(vtrk);
50 frame_rate = src->frame_rate(vtrk);
51 src->vtrack[vtrk]->video->rewind_video();
52 vpid = src->vtrack[vtrk]->pid;
53 pts = src->vtrack[vtrk]->demuxer->scan_pts();
54 printf(" vtrk %-2d/%03x stream %2d %5dx%-5d %f pts %f\n",
55 i, vpid, vtrk, w, h, frame_rate, pts);
56 if( pts > vpts ) vpts = pts;
58 for( i=0; i<astreams; ++i ) {
59 src->dvb.astream_number(n, i, atrk, &enc[0]);
60 channels = src->audio_channels(atrk);
61 fmt = src->audio_format(atrk);
62 sample_rate = src->sample_rate(atrk);
63 src->atrack[atrk]->audio->rewind_audio();
64 apid = src->atrack[atrk]->pid;
65 pts = src->atrack[atrk]->demuxer->scan_pts();
66 printf(" atrk %-2d/%03x stream %2d %6s %2dch %-5d (%s) pts %f\n",
67 i, apid, atrk, fmt, channels, sample_rate, &enc[0], pts);
68 if( pts > apts ) apts = pts;
71 if( apts >= 0. && vpts >= 0. ) {
73 printf(" nudge %f (%f frames, %d samples)",
74 -nudge, nudge*frame_rate, (int)(-nudge*sample_rate));