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