00001 #include "libmpeg3.h"
00002 #include "mpeg3protos.h"
00003 #include <stdlib.h>
00004 #include <string.h>
00005
00006 #define BUFSIZE 65536
00007
00008 void test_32bit_overflow(char *outfile, int (*out_counter), FILE *(*out))
00009 {
00010 if(ftell(*out) > 0x7f000000)
00011 {
00012 char string[1024];
00013 fclose(*out);
00014 sprintf(string, "%s%03d", outfile, ++(*out_counter));
00015 (*out) = fopen(string, "wb");
00016 }
00017 }
00018
00019 int main(int argc, char *argv[])
00020 {
00021 mpeg3_t *file;
00022 int i, j, result = 0;
00023 unsigned char *output, **output_rows;
00024 int out_counter = 0;
00025 float *audio_output_f;
00026 unsigned char *audio_output_i;
00027 long total_samples = 0;
00028 FILE *out;
00029 char outfile[1024];
00030 int decompress_audio = 0, decompress_video = 0;
00031 int audio_track = 0;
00032
00033 int print_offsets = 0;
00034 int print_pids = 1;
00035
00036 outfile[0] = 0;
00037 if(argc < 2)
00038 {
00039 printf(
00040 "Dump information or extract audio to a 24 bit pcm file.\n"
00041 "Example: dump -a0 outputfile.pcm take1.vob\n"
00042 );
00043 exit(1);
00044 }
00045
00046 for(i = 1; i < argc; i++)
00047 {
00048 if(!strncmp(argv[i], "-a", 2))
00049 {
00050
00051 if(strlen(argv[i]) > 2)
00052 {
00053 audio_track = atol(argv[i] + 2);
00054 }
00055
00056
00057 if(i + 1 < argc)
00058 {
00059 strcpy(outfile, argv[++i]);
00060 decompress_audio = 1;
00061 }
00062 else
00063 {
00064 fprintf(stderr, "-a must be paired with a filename.\n");
00065 exit(1);
00066 }
00067
00068
00069 if(out = fopen(outfile, "r"))
00070 {
00071 fprintf(stderr, "%s exists.\n", outfile);
00072 exit(1);
00073 }
00074 }
00075 }
00076
00077 int error = 0;
00078 file = mpeg3_open(argv[argc - 1], &error);
00079 if(outfile[0])
00080 {
00081 out = fopen(outfile, "wb");
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091 if(file)
00092 {
00093
00094
00095 fprintf(stderr, "total_astreams=%d\n", mpeg3_total_astreams(file));
00096
00097 for(i = 0; i < mpeg3_total_astreams(file); i++)
00098 {
00099 fprintf(stderr, " Stream 0x%04x: channels=%d rate=%d samples=%ld format=%s\n",
00100 file->atrack[i]->demuxer->astream,
00101 mpeg3_audio_channels(file, i),
00102 mpeg3_sample_rate(file, i),
00103 mpeg3_audio_samples(file, i),
00104 mpeg3_audio_format(file, i));
00105
00106 if(print_offsets)
00107 {
00108 fprintf(stderr, "total_sample_offsets=%d\n", file->atrack[i]->total_sample_offsets);
00109 for(j = 0; j < file->atrack[i]->total_sample_offsets; j++)
00110 {
00111 fprintf(stderr, "%llx ", file->atrack[i]->sample_offsets[j]);
00112 if(j > 0 && !(j % 8)) fprintf(stderr, "\n");
00113 }
00114 fprintf(stderr, "\n");
00115 }
00116 }
00117
00118
00119
00120
00121 fprintf(stderr, "total_vstreams=%d\n", mpeg3_total_vstreams(file));
00122
00123 for(i = 0; i < mpeg3_total_vstreams(file); i++)
00124 {
00125 fprintf(stderr, " Stream 0x%04x: w=%d h=%d framerate=%0.3f frames=%ld coding=%s\n",
00126 file->vtrack[i]->demuxer->vstream,
00127 mpeg3_video_width(file, i),
00128 mpeg3_video_height(file, i),
00129 mpeg3_frame_rate(file, i),
00130 mpeg3_video_frames(file, i),
00131 mpeg3_colormodel(file, i) == MPEG3_YUV420P ? "420" : "422");
00132
00133 if(print_offsets)
00134 {
00135 fprintf(stderr, "total_frame_offsets=%d\n", file->vtrack[i]->total_frame_offsets);
00136 for(j = 0; j < file->vtrack[i]->total_frame_offsets; j++)
00137 {
00138 fprintf(stderr, "%d=%llx ", j, file->vtrack[i]->frame_offsets[j]);
00139 if(j > 0 && !(j % 8)) fprintf(stderr, "\n");
00140 }
00141 fprintf(stderr, "\n");
00142
00143 fprintf(stderr, "total_keyframe_numbers=%d\n", file->vtrack[i]->total_keyframe_numbers);
00144 for(j = 0; j < file->vtrack[i]->total_keyframe_numbers; j++)
00145 {
00146 fprintf(stderr, "%lld ", file->vtrack[i]->keyframe_numbers[j]);
00147 if(j > 0 && !(j % 8)) fprintf(stderr, "\n");
00148 }
00149 fprintf(stderr, "\n");
00150 }
00151 }
00152
00153
00154 printf("total subtitle tracks: %d\n", mpeg3_subtitle_tracks(file));
00155 for(i = 0; i < mpeg3_subtitle_tracks(file); i++)
00156 {
00157 mpeg3_strack_t *strack = file->strack[i];
00158 printf(" stream: 0x%02x total_offsets: %d\n",
00159 strack->id,
00160 strack->total_offsets);
00161 if(print_offsets)
00162 {
00163 for(j = 0; j < strack->total_offsets; j++)
00164 {
00165 printf("%llx ", strack->offsets[j]);
00166 }
00167 printf("\n");
00168 }
00169 }
00170
00171
00172 fprintf(stderr, "total_titles=%d\n", file->demuxer->total_titles);
00173 for(i = 0; i < file->demuxer->total_titles; i++)
00174 {
00175 fprintf(stderr, " Title path=%s total_bytes=%llx cell_table_size=%d\n",
00176 file->demuxer->titles[i]->fs->path,
00177 file->demuxer->titles[i]->total_bytes,
00178 file->demuxer->titles[i]->cell_table_size);
00179
00180 if(print_offsets)
00181 {
00182 for(j = 0; j < file->demuxer->titles[i]->cell_table_size; j++)
00183 fprintf(stderr, " Cell: %llx-%llx %llx-%llx program=%d\n",
00184 file->demuxer->titles[i]->cell_table[j].program_start,
00185 file->demuxer->titles[i]->cell_table[j].program_end,
00186 file->demuxer->titles[i]->cell_table[j].title_start,
00187 file->demuxer->titles[i]->cell_table[j].title_end,
00188 file->demuxer->titles[i]->cell_table[j].program);
00189 }
00190 }
00191
00192
00193
00194
00195 if(print_pids)
00196 {
00197 mpeg3_demuxer_t *demuxer = file->demuxer;
00198 printf("Total PIDs=%d\n", demuxer->total_pids);
00199 for(i = 0; i < demuxer->total_pids; i++)
00200 {
00201 printf("0x%04x ", demuxer->pid_table[i]);
00202 }
00203 printf("\n");
00204 }
00205
00206
00207
00208
00209 if(decompress_audio)
00210 {
00211 mpeg3_set_cpus(file, 2);
00212 audio_output_f = malloc(BUFSIZE * sizeof(float));
00213 audio_output_i = malloc(BUFSIZE * 3 * mpeg3_audio_channels(file, audio_track));
00214
00215
00216 while(!mpeg3_end_of_audio(file, audio_track) && !result)
00217 {
00218 test_32bit_overflow(outfile, &out_counter, &out);
00219
00220 for(i = 0; i < mpeg3_audio_channels(file, audio_track); i++)
00221 {
00222 if(i == 0)
00223 result = mpeg3_read_audio(file,
00224 audio_output_f,
00225 0,
00226 i,
00227 BUFSIZE,
00228 audio_track);
00229 else
00230 result = mpeg3_reread_audio(file,
00231 audio_output_f,
00232 0,
00233 i,
00234 BUFSIZE,
00235 audio_track);
00236
00237 for(j = 0; j < BUFSIZE; j++)
00238 {
00239 int sample = audio_output_f[j] * 0x7fffff;
00240 unsigned char *output_i = audio_output_i + j * 3 * mpeg3_audio_channels(file, audio_track) + i * 3;
00241 if(sample > 0x7fffff)
00242 sample = 0x7fffff;
00243 else
00244 if(sample < -0x7fffff)
00245 sample = -0x7fffff;
00246 *output_i++ = (sample & 0xff0000) >> 16;
00247 *output_i++ = (sample & 0xff00) >> 8;
00248 *output_i = sample & 0xff;
00249 }
00250
00251 }
00252
00253 result = !fwrite(audio_output_i, BUFSIZE * 3 * mpeg3_audio_channels(file, audio_track), 1, out);
00254 }
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 mpeg3_close(file);
00284 }
00285 return 0;
00286 }