#include "colormodels.h" #include "quicktime.h" #include #include quicktime_t *file = 0; //#define COMPRESSOR QUICKTIME_JPEG #define COMPRESSOR QUICKTIME_MP4V #define CROP_Y1 142 #define CROP_Y2 942 #define INWIDTH 1920 #define INHEIGHT 1080 #define FRAMERATE (24000.0 / 1001.0) #define QUANTIZATION 5 void signal_handler(int signum) { printf("Got signal %d\n", signum); if(file) { quicktime_close(file); } abort(); } int main(int argc, char *argv[]) { if(argc < 2) { printf("Usage: cat yuvstream | yuv2mov movie.mov\n" " Create a movie from a yuv 4:2:0 planar stream.\n"); exit(1); } signal(SIGINT, signal_handler); int i; char filename[1024]; filename[0] = 0; for(i = 1; i < argc; i++) { if(!filename[0]) { strcpy(filename, argv[i]); } else { printf("Unknown option %s\n", argv[i]); exit(1); } } if(!filename[0]) { printf("No output filename provided.\n"); exit(1); } if(!(file = quicktime_open(filename, 0, 1))) { printf("Open '%s' failed\n", filename); exit(1); } quicktime_set_video(file, 1, INWIDTH, CROP_Y2 - CROP_Y1, FRAMERATE, COMPRESSOR); int value = 0; value = 20000000; quicktime_set_parameter(file, "ffmpeg_bitrate", &value); value = 5000000; quicktime_set_parameter(file, "ffmpeg_bitrate_tolerance", &value); value = 0; quicktime_set_parameter(file, "ffmpeg_interlaced", &value); value = QUANTIZATION; quicktime_set_parameter(file, "ffmpeg_quantizer", &value); value = 45; quicktime_set_parameter(file, "ffmpeg_gop_size", &value); value = 0; quicktime_set_parameter(file, "ffmpeg_fix_bitrate", &value); value = 85; quicktime_set_parameter(file, "jpeg_quality", &value); int ysize = INWIDTH * INHEIGHT; int csize = INWIDTH * INHEIGHT / 4; unsigned char *buffer = malloc(INWIDTH * INHEIGHT * 3 / 2); unsigned char *outrows[3]; int frame = 0; outrows[0] = buffer + CROP_Y1 * INWIDTH; outrows[1] = buffer + ysize + CROP_Y1 / 2 * INWIDTH / 2; outrows[2] = buffer + ysize + csize + CROP_Y1 / 2 * INWIDTH / 2; while(!feof(stdin)) { fread(buffer, INWIDTH * INHEIGHT * 3 / 2, 1, stdin); quicktime_set_cmodel(file, BC_YUV420P); quicktime_encode_video(file, outrows, 0); printf("Wrote frame %d\r", frame++); fflush(stdout); } quicktime_close(file); }