00001 #include "mpeg3private.h"
00002 #include "mpeg3protos.h"
00003 #include "mpeg3title.h"
00004
00005
00006 #include <stdlib.h>
00007 #include <string.h>
00008
00009 mpeg3_title_t* mpeg3_new_title(mpeg3_t *file, char *path)
00010 {
00011 mpeg3_title_t *title = calloc(1, sizeof(mpeg3_title_t));
00012 title->fs = mpeg3_new_fs(path);
00013 title->file = file;
00014 return title;
00015 }
00016
00017 int mpeg3_delete_title(mpeg3_title_t *title)
00018 {
00019 mpeg3_delete_fs(title->fs);
00020 if(title->cell_table_size)
00021 {
00022 free(title->cell_table);
00023 }
00024 free(title);
00025 return 0;
00026 }
00027
00028
00029 int mpeg3_copy_title(mpeg3_title_t *dst, mpeg3_title_t *src)
00030 {
00031 int i;
00032
00033 mpeg3_copy_fs(dst->fs, src->fs);
00034 dst->total_bytes = src->total_bytes;
00035 dst->start_byte = src->start_byte;
00036 dst->end_byte = src->end_byte;
00037
00038 if(src->cell_table_size)
00039 {
00040 dst->cell_table_allocation = src->cell_table_allocation;
00041 dst->cell_table_size = src->cell_table_size;
00042 dst->cell_table = calloc(1, sizeof(mpeg3_cell_t) * dst->cell_table_allocation);
00043
00044 for(i = 0; i < dst->cell_table_size; i++)
00045 {
00046 dst->cell_table[i] = src->cell_table[i];
00047 }
00048 }
00049 return 0;
00050 }
00051
00052 int mpeg3_dump_title(mpeg3_title_t *title)
00053 {
00054 int i;
00055
00056 printf("mpeg3_dump_title path %s %llx-%llx cell_table_size %d\n",
00057 title->fs->path,
00058 title->start_byte,
00059 title->end_byte,
00060 title->cell_table_size);
00061 for(i = 0; i < title->cell_table_size; i++)
00062 {
00063 printf("%llx-%llx %llx-%llx %x\n",
00064 title->cell_table[i].title_start,
00065 title->cell_table[i].title_end,
00066 title->cell_table[i].program_start,
00067 title->cell_table[i].program_end,
00068 title->cell_table[i].program);
00069 }
00070 return 0;
00071 }
00072
00073
00074
00075 static void extend_cell_table(mpeg3_title_t *title)
00076 {
00077 if(!title->cell_table ||
00078 title->cell_table_allocation <= title->cell_table_size)
00079 {
00080 long new_allocation;
00081 mpeg3_cell_t *new_table;
00082 int i;
00083
00084 new_allocation = title->cell_table_allocation ?
00085 title->cell_table_size * 2 :
00086 64;
00087 new_table = calloc(1, sizeof(mpeg3_cell_t) * new_allocation);
00088
00089 if(title->cell_table)
00090 {
00091 memcpy(new_table,
00092 title->cell_table,
00093 sizeof(mpeg3_cell_t) * title->cell_table_allocation);
00094 free(title->cell_table);
00095 }
00096 title->cell_table = new_table;
00097 title->cell_table_allocation = new_allocation;
00098 }
00099 }
00100
00101 void mpeg3_new_cell(mpeg3_title_t *title,
00102 int64_t program_start,
00103 int64_t program_end,
00104 int64_t title_start,
00105 int64_t title_end,
00106 int program)
00107 {
00108 mpeg3_cell_t *new_cell;
00109
00110 extend_cell_table(title);
00111 new_cell = &title->cell_table[title->cell_table_size];
00112
00113 new_cell->program_start = program_start;
00114 new_cell->program_end = program_end;
00115 new_cell->title_start = title_start;
00116 new_cell->title_end = title_end;
00117 new_cell->program = program;
00118 title->cell_table_size++;
00119 }
00120
00121
00122 int mpeg3_create_title(mpeg3_demuxer_t *demuxer,
00123 FILE *toc)
00124 {
00125 int result = 0, done = 0, counter_start, counter;
00126 mpeg3_t *file = demuxer->file;
00127 int64_t next_byte, prev_byte;
00128 double next_time, prev_time, absolute_time;
00129 long i;
00130 mpeg3_title_t *title;
00131 u_int32_t test_header = 0;
00132
00133 demuxer->error_flag = 0;
00134 demuxer->read_all = 1;
00135
00136
00137 if(!demuxer->total_titles)
00138 {
00139 demuxer->titles[0] = mpeg3_new_title(file, file->fs->path);
00140 demuxer->total_titles = 1;
00141 mpeg3demux_open_title(demuxer, 0);
00142 }
00143
00144 title = demuxer->titles[0];
00145 title->total_bytes = mpeg3io_total_bytes(title->fs);
00146 title->start_byte = 0;
00147 title->end_byte = title->total_bytes;
00148
00149
00150 mpeg3_new_cell(title,
00151 0,
00152 title->end_byte,
00153 0,
00154 title->end_byte,
00155 0);
00156
00157
00158
00159 if(file->is_transport_stream || file->is_program_stream)
00160 {
00161 mpeg3io_seek(title->fs, 0);
00162 while(!done && !result && !mpeg3io_eof(title->fs))
00163 {
00164 next_byte = mpeg3io_tell(title->fs);
00165 result = mpeg3_read_next_packet(demuxer);
00166
00167
00168 if(next_byte > 0x1000000 && !toc) done = 1;
00169 }
00170 }
00171
00172 mpeg3io_seek(title->fs, 0);
00173 demuxer->read_all = 0;
00174 return 0;
00175 }
00176
00177 int mpeg3demux_print_cells(mpeg3_title_t *title, FILE *output)
00178 {
00179 mpeg3_cell_t *cell;
00180 mpeg3_t *file = title->file;
00181 int i;
00182
00183 if(title->cell_table)
00184 {
00185 for(i = 0; i < title->cell_table_size; i++)
00186 {
00187 cell = &title->cell_table[i];
00188
00189 fprintf(output, "REGION: %llx-%llx %llx-%llx %f %f %d\n",
00190 cell->program_start,
00191 cell->program_end,
00192 cell->title_start,
00193 cell->title_end,
00194 cell->program);
00195 }
00196 }
00197 return 0;
00198 }
00199
00200 int mpeg3demux_print_streams(mpeg3_demuxer_t *demuxer, FILE *toc)
00201 {
00202 int i;
00203
00204 for(i = 0; i < MPEG3_MAX_STREAMS; i++)
00205 {
00206 if(demuxer->astream_table[i])
00207 fprintf(toc, "ASTREAM: %d %d\n", i, demuxer->astream_table[i]);
00208
00209 if(demuxer->vstream_table[i])
00210 fprintf(toc, "VSTREAM: %d %d\n", i, demuxer->vstream_table[i]);
00211 }
00212 return 0;
00213 }