21 #define VPX_CODEC_DISABLE_COMPAT 1
24 #define interface (vpx_codec_vp8_cx())
25 #define fourcc 0x30385056
27 #define IVF_FILE_HDR_SZ (32)
28 #define IVF_FRAME_HDR_SZ (12)
30 static void mem_put_le16(
char *mem,
unsigned int val) {
35 static void mem_put_le32(
char *mem,
unsigned int val) {
42 static void die(
const char *fmt, ...) {
47 if(fmt[strlen(fmt)-1] !=
'\n')
57 printf(
" %s\n",detail);
62 size_t nbytes, to_read;
65 to_read = img->
w*img->
h*3/2;
66 nbytes = fread(img->
planes[0], 1, to_read, f);
67 if(nbytes != to_read) {
70 printf(
"Warning: Read partial frame. Check your width & height!\n");
75 static void write_ivf_file_header(FILE *outfile,
86 mem_put_le16(header+4, 0);
87 mem_put_le16(header+6, 32);
88 mem_put_le32(header+8, fourcc);
89 mem_put_le16(header+12, cfg->
g_w);
90 mem_put_le16(header+14, cfg->
g_h);
93 mem_put_le32(header+24, frame_cnt);
94 mem_put_le32(header+28, 0);
96 if(fwrite(header, 1, 32, outfile));
100 static void write_ivf_frame_header(FILE *outfile,
110 mem_put_le32(header, pkt->
data.
frame.sz);
111 mem_put_le32(header+4, pts&0xFFFFFFFF);
112 mem_put_le32(header+8, pts >> 32);
114 if(fwrite(header, 1, 12, outfile));
117 static int mode_to_num_layers[9] = {2, 2, 3, 3, 3, 3, 5, 2, 3};
119 int main(
int argc,
char **argv) {
133 int frame_duration = 1;
135 int layering_mode = 0;
138 int flag_periodicity;
139 int max_intra_size_pct;
143 die(
"Usage: %s <infile> <outfile> <width> <height> <rate_num> "
144 " <rate_den> <mode> <Rate_0> ... <Rate_nlayers-1>\n", argv[0]);
146 width = strtol (argv[3], NULL, 0);
147 height = strtol (argv[4], NULL, 0);
148 if (width < 16 || width%2 || height <16 || height%2)
149 die (
"Invalid resolution: %d x %d", width, height);
151 if (!sscanf(argv[7],
"%d", &layering_mode))
152 die (
"Invalid mode %s", argv[7]);
153 if (layering_mode<0 || layering_mode>8)
154 die (
"Invalid mode (0..8) %s", argv[7]);
156 if (argc != 8+mode_to_num_layers[layering_mode])
157 die (
"Invalid number of arguments");
160 die (
"Failed to allocate image", width, height);
177 die (
"Invalid timebase numerator %s", argv[5]);
179 die (
"Invalid timebase denominator %s", argv[6]);
181 for (i=8; i<8+mode_to_num_layers[layering_mode]; i++)
183 die (
"Invalid data rate %s", argv[i]);
210 switch (layering_mode)
245 int ids[3] = {0,1,1};
268 int ids[6] = {0,2,2,1,2,2};
294 int ids[4] = {0,2,1,2};
321 int ids[4] = {0,2,1,2};
348 int ids[4] = {0,2,1,2};
374 int ids[16] = {0,4,3,4,2,4,3,4,1,4,3,4,2,4,3,4};
418 flag_periodicity = 8;
444 int ids[4] = {0,2,1,2};
452 flag_periodicity = 8;
476 if(!(infile = fopen(argv[1],
"rb")))
477 die(
"Failed to open %s for reading", argv[1]);
483 sprintf (file_name,
"%s_%d.ivf", argv[2], i);
484 if (!(outfile[i] = fopen(file_name,
"wb")))
485 die(
"Failed to open %s for writing", file_name);
486 write_ivf_file_header(outfile[i], &cfg, 0);
491 die_codec (&codec,
"Failed to initialize encoder");
509 while (frame_avail || got_data) {
513 flags = layer_flags[frame_cnt % flag_periodicity];
515 frame_avail = read_frame(infile, &raw);
518 die_codec(&codec,
"Failed to encode frame");
521 if (layering_mode != 6)
532 write_ivf_frame_header(outfile[i], pkt);
535 frames_in_layer[i]++;
546 pts += frame_duration;
551 printf (
"Processed %d frames.\n",frame_cnt-1);
553 die_codec (&codec,
"Failed to destroy codec");
558 if (!fseek(outfile[i], 0, SEEK_SET))
559 write_ivf_file_header (outfile[i], &cfg, frames_in_layer[i]);