2 * Generate a synthetic YUV video sequence suitable for codec testing.
4 * copyright (c) Sebastien Bechet <s.bechet@av7.net>
6 * This file is part of FFmpeg.
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.
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.
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
29 #define FIXP (1 << 16)
30 #define MY_PI 205887 // (M_PI * FIX)
32 static int64_t int_pow(int64_t a
, int p
)
44 static int64_t int_sin(int64_t a
)
47 a
= MY_PI
- a
; // 0..inf
48 a
%= 2 * MY_PI
; // 0..2PI
50 if (a
>= MY_PI
* 3 / 2)
51 a
-= 2 * MY_PI
; // -PI / 2 .. 3PI / 2
53 a
= MY_PI
- a
; // -PI / 2 .. PI / 2
55 return a
- int_pow(a
, 3) / 6 + int_pow(a
, 5) / 120 - int_pow(a
, 7) / 5040;
58 static unsigned char tab_r
[256 * 256];
59 static unsigned char tab_g
[256 * 256];
60 static unsigned char tab_b
[256 * 256];
62 static int h_cos
[360];
63 static int h_sin
[360];
65 static int ipol(uint8_t *src
, int x
, int y
)
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;
78 return (((1 << 16) - frac_y
) * s0
+ frac_y
* s1
) >> 24;
81 static void gen_image(int num
, int w
, int h
)
83 const int c
= h_cos
[num
% 360];
84 const int s
= h_sin
[num
% 360];
86 const int xi
= -(w
/ 2) * c
;
87 const int yi
= (w
/ 2) * s
;
89 const int xj
= -(h
/ 2) * s
;
90 const int yj
= -(h
/ 2) * c
;
97 for (j
= 0; j
< h
; j
++) {
98 x
= xprime
+ xi
+ FIXP
* w
/ 2;
101 y
= yprime
+ yi
+ FIXP
* h
/ 2;
104 for (i
= 0; i
< w
; i
++) {
118 static int init_demo(const char *filename
)
127 input_file
= fopen(filename
, "rb");
133 if (fread(line
, 1, 15, input_file
) != 15)
135 for (i
= 0; i
< H
; i
++) {
136 if (fread(line
, 1, 3 * W
, input_file
) != 3 * W
)
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];
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
;
157 int main(int argc
, char **argv
)
164 printf("usage: %s image.pnm file|dir\n"
165 "generate a test video stream\n", argv
[0]);
169 if (!freopen(argv
[2], "wb", stdout
))
175 rgb_tab
= malloc(w
* h
* 3);
180 if (init_demo(argv
[1]))
183 for (i
= 0; i
< DEFAULT_NB_PICT
; i
++) {
186 snprintf(buf
, sizeof(buf
), "%s%02d.pgm", argv
[2], i
);
187 pgmyuv_save(buf
, w
, h
, rgb_tab
);
189 pgmyuv_save(NULL
, w
, h
, rgb_tab
);