#endif
#include "tools_common.h"
#include "nestegg/include/nestegg/nestegg.h"
+#include "third_party/libyuv/include/libyuv/scale.h"
#if CONFIG_OS_SUPPORT
#if defined(_MSC_VER)
"Show version string");
static const arg_def_t error_concealment = ARG_DEF(NULL, "error-concealment", 0,
"Enable decoder error-concealment");
+static const arg_def_t scalearg = ARG_DEF("S", "scale", 0,
+ "Scale output frames uniformly");
#if CONFIG_MD5
static const arg_def_t *all_args[] = {
&codecarg, &use_yv12, &use_i420, &flipuvarg, &noblitarg,
&progressarg, &limitarg, &skiparg, &postprocarg, &summaryarg, &outputfile,
- &threadsarg, &verbosearg,
+ &threadsarg, &verbosearg, &scalearg,
#if CONFIG_MD5
&md5arg,
#endif
struct input_ctx input = {0};
int frames_corrupted = 0;
int dec_flags = 0;
+ int do_scale;
+ int stream_w = 0, stream_h = 0;
+ vpx_image_t *scaled_img = NULL;
/* Parse command line */
exec_name = argv_[0];
cfg.threads = arg_parse_uint(&arg);
else if (arg_match(&arg, &verbosearg, argi))
quiet = 0;
+ else if (arg_match(&arg, &scalearg, argi))
+ do_scale = 1;
#if CONFIG_VP8_DECODER
else if (arg_match(&arg, &addnoise_level, argi)) {
show_progress(frame_in, frame_out, dx_time);
if (!noblit) {
+ if (do_scale) {
+ if (frame_out == 1) {
+ stream_w = img->d_w;
+ stream_h = img->d_h;
+ scaled_img = vpx_img_alloc(NULL, VPX_IMG_FMT_I420,
+ stream_w, stream_h, 16);
+ }
+ if (img && (img->d_w != stream_w || img->d_h != stream_h)) {
+ I420Scale(img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y],
+ img->planes[VPX_PLANE_U], img->stride[VPX_PLANE_U],
+ img->planes[VPX_PLANE_V], img->stride[VPX_PLANE_V],
+ img->d_w, img->d_h,
+ scaled_img->planes[VPX_PLANE_Y],
+ scaled_img->stride[VPX_PLANE_Y],
+ scaled_img->planes[VPX_PLANE_U],
+ scaled_img->stride[VPX_PLANE_U],
+ scaled_img->planes[VPX_PLANE_V],
+ scaled_img->stride[VPX_PLANE_V],
+ stream_w, stream_h,
+ kFilterBox);
+ img = scaled_img;
+ }
+ }
+
if (img) {
unsigned int y;
char out_fn[PATH_MAX];