diff --git a/examples.mk b/examples.mk index 2337d1ece..a10ee52d7 100644 --- a/examples.mk +++ b/examples.mk @@ -64,6 +64,10 @@ vp9_spatial_scalable_encoder.SRCS += tools_common.c tools_common.h vp9_spatial_scalable_encoder.GUID = 4A38598D-627D-4505-9C7B-D4020C84100D vp9_spatial_scalable_encoder.DESCRIPTION = Spatial Scalable Encoder +ifeq ($(CONFIG_SHARED),no) +UTILS-$(CONFIG_VP9_ENCODER) += resize_util.c +endif + # XMA example disabled for now, not used in VP8 #UTILS-$(CONFIG_DECODERS) += example_xma.c #example_xma.GUID = A955FC4A-73F1-44F7-135E-30D84D32F022 diff --git a/resize_util.c b/resize_util.c new file mode 100644 index 000000000..b068f5524 --- /dev/null +++ b/resize_util.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2014 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include +#include +#include +#include +#include +#include + +#include "./vp9/encoder/vp9_resize.h" + +static void usage(char *progname) { + printf("Usage:\n"); + printf("%s x x ", + progname); + printf(" []\n"); +} + +static int parse_dim(char *v, int *width, int *height) { + char *x = strchr(v, 'x'); + if (x == NULL) + x = strchr(v, 'X'); + if (x == NULL) + return 0; + *width = atoi(v); + *height = atoi(&x[1]); + if (*width <= 0 || *height <= 0) + return 0; + else + return 1; +} + +int main(int argc, char *argv[]) { + char *fin, *fout; + FILE *fpin, *fpout; + uint8_t *inbuf, *outbuf; + uint8_t *inbuf_u, *outbuf_u; + uint8_t *inbuf_v, *outbuf_v; + int f, frames; + int width, height, target_width, target_height; + + if (argc < 5) { + printf("Incorrect parameters:\n"); + usage(argv[0]); + return 1; + } + + fin = argv[1]; + fout = argv[4]; + if (!parse_dim(argv[2], &width, &height)) { + printf("Incorrect parameters: %s\n", argv[2]); + usage(argv[0]); + return 1; + } + if (!parse_dim(argv[3], &target_width, &target_height)) { + printf("Incorrect parameters: %s\n", argv[3]); + usage(argv[0]); + return 1; + } + + fpin = fopen(fin, "rb"); + if (fpin == NULL) { + printf("Can't open file %s to read\n", fin); + usage(argv[0]); + return 1; + } + fpout = fopen(fout, "wb"); + if (fpout == NULL) { + printf("Can't open file %s to write\n", fout); + usage(argv[0]); + return 1; + } + if (argc >= 6) + frames = atoi(argv[5]); + else + frames = INT_MAX; + + printf("Input size: %dx%d\n", + width, height); + printf("Target size: %dx%d, Frames: ", + target_width, target_height); + if (frames == INT_MAX) + printf("All\n"); + else + printf("%d\n", frames); + + inbuf = (uint8_t*)malloc(width * height * 3 / 2); + outbuf = (uint8_t*)malloc(target_width * target_height * 3 / 2); + inbuf_u = inbuf + width * height; + inbuf_v = inbuf_u + width * height / 4; + outbuf_u = outbuf + target_width * target_height; + outbuf_v = outbuf_u + target_width * target_height / 4; + f = 0; + while (f < frames) { + if (fread(inbuf, width * height * 3 / 2, 1, fpin) != 1) + break; + vp9_resize_frame420(inbuf, width, inbuf_u, inbuf_v, width / 2, + height, width, + outbuf, target_width, outbuf_u, outbuf_v, + target_width / 2, + target_height, target_width); + fwrite(outbuf, target_width * target_height * 3 / 2, 1, fpout); + f++; + } + printf("%d frames processed\n", f); + fclose(fpin); + fclose(fpout); + + free(inbuf); + free(outbuf); + return 0; +}