static int read_toc(vcd_priv * priv, char ** iso_label) { int i, j; cdio_iso_analysis_t iso; cdio_fs_anal_t fs; int first_track; priv->num_tracks = cdio_get_last_track_num(priv->cdio); if(priv->num_tracks == CDIO_INVALID_TRACK) { return 0; } /* VCD needs at least 2 tracks */ if(priv->num_tracks < 2) return 0; priv->tracks = calloc(priv->num_tracks, sizeof(*(priv->tracks))); priv->num_video_tracks = 0; first_track = cdio_get_first_track_num(priv->cdio); if(iso_label) { fs = cdio_guess_cd_type(priv->cdio, 0, first_track, &iso); /* Remove trailing spaces */ j = strlen(iso.iso_label)-1; while(j) { if(!isspace(iso.iso_label[j])) break; j--; } if(!j && isspace(iso.iso_label[j])) iso.iso_label[j] = '\0'; else iso.iso_label[j+1] = '\0'; *iso_label = gavl_strdup(iso.iso_label); priv->tracks[first_track - 1].mode = TRACK_OTHER; } /* Actually it's (first_track - 1) + 1 */ for(i = first_track; i < priv->num_tracks; i++) { priv->tracks[i].start_sector = cdio_get_track_lsn(priv->cdio, i+1); priv->tracks[i].end_sector = cdio_get_track_last_lsn(priv->cdio, i+1); fs = cdio_guess_cd_type(priv->cdio, 0, i+1, &iso); if(fs & CDIO_FS_ANAL_VIDEOCD) { priv->num_video_tracks++; priv->tracks[i].mode = TRACK_VCD; } else if(fs & CDIO_FS_ANAL_SVCD) { priv->num_video_tracks++; priv->tracks[i].mode = TRACK_SVCD; } else if(fs & CDIO_FS_ANAL_CVD) { priv->tracks[i].mode = TRACK_CVD; priv->num_video_tracks++; } else if(fs & CDIO_FS_ANAL_ISO9660_ANY) { priv->tracks[i].mode = TRACK_VCD; priv->num_video_tracks++; } } if(!priv->num_video_tracks) { free(priv->tracks); priv->tracks = NULL; return 0; } return 1; }
int main(int argc, const char *argv[]) { CdIo_t *p_cdio; cdio_fs_anal_t fs=0; track_t num_tracks; track_t first_track_num; lsn_t start_track; /* first sector of track */ lsn_t data_start =0; /* start of data area */ int first_data = -1; /* # of first data track */ int first_audio = -1; /* # of first audio track */ unsigned int num_data = 0; /* # of data tracks */ unsigned int num_audio = 0; /* # of audio tracks */ unsigned int i; char *cd_image_name = NULL; if (argc > 1) cd_image_name = strdup(argv[1]); cdio_log_set_handler (log_handler); p_cdio = cdio_open (cd_image_name, DRIVER_UNKNOWN); if (NULL == p_cdio) { printf("-- Problem in trying to find a driver.\n\n"); free(cd_image_name); return 77; } first_track_num = cdio_get_first_track_num(p_cdio); num_tracks = cdio_get_num_tracks(p_cdio); /* Count the number of data and audio tracks. */ for (i = first_track_num; i <= num_tracks; i++) { if (TRACK_FORMAT_AUDIO == cdio_get_track_format(p_cdio, i)) { num_audio++; if (-1 == first_audio) first_audio = i; } else { num_data++; if (-1 == first_data) first_data = i; } } /* try to find out what sort of CD we have */ if (0 == num_data) { printf("-- Audio CD\n"); } else { /* we have data track(s) */ cdio_iso_analysis_t cdio_iso_analysis; memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis)); for (i = first_data; i <= num_tracks; i++) { lsn_t lsn; track_format_t track_format = cdio_get_track_format(p_cdio, i); lsn = cdio_get_track_lsn(p_cdio, i); switch ( track_format ) { case TRACK_FORMAT_AUDIO: case TRACK_FORMAT_ERROR: break; case TRACK_FORMAT_CDI: case TRACK_FORMAT_XA: case TRACK_FORMAT_DATA: case TRACK_FORMAT_PSX: ; } start_track = (i == 1) ? 0 : lsn; /* save the start of the data area */ if (i == first_data) data_start = start_track; /* skip tracks which belong to the current walked session */ if (start_track < data_start + cdio_iso_analysis.isofs_size) continue; fs = cdio_guess_cd_type(p_cdio, start_track, i, &cdio_iso_analysis); print_analysis(cdio_iso_analysis, fs, first_data, num_audio); if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 || CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS || CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) ) /* no method for non-ISO9660 multisessions */ break; } } free(cd_image_name); cdio_destroy(p_cdio); return 0; }