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