Index: source/libvpx/vpxdec.c |
=================================================================== |
--- source/libvpx/vpxdec.c (revision 191025) |
+++ source/libvpx/vpxdec.c (working copy) |
@@ -30,6 +30,7 @@ |
#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) |
@@ -93,6 +94,8 @@ |
"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 |
@@ -102,7 +105,7 @@ |
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 |
@@ -708,6 +711,9 @@ |
struct input_ctx input = {0}; |
int frames_corrupted = 0; |
int dec_flags = 0; |
+ int do_scale = 0; |
+ int stream_w = 0, stream_h = 0; |
+ vpx_image_t *scaled_img = NULL; |
/* Parse command line */ |
exec_name = argv_[0]; |
@@ -757,6 +763,8 @@ |
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)) { |
@@ -1015,6 +1023,30 @@ |
show_progress(frame_in, frame_out, dx_time); |
if (!noblit) { |
+ if (do_scale) { |
+ if (img && 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]; |