1b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian/* 2b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * 4b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Use of this source code is governed by a BSD-style license 5b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * that can be found in the LICENSE file in the root of the source 6b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * tree. An additional intellectual property rights grant can be found 7b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * in the file PATENTS. All contributing project authors may 8b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * be found in the AUTHORS file in the root of the source tree. 9b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian */ 10b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 11b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <assert.h> 12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <limits.h> 13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <math.h> 14b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <stdio.h> 15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <stdlib.h> 16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <string.h> 17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "./vp9/encoder/vp9_resize.h" 19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void usage(char *progname) { 21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Usage:\n"); 22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("%s <input_yuv> <width>x<height> <target_width>x<target_height> ", 23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian progname); 24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("<output_yuv> [<frames>]\n"); 25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int parse_dim(char *v, int *width, int *height) { 28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian char *x = strchr(v, 'x'); 29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (x == NULL) 30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian x = strchr(v, 'X'); 31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (x == NULL) 32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 0; 33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *width = atoi(v); 34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *height = atoi(&x[1]); 35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (*width <= 0 || *height <= 0) 36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 0; 37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian else 38b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 1; 39b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 41b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint main(int argc, char *argv[]) { 42b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian char *fin, *fout; 43b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE *fpin, *fpout; 44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *inbuf, *outbuf; 45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *inbuf_u, *outbuf_u; 46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint8_t *inbuf_v, *outbuf_v; 47b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int f, frames; 48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int width, height, target_width, target_height; 49b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (argc < 5) { 51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Incorrect parameters:\n"); 52b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian usage(argv[0]); 53b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 1; 54b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 55b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 56b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fin = argv[1]; 57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fout = argv[4]; 58b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!parse_dim(argv[2], &width, &height)) { 59b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Incorrect parameters: %s\n", argv[2]); 60b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian usage(argv[0]); 61b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 1; 62b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 63b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!parse_dim(argv[3], &target_width, &target_height)) { 64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Incorrect parameters: %s\n", argv[3]); 65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian usage(argv[0]); 66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 1; 67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 69b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fpin = fopen(fin, "rb"); 70b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (fpin == NULL) { 71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Can't open file %s to read\n", fin); 72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian usage(argv[0]); 73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 1; 74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fpout = fopen(fout, "wb"); 76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (fpout == NULL) { 77b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Can't open file %s to write\n", fout); 78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian usage(argv[0]); 79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 1; 80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (argc >= 6) 82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian frames = atoi(argv[5]); 83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian else 84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian frames = INT_MAX; 85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Input size: %dx%d\n", 87b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian width, height); 88b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("Target size: %dx%d, Frames: ", 89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian target_width, target_height); 90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (frames == INT_MAX) 91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("All\n"); 92b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian else 93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("%d\n", frames); 94b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 95b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian inbuf = (uint8_t*)malloc(width * height * 3 / 2); 96b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian outbuf = (uint8_t*)malloc(target_width * target_height * 3 / 2); 97b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian inbuf_u = inbuf + width * height; 98b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian inbuf_v = inbuf_u + width * height / 4; 99b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian outbuf_u = outbuf + target_width * target_height; 100b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian outbuf_v = outbuf_u + target_width * target_height / 4; 101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian f = 0; 102b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian while (f < frames) { 103b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (fread(inbuf, width * height * 3 / 2, 1, fpin) != 1) 104b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian break; 105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_resize_frame420(inbuf, width, inbuf_u, inbuf_v, width / 2, 106b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian height, width, 107b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian outbuf, target_width, outbuf_u, outbuf_v, 108b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian target_width / 2, 109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian target_height, target_width); 110b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fwrite(outbuf, target_width * target_height * 3 / 2, 1, fpout); 111b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian f++; 112b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 113b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian printf("%d frames processed\n", f); 114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fclose(fpin); 115b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fclose(fpout); 116b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 117b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian free(inbuf); 118b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian free(outbuf); 119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 0; 120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 121