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 (void) 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 (void) fwrite(header, 1, 12, outfile);
117 static int mode_to_num_layers[12] = {1, 2, 2, 3, 3, 3, 3, 5, 2, 3, 3, 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>11)
154 die (
"Invalid mode (0..11) %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]);
214 switch (layering_mode)
264 int ids[3] = {0,1,1};
287 int ids[6] = {0,2,2,1,2,2};
313 int ids[4] = {0,2,1,2};
340 int ids[4] = {0,2,1,2};
368 int ids[4] = {0,2,1,2};
394 int ids[16] = {0,4,3,4,2,4,3,4,1,4,3,4,2,4,3,4};
438 flag_periodicity = 8;
465 layer_flags[4] = layer_flags[2];
468 layer_flags[5] = layer_flags[3];
471 layer_flags[6] = layer_flags[4];
474 layer_flags[7] = layer_flags[5];
483 int ids[4] = {0,2,1,2};
491 flag_periodicity = 8;
518 int ids[4] = {0,2,1,2};
526 flag_periodicity = 8;
559 layer_flags[5] = layer_flags[3];
566 layer_flags[7] = layer_flags[3];
575 int ids[4] = {0,2,1,2};
583 flag_periodicity = 8;
591 layer_flags[4] = layer_flags[0];
596 layer_flags[6] = layer_flags[2];
603 layer_flags[3] = layer_flags[1];
604 layer_flags[5] = layer_flags[1];
605 layer_flags[7] = layer_flags[1];
611 if(!(infile = fopen(argv[1],
"rb")))
612 die(
"Failed to open %s for reading", argv[1]);
618 sprintf (file_name,
"%s_%d.ivf", argv[2], i);
619 if (!(outfile[i] = fopen(file_name,
"wb")))
620 die(
"Failed to open %s for writing", file_name);
621 write_ivf_file_header(outfile[i], &cfg, 0);
626 die_codec (&codec,
"Failed to initialize encoder");
643 while (frame_avail || got_data) {
647 flags = layer_flags[frame_cnt % flag_periodicity];
649 frame_avail = read_frame(infile, &raw);
652 die_codec(&codec,
"Failed to encode frame");
655 if (layering_mode != 7)
666 write_ivf_frame_header(outfile[i], pkt);
669 frames_in_layer[i]++;
677 pts += frame_duration;
681 printf (
"Processed %d frames.\n",frame_cnt-1);
683 die_codec (&codec,
"Failed to destroy codec");
688 if (!fseek(outfile[i], 0, SEEK_SET))
689 write_ivf_file_header (outfile[i], &cfg, frames_in_layer[i]);