23 #include "./vpx_config.h" 33 #include <sys/types.h> 39 #include "vpx_ports/vpx_timer.h" 42 #include "vpx_ports/mem_ops.h" 43 #include "../tools_common.h" 44 #define interface (vpx_codec_vp8_cx()) 45 #define fourcc 0x30385056 47 void usage_exit(
void) {
61 #define NUM_ENCODERS 3 64 #define MAX_NUM_TEMPORAL_LAYERS 3 67 #include "third_party/libyuv/include/libyuv/basic_types.h" 68 #include "third_party/libyuv/include/libyuv/scale.h" 69 #include "third_party/libyuv/include/libyuv/cpu_id.h" 74 size_t nbytes, to_read;
77 to_read = img->
w*img->
h*3/2;
78 nbytes = fread(img->
planes[0], 1, to_read, f);
79 if(nbytes != to_read) {
82 printf(
"Warning: Read partial frame. Check your width & height!\n");
87 static int read_frame_by_row(FILE *f,
vpx_image_t *img) {
88 size_t nbytes, to_read;
92 for (plane = 0; plane < 3; plane++)
95 int w = (plane ? (1 + img->
d_w) / 2 : img->
d_w);
96 int h = (plane ? (1 + img->
d_h) / 2 : img->
d_h);
115 for (r = 0; r < h; r++)
119 nbytes = fread(ptr, 1, to_read, f);
120 if(nbytes != to_read) {
123 printf(
"Warning: Read partial frame. Check your width & height!\n");
127 ptr += img->
stride[plane];
136 static void write_ivf_file_header(FILE *outfile,
147 mem_put_le16(header+4, 0);
148 mem_put_le16(header+6, 32);
149 mem_put_le32(header+8, fourcc);
150 mem_put_le16(header+12, cfg->
g_w);
151 mem_put_le16(header+14, cfg->
g_h);
154 mem_put_le32(header+24, frame_cnt);
155 mem_put_le32(header+28, 0);
157 (void) fwrite(header, 1, 32, outfile);
160 static void write_ivf_frame_header(FILE *outfile,
170 mem_put_le32(header, pkt->
data.
frame.sz);
171 mem_put_le32(header+4, pts&0xFFFFFFFF);
172 mem_put_le32(header+8, pts >> 32);
174 (void) fwrite(header, 1, 12, outfile);
182 static void set_temporal_layer_pattern(
int num_temporal_layers,
187 assert(num_temporal_layers <= MAX_NUM_TEMPORAL_LAYERS);
188 switch (num_temporal_layers)
241 layer_flags[4] = layer_flags[2];
244 layer_flags[5] = layer_flags[3];
247 layer_flags[6] = layer_flags[4];
250 layer_flags[7] = layer_flags[5];
304 layer_flags[5] = layer_flags[3];
311 layer_flags[7] = layer_flags[3];
318 static int periodicity_to_num_layers[MAX_NUM_TEMPORAL_LAYERS] = {1, 8, 8};
320 int main(
int argc,
char **argv)
322 FILE *infile, *outfile[NUM_ENCODERS];
323 FILE *downsampled_input[NUM_ENCODERS - 1];
342 int flag_periodicity;
351 int key_frame_insert = 0;
352 uint64_t psnr_sse_total[NUM_ENCODERS] = {0};
353 uint64_t psnr_samples_total[NUM_ENCODERS] = {0};
354 double psnr_totals[NUM_ENCODERS][4] = {{0,0}};
355 int psnr_count[NUM_ENCODERS] = {0};
358 struct timeval tv1, tv2, difftv;
364 unsigned int target_bitrate[NUM_ENCODERS]={1000, 500, 100};
377 unsigned int num_temporal_layers[NUM_ENCODERS] = {3, 3, 3};
379 if(argc!= (7 + 3 * NUM_ENCODERS))
380 die(
"Usage: %s <width> <height> <frame_rate> <infile> <outfile(s)> " 381 "<rate_encoder(s)> <temporal_layer(s)> <key_frame_insert> <output psnr?> \n",
386 width = strtol(argv[1], NULL, 0);
387 height = strtol(argv[2], NULL, 0);
388 framerate = strtol(argv[3], NULL, 0);
390 if(width < 16 || width%2 || height <16 || height%2)
391 die(
"Invalid resolution: %ldx%ld", width, height);
394 if(!(infile = fopen(argv[4],
"rb")))
395 die(
"Failed to open %s for reading", argv[4]);
398 for (i=0; i< NUM_ENCODERS; i++)
400 if(!target_bitrate[i])
406 if(!(outfile[i] = fopen(argv[i+5],
"wb")))
407 die(
"Failed to open %s for writing", argv[i+4]);
411 for (i=0; i< NUM_ENCODERS; i++)
413 target_bitrate[i] = strtol(argv[NUM_ENCODERS + 5 + i], NULL, 0);
417 for (i=0; i< NUM_ENCODERS; i++)
419 num_temporal_layers[i] = strtol(argv[2 * NUM_ENCODERS + 5 + i], NULL, 0);
420 if (num_temporal_layers[i] < 1 || num_temporal_layers[i] > 3)
421 die(
"Invalid temporal layers: %d, Must be 1, 2, or 3. \n",
422 num_temporal_layers);
426 for (i=0; i< NUM_ENCODERS - 1; i++)
429 if (sprintf(filename,
"ds%d.yuv",NUM_ENCODERS - i) < 0)
433 downsampled_input[i] = fopen(filename,
"wb");
436 key_frame_insert = strtol(argv[3 * NUM_ENCODERS + 5], NULL, 0);
438 show_psnr = strtol(argv[3 * NUM_ENCODERS + 6], NULL, 0);
442 for (i=0; i< NUM_ENCODERS; i++)
483 for (i=1; i< NUM_ENCODERS; i++)
494 unsigned int iw = cfg[i-1].
g_w*dsf[i-1].
den + dsf[i-1].
num - 1;
495 unsigned int ih = cfg[i-1].
g_h*dsf[i-1].
den + dsf[i-1].
num - 1;
496 cfg[i].
g_w = iw/dsf[i-1].
num;
497 cfg[i].
g_h = ih/dsf[i-1].
num;
502 if((cfg[i].g_w)%2)cfg[i].
g_w++;
503 if((cfg[i].g_h)%2)cfg[i].
g_h++;
514 for (i=0; i< NUM_ENCODERS; i++)
516 die(
"Failed to allocate image", cfg[i].g_w, cfg[i].g_h);
518 if (raw[0].stride[VPX_PLANE_Y] == raw[0].d_w)
519 read_frame_p = read_frame;
521 read_frame_p = read_frame_by_row;
523 for (i=0; i< NUM_ENCODERS; i++)
525 write_ivf_file_header(outfile[i], &cfg[i], 0);
528 for ( i=0; i<NUM_ENCODERS; i++)
530 set_temporal_layer_pattern(num_temporal_layers[i],
532 cfg[i].rc_target_bitrate,
538 (show_psnr ? VPX_CODEC_USE_PSNR : 0), &dsf[0]))
539 die_codec(&codec[0],
"Failed to initialize encoder");
543 for ( i=0; i<NUM_ENCODERS; i++)
547 if (i == NUM_ENCODERS - 1) speed = -4;
549 die_codec(&codec[i],
"Failed to set cpu_used");
553 for ( i=0; i<NUM_ENCODERS; i++)
556 die_codec(&codec[i],
"Failed to set static threshold");
562 die_codec(&codec[0],
"Failed to set noise_sensitivity");
563 for ( i=1; i< NUM_ENCODERS; i++)
566 die_codec(&codec[i],
"Failed to set noise_sensitivity");
570 for ( i=0; i<NUM_ENCODERS; i++)
573 die_codec(&codec[i],
"Failed to set static threshold");
577 for ( i=0; i<NUM_ENCODERS; i++)
579 unsigned int max_intra_size_pct =
580 (int)(((
double)cfg[0].rc_buf_optimal_sz * 0.5) * framerate / 10);
583 die_codec(&codec[i],
"Failed to set static threshold");
590 while(frame_avail || got_data)
596 frame_avail = read_frame_p(infile, &raw[0]);
600 for ( i=1; i<NUM_ENCODERS; i++)
604 I420Scale(raw[i-1].planes[VPX_PLANE_Y], raw[i-1].stride[VPX_PLANE_Y],
605 raw[i-1].planes[VPX_PLANE_U], raw[i-1].stride[VPX_PLANE_U],
606 raw[i-1].planes[VPX_PLANE_V], raw[i-1].stride[VPX_PLANE_V],
607 raw[i-1].d_w, raw[i-1].d_h,
608 raw[i].planes[VPX_PLANE_Y], raw[i].stride[VPX_PLANE_Y],
609 raw[i].planes[VPX_PLANE_U], raw[i].stride[VPX_PLANE_U],
610 raw[i].planes[VPX_PLANE_V], raw[i].stride[VPX_PLANE_V],
611 raw[i].d_w, raw[i].d_h, 1);
613 length_frame = cfg[i].
g_w * cfg[i].
g_h *3/2;
614 if (fwrite(raw[i].planes[0], 1, length_frame,
615 downsampled_input[NUM_ENCODERS - i - 1]) !=
624 for ( i=0; i<NUM_ENCODERS; i++)
628 flag_periodicity = periodicity_to_num_layers
629 [num_temporal_layers[i] - 1];
631 frame_cnt % flag_periodicity];
637 if (frame_cnt > 0 && frame_cnt == key_frame_insert)
646 gettimeofday(&tv1, NULL);
651 frame_cnt, 1, 0, arg_deadline))
653 die_codec(&codec[0],
"Failed to encode frame");
655 gettimeofday(&tv2, NULL);
656 timersub(&tv2, &tv1, &difftv);
657 cx_time += (double)(difftv.tv_sec * 1000000 + difftv.tv_usec);
658 for (i=NUM_ENCODERS-1; i>=0 ; i--)
664 switch(pkt[i]->kind) {
666 write_ivf_frame_header(outfile[i], pkt[i]);
667 (void) fwrite(pkt[i]->data.
frame.buf, 1,
675 psnr_sse_total[i] += pkt[i]->
data.
psnr.sse[0];
676 psnr_samples_total[i] += pkt[i]->
data.
psnr.samples[0];
677 for (j = 0; j < 4; j++)
679 psnr_totals[i][j] += pkt[i]->
data.
psnr.psnr[j];
696 printf(
"FPS for encoding %d %f %f \n", frame_cnt, (
float)cx_time / 1000000,
697 1000000 * (
double)frame_cnt / (
double)cx_time);
701 printf(
"Processed %ld frames.\n",(
long int)frame_cnt-1);
702 for (i=0; i< NUM_ENCODERS; i++)
705 if ( (show_psnr) && (psnr_count[i]>0) )
708 double ovpsnr = sse_to_psnr(psnr_samples_total[i], 255.0,
711 fprintf(stderr,
"\n ENC%d PSNR (Overall/Avg/Y/U/V)", i);
713 fprintf(stderr,
" %.3lf", ovpsnr);
714 for (j = 0; j < 4; j++)
716 fprintf(stderr,
" %.3lf", psnr_totals[i][j]/psnr_count[i]);
721 die_codec(&codec[i],
"Failed to destroy codec");
729 if(!fseek(outfile[i], 0, SEEK_SET))
730 write_ivf_file_header(outfile[i], &cfg[i], frame_cnt-1);
Rational Number.
Definition: vpx_encoder.h:259
unsigned int rc_buf_initial_sz
Decoder Buffer Initial Size.
Definition: vpx_encoder.h:610
unsigned int ts_number_layers
Number of temporal coding layers.
Definition: vpx_encoder.h:715
Codec control function to set encoder internal speed settings.
Definition: vp8cx.h:173
#define VP8_EFLAG_NO_UPD_GF
Don't update the golden frame.
Definition: vp8cx.h:101
Image Descriptor.
Definition: vpx_image.h:88
Describes the encoder algorithm interface to applications.
const char * vpx_codec_iface_name(vpx_codec_iface_t *iface)
Return the name for a given interface.
Definition: vpx_image.h:55
const char * vpx_codec_err_to_string(vpx_codec_err_t err)
Convert error number to printable string.
struct vpx_rational g_timebase
Stream timebase units.
Definition: vpx_encoder.h:397
Definition: vpx_encoder.h:276
unsigned int rc_buf_sz
Decoder Buffer Size.
Definition: vpx_encoder.h:600
#define VP8_EFLAG_NO_REF_GF
Don't reference the golden frame.
Definition: vp8cx.h:76
Codec control function to set reference and update frame flags.
Definition: vp8cx.h:275
enum vpx_kf_mode kf_mode
Keyframe placement mode.
Definition: vpx_encoder.h:665
int den
Definition: vpx_encoder.h:261
vpx_codec_err_t vpx_codec_encode(vpx_codec_ctx_t *ctx, const vpx_image_t *img, vpx_codec_pts_t pts, unsigned long duration, vpx_enc_frame_flags_t flags, unsigned long deadline)
Encode a frame.
unsigned int rc_max_quantizer
Maximum (Worst Quality) Quantizer.
Definition: vpx_encoder.h:552
unsigned int rc_min_quantizer
Minimum (Best Quality) Quantizer.
Definition: vpx_encoder.h:541
unsigned int kf_max_dist
Keyframe maximum interval.
Definition: vpx_encoder.h:685
unsigned int g_lag_in_frames
Allow lagged encoding.
Definition: vpx_encoder.h:429
Encoder configuration structure.
Definition: vpx_encoder.h:314
Definition: vpx_encoder.h:179
Definition: vpx_encoder.h:292
Codec control function to set Max data rate for Intra frames.
Definition: vp8cx.h:269
Encoder output packet.
Definition: vpx_encoder.h:195
unsigned int rc_overshoot_pct
Rate control adaptation overshoot control.
Definition: vpx_encoder.h:583
unsigned int ts_rate_decimator[5]
Frame rate decimation factor for each temporal layer.
Definition: vpx_encoder.h:729
unsigned int rc_buf_optimal_sz
Decoder Buffer Optimal Size.
Definition: vpx_encoder.h:620
#define VPX_PLANE_V
Definition: vpx_image.h:114
unsigned int kf_min_dist
Keyframe minimum interval.
Definition: vpx_encoder.h:675
Definition: vpx_encoder.h:269
unsigned int ts_layer_id[16]
Template defining the membership of frames to temporal layers.
Definition: vpx_encoder.h:747
struct vpx_codec_cx_pkt::@1::@2 frame
vpx_image_t * vpx_img_alloc(vpx_image_t *img, vpx_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align)
Open a descriptor, allocating storage for the underlying image.
Definition: vpx_image.h:56
unsigned int d_w
Definition: vpx_image.h:99
unsigned int g_w
Width of the frame.
Definition: vpx_encoder.h:357
unsigned int ts_target_bitrate[5]
Target bitrate for each temporal layer.
Definition: vpx_encoder.h:722
unsigned int rc_undershoot_pct
Rate control adaptation undershoot control.
Definition: vpx_encoder.h:570
unsigned int g_h
Height of the frame.
Definition: vpx_encoder.h:367
int stride[4]
Definition: vpx_image.h:117
enum vpx_codec_cx_pkt_kind kind
Definition: vpx_encoder.h:196
unsigned int rc_dropframe_thresh
Temporal resampling configuration, if supported by the codec.
Definition: vpx_encoder.h:452
Codec control function to set the temporal layer id.
Definition: vp8cx.h:316
#define VP8_EFLAG_NO_UPD_LAST
Don't update the last frame.
Definition: vp8cx.h:93
void vpx_img_free(vpx_image_t *img)
Close an image descriptor.
vpx_img_fmt_t fmt
Definition: vpx_image.h:89
unsigned char * planes[4]
Definition: vpx_image.h:116
Codec control function to set the number of token partitions.
Definition: vp8cx.h:206
unsigned int rc_target_bitrate
Target data rate.
Definition: vpx_encoder.h:525
#define VPX_DL_REALTIME
Definition: vpx_encoder.h:911
int num
Definition: vpx_encoder.h:260
control function to set noise sensitivity
Definition: vp8cx.h:188
enum vpx_enc_pass g_pass
Multi-pass Encoding Mode.
Definition: vpx_encoder.h:414
double psnr[4]
Definition: vpx_encoder.h:219
unsigned int g_threads
Maximum number of threads to use.
Definition: vpx_encoder.h:335
Provides definitions for using VP8 or VP9 encoder algorithm within the vpx Codec Interface.
#define VPX_PLANE_U
Definition: vpx_image.h:113
unsigned int rc_resize_allowed
Enable/disable spatial resampling, if supported by the codec.
Definition: vpx_encoder.h:462
unsigned int h
Definition: vpx_image.h:95
vpx_codec_err_t
Algorithm return codes.
Definition: vpx_codec.h:89
const vpx_codec_cx_pkt_t * vpx_codec_get_cx_data(vpx_codec_ctx_t *ctx, vpx_codec_iter_t *iter)
Encoded data iterator.
union vpx_codec_cx_pkt::@1 data
#define vpx_codec_enc_init_multi(ctx, iface, cfg, num_enc, flags, dsf)
Convenience macro for vpx_codec_enc_init_multi_ver()
Definition: vpx_encoder.h:850
int64_t vpx_codec_pts_t
Time Stamp Type.
Definition: vpx_encoder.h:119
vpx_codec_err_t vpx_codec_enc_config_default(vpx_codec_iface_t *iface, vpx_codec_enc_cfg_t *cfg, unsigned int reserved)
Get a default configuration.
#define VPX_TS_MAX_PERIODICITY
Definition: vpx_encoder.h:37
#define vpx_codec_control(ctx, id, data)
vpx_codec_control wrapper macro
Definition: vpx_codec.h:407
unsigned int ts_periodicity
Length of the sequence defining frame temporal layer membership.
Definition: vpx_encoder.h:738
vpx_codec_err_t vpx_codec_destroy(vpx_codec_ctx_t *ctx)
Destroy a codec instance.
unsigned int d_h
Definition: vpx_image.h:100
unsigned int w
Definition: vpx_image.h:94
Codec control function to set the threshold for MBs treated static.
Definition: vp8cx.h:200
#define VPX_FRAME_IS_KEY
Definition: vpx_encoder.h:130
#define VPX_EFLAG_FORCE_KF
Definition: vpx_encoder.h:305
const void * vpx_codec_iter_t
Iterator.
Definition: vpx_codec.h:188
Definition: vpx_encoder.h:176
vpx_codec_er_flags_t g_error_resilient
Enable error resilient modes.
Definition: vpx_encoder.h:406
#define VP8_EFLAG_NO_UPD_ARF
Don't update the alternate reference frame.
Definition: vp8cx.h:109
#define VP8_EFLAG_NO_UPD_ENTROPY
Disable entropy update.
Definition: vp8cx.h:133
enum vpx_rc_mode rc_end_usage
Rate control algorithm to use.
Definition: vpx_encoder.h:504
Definition: vpx_encoder.h:267
Codec context structure.
Definition: vpx_codec.h:199