00001 #include "libmpeg3.h"
00002 #include "mpeg3protos.h"
00003
00004 #define TOCVERSION 4
00005 #define TOCVIDEO 4
00006
00007 int mpeg3_generate_toc(FILE *output, char *path, int timecode_search, int print_streams)
00008 {
00009 mpeg3_t *file = mpeg3_open(path);
00010 mpeg3_demuxer_t *demuxer;
00011 int i;
00012
00013 if(file)
00014 {
00015 demuxer = mpeg3_new_demuxer(file, 0, 0, -1);
00016 if(file->is_ifo_file)
00017 {
00018 int i;
00019 mpeg3io_open_file(file->fs);
00020 mpeg3demux_read_ifo(file, demuxer, 1);
00021 mpeg3io_close_file(file->fs);
00022
00023 for(i = 0; i < demuxer->total_titles; i++)
00024 {
00025 fprintf(output, "TOCVERSION %d\n", TOCVERSION);
00026
00027 if(file->is_program_stream)
00028 fprintf(output, "PROGRAM_STREAM\n");
00029 else
00030 if(file->is_transport_stream)
00031 fprintf(output, "TRANSPORT_STREAM\n");
00032
00033 fprintf(output, "PATH: %s\n"
00034 "SIZE: %ld\n"
00035 "PACKETSIZE: %ld\n",
00036 demuxer->titles[i]->fs->path,
00037 demuxer->titles[i]->total_bytes,
00038 file->packet_size);
00039
00040
00041 if(i == 0)
00042 mpeg3demux_print_streams(demuxer, output);
00043
00044 mpeg3demux_print_timecodes(demuxer->titles[i], output);
00045 }
00046
00047 return 0;
00048 }
00049 else
00050 {
00051 char complete_path[MPEG3_STRLEN];
00052 mpeg3io_complete_path(complete_path, path);
00053
00054 mpeg3demux_create_title(demuxer, timecode_search, output);
00055
00056 fprintf(output, "TOCVERSION %d\n"
00057 "PATH: %s\n", TOCVERSION, complete_path);
00058
00059 if(file->is_program_stream)
00060 fprintf(output, "PROGRAM_STREAM\n");
00061 else
00062 if(file->is_transport_stream)
00063 fprintf(output, "TRANSPORT_STREAM\n");
00064 else
00065 if(file->is_video_stream)
00066 fprintf(output, "VIDEO_STREAM\n");
00067 else
00068 if(file->is_audio_stream)
00069 fprintf(output, "AUDIO_STREAM\n");
00070
00071
00072 if(print_streams) mpeg3demux_print_streams(demuxer, output);
00073
00074 if(file->is_transport_stream || file->is_program_stream)
00075 {
00076 fprintf(output, "SIZE: %ld\n", demuxer->titles[demuxer->current_title]->total_bytes);
00077 fprintf(output, "PACKETSIZE: %ld\n", file->packet_size);
00078 }
00079
00080 mpeg3demux_print_timecodes(demuxer->titles[demuxer->current_title], output);
00081 return 0;
00082 }
00083
00084 mpeg3_delete_demuxer(demuxer);
00085 mpeg3_close(file);
00086 }
00087 return 1;
00088 }
00089
00090
00091 static int read_titles(mpeg3_demuxer_t *demuxer, int version)
00092 {
00093 char string1[MPEG3_STRLEN], string2[MPEG3_STRLEN];
00094 long start_byte, end_byte;
00095 double start_time, end_time;
00096 float program;
00097 mpeg3_title_t *title = 0;
00098 mpeg3_t *file = demuxer->file;
00099
00100
00101 while(!feof(file->fs->fd))
00102 {
00103 char string[1024];
00104 int i = 0, byte;
00105
00106
00107 do{
00108 byte = fgetc(file->fs->fd);
00109 if(byte != 0 &&
00110 byte != 0xd &&
00111 byte != 0xa) string[i++] = byte;
00112 }while(byte != 0xd &&
00113 byte != 0xa &&
00114 !feof(file->fs->fd) &&
00115 i < 1023);
00116 string[i] = 0;
00117
00118 if(strlen(string))
00119 {
00120 sscanf(string, "%s %s %ld %lf %lf %f",
00121 string1,
00122 string2,
00123 &end_byte,
00124 &start_time,
00125 &end_time,
00126 &program);
00127
00128
00129 if(!strncasecmp(string1, "PATH:", 5))
00130 {
00131
00132 title = demuxer->titles[demuxer->total_titles++] = mpeg3_new_title(file, string2);
00133 }
00134 else
00135 if(!strcasecmp(string1, "PROGRAM_STREAM"))
00136 {
00137
00138 file->is_program_stream = 1;
00139 }
00140 else
00141 if(!strcasecmp(string1, "TRANSPORT_STREAM"))
00142 {
00143
00144 file->is_transport_stream = 1;
00145 }
00146 else
00147 if(title)
00148 {
00149 mpeg3demux_cell_t *timecode;
00150 start_byte = atol(string2);
00151
00152 if(!strcasecmp(string1, "REGION:"))
00153 {
00154 timecode = mpeg3_append_timecode(demuxer,
00155 title,
00156 0,
00157 0,
00158 0,
00159 0,
00160 1,
00161 0);
00162
00163
00164
00165 timecode->start_byte = start_byte;
00166
00167 timecode->end_byte = end_byte;
00168 timecode->start_time = start_time;
00169 timecode->end_time = end_time;
00170 timecode->program = program;
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 }
00183 else
00184 if(!strcasecmp(string1, "ASTREAM:"))
00185 demuxer->astream_table[start_byte] = end_byte;
00186 else
00187 if(!strcasecmp(string1, "VSTREAM:"))
00188 demuxer->vstream_table[start_byte] = end_byte;
00189 else
00190 if(!strcasecmp(string1, "SIZE:"))
00191 title->total_bytes = start_byte;
00192 else
00193 if(!strcasecmp(string1, "PACKETSIZE:"))
00194 file->packet_size = start_byte;
00195
00196 }
00197 }
00198 }
00199
00200 mpeg3demux_assign_programs(demuxer);
00201 mpeg3demux_open_title(demuxer, 0);
00202 return 0;
00203 }
00204
00205 int mpeg3_read_toc(mpeg3_t *file)
00206 {
00207 char string[MPEG3_STRLEN];
00208 int version;
00209
00210
00211 mpeg3io_seek(file->fs, 0);
00212 fscanf(file->fs->fd, "%s %d", string, &version);
00213 if(version != TOCVERSION && version != TOCVIDEO) return 1;
00214 switch(version)
00215 {
00216 case TOCVIDEO:
00217 file->is_video_stream = 1;
00218 break;
00219 }
00220
00221
00222 read_titles(file->demuxer, version);
00223 return 0;
00224 }