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