ref: 0d2517ce1b5f9b46c08ca2d2eca982c99475cf17
parent: 34882b9bf538dc726fe9bec9dee2e45b8d8ea222
author: John Koleszar <jkoleszar@google.com>
date: Mon Feb 25 11:58:47 EST 2013
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
--- a/examples.mk
+++ b/examples.mk
@@ -31,6 +31,7 @@
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
--- 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 @@
"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;
+ 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 (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];
--
⑨