rotozoom.c
Go to the documentation of this file.
1 /*
2  * Generate a synthetic YUV video sequence suitable for codec testing.
3  *
4  * copyright (c) Sebastien Bechet <s.bechet@av7.net>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <inttypes.h>
26 
27 #include "utils.c"
28 
29 #define FIXP (1 << 16)
30 #define MY_PI 205887 // (M_PI * FIX)
31 
32 static int64_t int_pow(int64_t a, int p)
33 {
34  int64_t v = FIXP;
35 
36  for (; p; p--) {
37  v *= a;
38  v /= FIXP;
39  }
40 
41  return v;
42 }
43 
44 static int64_t int_sin(int64_t a)
45 {
46  if (a < 0)
47  a = MY_PI - a; // 0..inf
48  a %= 2 * MY_PI; // 0..2PI
49 
50  if (a >= MY_PI * 3 / 2)
51  a -= 2 * MY_PI; // -PI / 2 .. 3PI / 2
52  if (a >= MY_PI / 2)
53  a = MY_PI - a; // -PI / 2 .. PI / 2
54 
55  return a - int_pow(a, 3) / 6 + int_pow(a, 5) / 120 - int_pow(a, 7) / 5040;
56 }
57 
58 static unsigned char tab_r[256 * 256];
59 static unsigned char tab_g[256 * 256];
60 static unsigned char tab_b[256 * 256];
61 
62 static int h_cos[360];
63 static int h_sin[360];
64 
65 static int ipol(uint8_t *src, int x, int y)
66 {
67  int int_x = x >> 16;
68  int int_y = y >> 16;
69  int frac_x = x & 0xFFFF;
70  int frac_y = y & 0xFFFF;
71  int s00 = src[( int_x & 255) + 256 * ( int_y & 255)];
72  int s01 = src[((int_x + 1) & 255) + 256 * ( int_y & 255)];
73  int s10 = src[( int_x & 255) + 256 * ((int_y + 1) & 255)];
74  int s11 = src[((int_x + 1) & 255) + 256 * ((int_y + 1) & 255)];
75  int s0 = (((1 << 16) - frac_x) * s00 + frac_x * s01) >> 8;
76  int s1 = (((1 << 16) - frac_x) * s10 + frac_x * s11) >> 8;
77 
78  return (((1 << 16) - frac_y) * s0 + frac_y * s1) >> 24;
79 }
80 
81 static void gen_image(int num, int w, int h)
82 {
83  const int c = h_cos[num % 360];
84  const int s = h_sin[num % 360];
85 
86  const int xi = -(w / 2) * c;
87  const int yi = (w / 2) * s;
88 
89  const int xj = -(h / 2) * s;
90  const int yj = -(h / 2) * c;
91  int i, j;
92 
93  int x, y;
94  int xprime = xj;
95  int yprime = yj;
96 
97  for (j = 0; j < h; j++) {
98  x = xprime + xi + FIXP * w / 2;
99  xprime += s;
100 
101  y = yprime + yi + FIXP * h / 2;
102  yprime += c;
103 
104  for (i = 0; i < w; i++) {
105  x += c;
106  y -= s;
107  put_pixel(i, j,
108  ipol(tab_r, x, y),
109  ipol(tab_g, x, y),
110  ipol(tab_b, x, y));
111  }
112  }
113 }
114 
115 #define W 256
116 #define H 256
117 
118 static int init_demo(const char *filename)
119 {
120  int i, j;
121  int h;
122  int radian;
123  char line[3 * W];
124 
125  FILE *input_file;
126 
127  input_file = fopen(filename, "rb");
128  if (!input_file) {
129  perror(filename);
130  return 1;
131  }
132 
133  if (fread(line, 1, 15, input_file) != 15)
134  return 1;
135  for (i = 0; i < H; i++) {
136  if (fread(line, 1, 3 * W, input_file) != 3 * W)
137  return 1;
138  for (j = 0; j < W; j++) {
139  tab_r[W * i + j] = line[3 * j ];
140  tab_g[W * i + j] = line[3 * j + 1];
141  tab_b[W * i + j] = line[3 * j + 2];
142  }
143  }
144  fclose(input_file);
145 
146  /* tables sin/cos */
147  for (i = 0; i < 360; i++) {
148  radian = 2 * i * MY_PI / 360;
149  h = 2 * FIXP + int_sin(radian);
150  h_cos[i] = h * int_sin(radian + MY_PI / 2) / 2 / FIXP;
151  h_sin[i] = h * int_sin(radian) / 2 / FIXP;
152  }
153 
154  return 0;
155 }
156 
157 int main(int argc, char **argv)
158 {
159  int w, h, i;
160  char buf[1024];
161  int isdir = 0;
162 
163  if (argc != 3) {
164  printf("usage: %s image.pnm file|dir\n"
165  "generate a test video stream\n", argv[0]);
166  return 1;
167  }
168 
169  if (!freopen(argv[2], "wb", stdout))
170  isdir = 1;
171 
172  w = DEFAULT_WIDTH;
173  h = DEFAULT_HEIGHT;
174 
175  rgb_tab = malloc(w * h * 3);
176  wrap = w * 3;
177  width = w;
178  height = h;
179 
180  if (init_demo(argv[1]))
181  return 1;
182 
183  for (i = 0; i < DEFAULT_NB_PICT; i++) {
184  gen_image(i, w, h);
185  if (isdir) {
186  snprintf(buf, sizeof(buf), "%s%02d.pgm", argv[2], i);
187  pgmyuv_save(buf, w, h, rgb_tab);
188  } else {
189  pgmyuv_save(NULL, w, h, rgb_tab);
190  }
191  }
192 
193  free(rgb_tab);
194  return 0;
195 }
static unsigned char tab_g[256 *256]
Definition: rotozoom.c:59
float v
const char * s
Definition: avisynth_c.h:668
#define MY_PI
Definition: rotozoom.c:30
#define FIXP
Definition: rotozoom.c:29
static int64_t int_pow(int64_t a, int p)
Definition: rotozoom.c:32
#define wrap(func)
Definition: w64xmmtest.h:70
static void put_pixel(int x, int y, int r, int g, int b)
Definition: tests/utils.c:160
output residual component w
static unsigned char tab_b[256 *256]
Definition: rotozoom.c:60
#define H
Definition: rotozoom.c:116
static int64_t int_sin(int64_t a)
Definition: rotozoom.c:44
static int h_sin[360]
Definition: rotozoom.c:63
static unsigned char * rgb_tab
Definition: tests/utils.c:157
uint8_t
#define DEFAULT_NB_PICT
Definition: tests/utils.c:104
Discrete Time axis x
#define DEFAULT_WIDTH
Definition: tests/utils.c:102
#define s0
Definition: regdef.h:37
Definition: graph2dot.c:48
static void pgmyuv_save(const char *filename, int w, int h, unsigned char *rgb_tab)
Definition: tests/utils.c:106
static unsigned char tab_r[256 *256]
Definition: rotozoom.c:58
#define W
Definition: rotozoom.c:115
NULL
Definition: eval.c:55
static int width
Definition: tests/utils.c:158
AVS_Value src
Definition: avisynth_c.h:523
Close file fclose(fid)
int main(int argc, char **argv)
Definition: rotozoom.c:157
void * buf
Definition: avisynth_c.h:594
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
#define DEFAULT_HEIGHT
Definition: tests/utils.c:103
synthesis window for stochastic i
#define s1
Definition: regdef.h:38
#define snprintf
Definition: snprintf.h:34
static int h_cos[360]
Definition: rotozoom.c:62
static double c[64]
function y
Definition: D.m:1
static void gen_image(int num, int w, int h)
Definition: rotozoom.c:81
printf("static const uint8_t my_array[100] = {\n")
static int init_demo(const char *filename)
Definition: rotozoom.c:118
static int ipol(uint8_t *src, int x, int y)
Definition: rotozoom.c:65
MUSIC TECHNOLOGY GROUP UNIVERSITAT POMPEU FABRA Free Non Commercial Binary License Agreement UNIVERSITAT POMPEU OR INDICATING ACCEPTANCE BY SELECTING THE ACCEPT BUTTON ON ANY DOWNLOAD OR INSTALL YOU ACCEPT THE TERMS OF THE LICENSE SUMMARY TABLE Software MELODIA Melody Extraction vamp plug in Licensor Music Technology Group Universitat Pompeu Plaça de la Spain Permitted purposes Non commercial internal research and validation and educational purposes only All commercial uses in a production either internal or are prohibited by this license and require an additional commercial exploitation license TERMS AND CONDITIONS SOFTWARE Software means the software programs identified herein in binary any other machine readable any updates or error corrections provided by and any user programming guides and other documentation provided to you by UPF under this Agreement LICENSE Subject to the terms and conditions of this UPF grants you a royalty free