00001 #include "funcprotos.h"
00002 #include "quicktime.h"
00003
00004 int usage(void)
00005 {
00006 printf("usage: dechunk [-f framerate] <input movie> <output prefix>\n");
00007 printf(" Movies containing rgb frames are written as ppm images.\n");
00008 exit(1);
00009 return 0;
00010 }
00011
00012 int main(int argc, char *argv[])
00013 {
00014 quicktime_t *file;
00015 FILE *output;
00016 int result = 0;
00017 int i, j;
00018 int64_t length;
00019 char string[1024], *prefix = 0, *input = 0;
00020 char *data = 0;
00021 int bytes = 0, old_bytes = 0;
00022 float output_rate = 0;
00023 float input_rate;
00024 int64_t input_frame;
00025 int64_t new_length;
00026 int width, height;
00027 int rgb_to_ppm = 0;
00028
00029 if(argc < 3)
00030 {
00031 usage();
00032 }
00033
00034 for(i = 1, j = 0; i < argc; i++)
00035 {
00036 if(!strcmp(argv[i], "-f"))
00037 {
00038 if(i + 1 < argc)
00039 {
00040 output_rate = atof(argv[++i]);
00041 }
00042 else
00043 usage();
00044 }
00045 else
00046 if(j == 0)
00047 {
00048 input = argv[i];
00049 j++;
00050 }
00051 else
00052 if(j == 1)
00053 {
00054 prefix = argv[i];
00055 j++;
00056 }
00057 }
00058
00059 if(!prefix || !input) usage();
00060
00061 if(!(file = quicktime_open(input, 1, 0)))
00062 {
00063 printf("Open failed\n");
00064 exit(1);
00065 }
00066
00067 if(!quicktime_video_tracks(file))
00068 {
00069 printf("No video tracks.\n");
00070 exit(1);
00071 }
00072
00073 if(quicktime_match_32(quicktime_video_compressor(file, 0), QUICKTIME_RAW))
00074 {
00075 printf("Converting to ppm.\n");
00076 rgb_to_ppm = 1;
00077 }
00078
00079 length = quicktime_video_length(file, 0);
00080 input_rate = quicktime_frame_rate(file, 0);
00081 if(!output_rate) output_rate = input_rate;
00082 new_length = output_rate / input_rate * length;
00083 width = quicktime_video_width(file, 0);
00084 height = quicktime_video_height(file, 0);
00085
00086 for(i = 0; i < new_length; i++)
00087 {
00088
00089 sprintf(string, "%s%06d", prefix, i);
00090 if(!(output = fopen(string, "wb")))
00091 {
00092 perror("Open failed");
00093 exit(1);
00094 }
00095
00096
00097 input_frame = (int64_t)(input_rate / output_rate * i);
00098 bytes = quicktime_frame_size(file, input_frame, 0);
00099
00100 if(data)
00101 {
00102 if(bytes > old_bytes) { free(data); data = 0; }
00103 }
00104
00105 if(!data)
00106 {
00107 old_bytes = bytes;
00108 data = malloc(bytes);
00109 }
00110
00111 quicktime_set_video_position(file, input_frame, 0);
00112 quicktime_read_data(file, data, bytes);
00113 if(rgb_to_ppm)
00114 {
00115 fprintf(output, "P6\n%d %d\n%d\n", width, height, 0xff);
00116 }
00117
00118 if(!fwrite(data, bytes, 1, output))
00119 {
00120 perror("write failed");
00121 }
00122 fclose(output);
00123 }
00124
00125 quicktime_close(file);
00126 }