resize_util.c revision 7bc9febe8749e98a3812a0dc4380ceae75c29450
1971523410fd2235e13c617b6a1569f70486258d7Dave Airlie/* 2971523410fd2235e13c617b6a1569f70486258d7Dave Airlie * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3971523410fd2235e13c617b6a1569f70486258d7Dave Airlie * 4971523410fd2235e13c617b6a1569f70486258d7Dave Airlie * Use of this source code is governed by a BSD-style license 5971523410fd2235e13c617b6a1569f70486258d7Dave Airlie * that can be found in the LICENSE file in the root of the source 6971523410fd2235e13c617b6a1569f70486258d7Dave Airlie * tree. An additional intellectual property rights grant can be found 7971523410fd2235e13c617b6a1569f70486258d7Dave Airlie * in the file PATENTS. All contributing project authors may 8971523410fd2235e13c617b6a1569f70486258d7Dave Airlie * be found in the AUTHORS file in the root of the source tree. 9971523410fd2235e13c617b6a1569f70486258d7Dave Airlie */ 10971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 11971523410fd2235e13c617b6a1569f70486258d7Dave Airlie#include <assert.h> 12971523410fd2235e13c617b6a1569f70486258d7Dave Airlie#include <limits.h> 13971523410fd2235e13c617b6a1569f70486258d7Dave Airlie#include <math.h> 14971523410fd2235e13c617b6a1569f70486258d7Dave Airlie#include <stdio.h> 15971523410fd2235e13c617b6a1569f70486258d7Dave Airlie#include <stdlib.h> 16971523410fd2235e13c617b6a1569f70486258d7Dave Airlie#include <string.h> 17971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 18971523410fd2235e13c617b6a1569f70486258d7Dave Airlie#include "../tools_common.h" 19971523410fd2235e13c617b6a1569f70486258d7Dave Airlie#include "../vp9/encoder/vp9_resize.h" 20971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 21971523410fd2235e13c617b6a1569f70486258d7Dave Airliestatic const char *exec_name = NULL; 22971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 23971523410fd2235e13c617b6a1569f70486258d7Dave Airliestatic void usage() { 24971523410fd2235e13c617b6a1569f70486258d7Dave Airlie printf("Usage:\n"); 25971523410fd2235e13c617b6a1569f70486258d7Dave Airlie printf("%s <input_yuv> <width>x<height> <target_width>x<target_height> ", 26971523410fd2235e13c617b6a1569f70486258d7Dave Airlie exec_name); 27971523410fd2235e13c617b6a1569f70486258d7Dave Airlie printf("<output_yuv> [<frames>]\n"); 28971523410fd2235e13c617b6a1569f70486258d7Dave Airlie} 29971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 303f7ef2488938d31b5ead043891fadc3cee4c6f05Dave Airlievoid usage_exit(void) { 31971523410fd2235e13c617b6a1569f70486258d7Dave Airlie usage(); 32971523410fd2235e13c617b6a1569f70486258d7Dave Airlie exit(EXIT_FAILURE); 33971523410fd2235e13c617b6a1569f70486258d7Dave Airlie} 34971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 35971523410fd2235e13c617b6a1569f70486258d7Dave Airliestatic int parse_dim(char *v, int *width, int *height) { 363f7ef2488938d31b5ead043891fadc3cee4c6f05Dave Airlie char *x = strchr(v, 'x'); 37787c172aed0ae88ca6a8c1a193d9dd744fbdc918Dave Airlie if (x == NULL) x = strchr(v, 'X'); 383f7ef2488938d31b5ead043891fadc3cee4c6f05Dave Airlie if (x == NULL) return 0; 393f7ef2488938d31b5ead043891fadc3cee4c6f05Dave Airlie *width = atoi(v); 40971523410fd2235e13c617b6a1569f70486258d7Dave Airlie *height = atoi(&x[1]); 41971523410fd2235e13c617b6a1569f70486258d7Dave Airlie if (*width <= 0 || *height <= 0) 42e73d136a02308088cacab842790c7670e5d07b23Jason Ekstrand return 0; 43971523410fd2235e13c617b6a1569f70486258d7Dave Airlie else 44971523410fd2235e13c617b6a1569f70486258d7Dave Airlie return 1; 45a77426fd922259bc37b762fa22b42b91d3ce494aEdward O'Callaghan} 46971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 47971523410fd2235e13c617b6a1569f70486258d7Dave Airlieint main(int argc, char *argv[]) { 48971523410fd2235e13c617b6a1569f70486258d7Dave Airlie char *fin, *fout; 49971523410fd2235e13c617b6a1569f70486258d7Dave Airlie FILE *fpin, *fpout; 50971523410fd2235e13c617b6a1569f70486258d7Dave Airlie uint8_t *inbuf, *outbuf; 51971523410fd2235e13c617b6a1569f70486258d7Dave Airlie uint8_t *inbuf_u, *outbuf_u; 52d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay uint8_t *inbuf_v, *outbuf_v; 53971523410fd2235e13c617b6a1569f70486258d7Dave Airlie int f, frames; 54971523410fd2235e13c617b6a1569f70486258d7Dave Airlie int width, height, target_width, target_height; 55971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 56ec0bc14a700c2503d834ac0763f4cfbe312998faDave Airlie exec_name = argv[0]; 57971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 58971523410fd2235e13c617b6a1569f70486258d7Dave Airlie if (argc < 5) { 59971523410fd2235e13c617b6a1569f70486258d7Dave Airlie printf("Incorrect parameters:\n"); 60971523410fd2235e13c617b6a1569f70486258d7Dave Airlie usage(); 61971523410fd2235e13c617b6a1569f70486258d7Dave Airlie return 1; 62971523410fd2235e13c617b6a1569f70486258d7Dave Airlie } 63971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 64971523410fd2235e13c617b6a1569f70486258d7Dave Airlie fin = argv[1]; 65971523410fd2235e13c617b6a1569f70486258d7Dave Airlie fout = argv[4]; 66971523410fd2235e13c617b6a1569f70486258d7Dave Airlie if (!parse_dim(argv[2], &width, &height)) { 67d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay printf("Incorrect parameters: %s\n", argv[2]); 68d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay usage(); 69971523410fd2235e13c617b6a1569f70486258d7Dave Airlie return 1; 70971523410fd2235e13c617b6a1569f70486258d7Dave Airlie } 71971523410fd2235e13c617b6a1569f70486258d7Dave Airlie if (!parse_dim(argv[3], &target_width, &target_height)) { 72971523410fd2235e13c617b6a1569f70486258d7Dave Airlie printf("Incorrect parameters: %s\n", argv[3]); 73971523410fd2235e13c617b6a1569f70486258d7Dave Airlie usage(); 74971523410fd2235e13c617b6a1569f70486258d7Dave Airlie return 1; 75971523410fd2235e13c617b6a1569f70486258d7Dave Airlie } 76971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 77971523410fd2235e13c617b6a1569f70486258d7Dave Airlie fpin = fopen(fin, "rb"); 78971523410fd2235e13c617b6a1569f70486258d7Dave Airlie if (fpin == NULL) { 79d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay printf("Can't open file %s to read\n", fin); 80d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay usage(); 81d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay return 1; 82d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay } 83d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay fpout = fopen(fout, "wb"); 84d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay if (fpout == NULL) { 85d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay printf("Can't open file %s to write\n", fout); 86d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay usage(); 87d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay return 1; 88d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay } 89d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay if (argc >= 6) 90d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay frames = atoi(argv[5]); 91971523410fd2235e13c617b6a1569f70486258d7Dave Airlie else 92971523410fd2235e13c617b6a1569f70486258d7Dave Airlie frames = INT_MAX; 93d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay 94d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay printf("Input size: %dx%d\n", width, height); 95d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay printf("Target size: %dx%d, Frames: ", target_width, target_height); 96971523410fd2235e13c617b6a1569f70486258d7Dave Airlie if (frames == INT_MAX) 97971523410fd2235e13c617b6a1569f70486258d7Dave Airlie printf("All\n"); 98d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay else 99d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay printf("%d\n", frames); 100971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 101971523410fd2235e13c617b6a1569f70486258d7Dave Airlie inbuf = (uint8_t *)malloc(width * height * 3 / 2); 102971523410fd2235e13c617b6a1569f70486258d7Dave Airlie outbuf = (uint8_t *)malloc(target_width * target_height * 3 / 2); 103971523410fd2235e13c617b6a1569f70486258d7Dave Airlie inbuf_u = inbuf + width * height; 104971523410fd2235e13c617b6a1569f70486258d7Dave Airlie inbuf_v = inbuf_u + width * height / 4; 105971523410fd2235e13c617b6a1569f70486258d7Dave Airlie outbuf_u = outbuf + target_width * target_height; 106d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay outbuf_v = outbuf_u + target_width * target_height / 4; 107d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay f = 0; 108d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay while (f < frames) { 109d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay if (fread(inbuf, width * height * 3 / 2, 1, fpin) != 1) break; 110d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay vp9_resize_frame420(inbuf, width, inbuf_u, inbuf_v, width / 2, height, 111971523410fd2235e13c617b6a1569f70486258d7Dave Airlie width, outbuf, target_width, outbuf_u, outbuf_v, 112971523410fd2235e13c617b6a1569f70486258d7Dave Airlie target_width / 2, target_height, target_width); 113971523410fd2235e13c617b6a1569f70486258d7Dave Airlie fwrite(outbuf, target_width * target_height * 3 / 2, 1, fpout); 114d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay f++; 115d74d7cc0ff517c67c3f2f55a1e625b04c4001591Jacob Lifshay } 116971523410fd2235e13c617b6a1569f70486258d7Dave Airlie printf("%d frames processed\n", f); 117971523410fd2235e13c617b6a1569f70486258d7Dave Airlie fclose(fpin); 118971523410fd2235e13c617b6a1569f70486258d7Dave Airlie fclose(fpout); 119971523410fd2235e13c617b6a1569f70486258d7Dave Airlie 120971523410fd2235e13c617b6a1569f70486258d7Dave Airlie free(inbuf); 121971523410fd2235e13c617b6a1569f70486258d7Dave Airlie free(outbuf); 122971523410fd2235e13c617b6a1569f70486258d7Dave Airlie return 0; 123971523410fd2235e13c617b6a1569f70486258d7Dave Airlie} 124971523410fd2235e13c617b6a1569f70486258d7Dave Airlie