From 0d2517ce1b5f9b46c08ca2d2eca982c99475cf17 Mon Sep 17 00:00:00 2001 From: John Koleszar Date: Mon, 25 Feb 2013 16:58:47 -0800 Subject: [PATCH] vpxdec: support scaling output Adds an option, --scale, that will rescale any frames produced by the decoder that don't match the resolution of the first frame to that resolution. This is useful for playback of files that use spatial resampling. Change-Id: I867adc650d535df7ec5b107549359712ea3aaaa0 --- examples.mk | 1 + vpxdec.c | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/examples.mk b/examples.mk index 28430a6..8426ee7 100644 --- a/examples.mk +++ b/examples.mk @@ -31,6 +31,7 @@ vpxdec.SRCS += nestegg/halloc/src/hlist.h vpxdec.SRCS += nestegg/halloc/src/macros.h vpxdec.SRCS += nestegg/include/nestegg/nestegg.h vpxdec.SRCS += nestegg/src/nestegg.c +vpxdec.SRCS += $(LIBYUV_SRCS) vpxdec.GUID = BA5FE66F-38DD-E034-F542-B1578C5FB950 vpxdec.DESCRIPTION = Full featured decoder UTILS-$(CONFIG_ENCODERS) += vpxenc.c diff --git a/vpxdec.c b/vpxdec.c index f7281a4..30196ec 100644 --- a/vpxdec.c +++ b/vpxdec.c @@ -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 @@ static const arg_def_t verbosearg = ARG_DEF("v", "verbose", 0, "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 md5arg = ARG_DEF(NULL, "md5", 0, 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 @@ int main(int argc, const char **argv_) { 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]; @@ -757,6 +763,8 @@ int main(int argc, const char **argv_) { 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 @@ int main(int argc, const char **argv_) { 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]; -- 2.7.4