FFmpeg: libswscale/tests/floatimg_cmp.c Source File
Go to the documentation of this file. 1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <math.h>
23 #include <inttypes.h>
25
34
36
39
58 };
59
60 const char *
usage =
"floatimg_cmp -pixel_format <pix_fmt> -size <image_size> -ref <testfile>\n";
61
62 int main(
int argc,
char **argv)
63 {
67 uint8_t *ptr;
69
72 int rgbStride[4];
73
75 int dstStride[4];
76
77 int i, x, y, p,
size, count;
78 int res = -1;
82
83 double sum;
84 float minimum, maximum,
diff;
85
89
90 for (
i = 1;
i < argc;
i += 2) {
91 if (argv[
i][0] !=
'-' ||
i + 1 == argc)
92 goto bad_option;
93 if (!strcmp(argv[
i],
"-ref")) {
94 fp = fopen(argv[
i + 1],
"rb");
95 if (!fp) {
96 fprintf(stderr,
"could not open '%s'\n", argv[
i + 1]);
97 goto end;
98 }
99 }
else if (!strcmp(argv[
i],
"-size")) {
101 if (res < 0) {
102 fprintf(stderr,
"invalid video size %s\n", argv[
i + 1]);
103 goto end;
104 }
105 }
else if (!strcmp(argv[
i],
"-pixel_format")) {
108 fprintf(stderr,
"invalid pixel format %s\n", argv[
i + 1]);
109 goto end;
110 }
111 } else {
112 bad_option:
113 fprintf(stderr,
"%s",
usage);
114 fprintf(stderr,
"bad option or argument missing (%s)\n", argv[
i]);
115 goto end;
116 };
117 }
118
119 if (!fp) {
123 }
124
125 if (
w <= 0 ||
h <= 0) {
126 fprintf(stderr,
"%s",
usage);
127 fprintf(stderr, "invalid -video_size\n");
128 goto end;
129 }
130
132 fprintf(stderr,
"%s",
usage);
133 fprintf(stderr, "invalid input pixel format\n");
134 goto end;
135 }
136
139 fprintf(stderr, "input pixel format not floating point.\n");
140 goto end;
141 }
142
144 if (res < 0) {
145 fprintf(stderr, "av_image_fill_linesizes failed\n");
146 goto end;
147 }
148 for (p = 0; p < 4; p++) {
149 rgbStride[p] =
FFALIGN(rgbStride[p], 16);
150 if (rgbStride[p]) {
153 }
154 if (rgbStride[p] && (!rgbIn[p] || !rgbOut[p])) {
155 goto end;
156 }
157 }
158
161 if (fp) {
162 fseek(fp, 0, SEEK_SET);
163 for (p = 0; p < 4; p++) {
164 if (!rgbStride[p])
165 continue;
166
167 ptr = rgbIn[p];
168 for (y = 0; y <
h; y++) {
169 size = fread(ptr, 1,
w*4, fp);
171 fprintf(stderr,
"read error: %d\n",
size);
172 goto end;
173 }
174 ptr += rgbStride[p];
175 }
176 }
177 } else {
178 // fill src with random values between 0.0 - 1.0
180 for (p = 0; p < 4; p++) {
181 if (!rgbStride[p])
182 continue;
183
184 for (y = 0; y <
h; y++) {
185 in = (uint32_t*)(rgbIn[p] + y * rgbStride[p]);
186 for (x = 0; x <
w; x++) {
189 }
190 }
191 }
192 }
193
194 // setup intermediate image
195 for (p = 0; p < 4; p++) {
197 }
198
200 if (res < 0) {
201 fprintf(stderr, "av_image_fill_linesizes failed\n");
202 goto end;
203 }
204 for (p = 0; p < 4; p++) {
205 dstStride[p] =
FFALIGN(dstStride[p], 16);
206 if (dstStride[p]) {
208 }
209 if (dstStride[p] && !
dst[p]) {
210 goto end;
211 }
212 }
213
214 // srcFormat -> dstFormat
217 if (!sws) {
219 goto end;
220 }
221
222 res =
sws_scale(sws, (
const uint8_t *
const *)rgbIn, rgbStride, 0,
h,
dst, dstStride);
223 if (res < 0 || res !=
h) {
224 fprintf(stderr, "sws_scale failed\n");
225 res = -1;
226 goto end;
227 }
229
230 // dstFormat -> srcFormat
233 if(!sws) {
235 goto end;
236 }
237
238 res =
sws_scale(sws, (
const uint8_t *
const *)
dst, dstStride, 0,
h, rgbOut, rgbStride);
239 if (res < 0 || res !=
h) {
240 fprintf(stderr, "sws_scale failed\n");
241 res = -1;
242 goto end;
243 }
246
247 minimum = FLT_MAX;
248 maximum = -FLT_MAX;
249 count = 0;
250 sum = 0.0;
251
252 for (p = 0; p < 4; p++) {
253 if (!rgbStride[p])
254 continue;
255
256 for (y = 0; y <
h; y++) {
257 in = (uint32_t*)(rgbIn[p] + y * rgbStride[p]);
258 out = (uint32_t*)(rgbOut[p] + y * rgbStride[p]);
259 for (x = 0; x <
w; x++) {
263 } else {
266 }
267
272
273 count++;
274 in++;
276 }
277 }
278 }
279
281 fprintf(stdout, "avg diff: %f\nmin diff: %f\nmax diff: %f\n", sum / count, minimum, maximum);
282 res = 0;
283 }
284
285 end:
287 for (p = 0; p < 4; p++) {
291 }
292 if (fp)
293 fclose(fp);
294
295 return res;
296 }
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_BGR48LE
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as lit...
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
int main(int argc, char **argv)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
int attribute_align_arg sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
swscale wrapper, so we don't need to export the SwsContext.
@ AV_PIX_FMT_YUV444P16LE
planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
@ AV_PIX_FMT_GBRAP12LE
planar GBR 4:4:4:4 48bpp, little-endian
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
static __device__ float fabsf(float a)
@ AV_PIX_FMT_YUV444P12LE
planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
@ AV_PIX_FMT_YUV444P14LE
planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
#define FF_ARRAY_ELEMS(a)
int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width)
Fill plane linesizes for an image with pixel format pix_fmt and width width.
@ AV_PIX_FMT_GBRP16LE
planar GBR 4:4:4 48bpp, little-endian
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
@ AV_PIX_FMT_GBRP12LE
planar GBR 4:4:4 36bpp, little-endian
@ AV_PIX_FMT_GBRP10LE
planar GBR 4:4:4 30bpp, little-endian
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
enum AVPixelFormat dstFormat
Destination pixel format.
@ AV_PIX_FMT_YUV444P10LE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
@ AV_PIX_FMT_RGB48LE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
@ AV_PIX_FMT_RGBA64LE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Context structure for the Lagged Fibonacci PRNG.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
struct SwsContext * sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, enum AVPixelFormat dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)
Allocate and return an SwsContext.
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
@ AV_PIX_FMT_GBRP9LE
planar GBR 4:4:4 27bpp, little-endian
@ AV_PIX_FMT_GBRAP10LE
planar GBR 4:4:4:4 40bpp, little-endian
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str)
Parse str and put in width_ptr and height_ptr the detected values.
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
@ AV_PIX_FMT_BGRA64LE
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
#define i(width, name, range_min, range_max)
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
@ AV_PIX_FMT_GBRPF32LE
IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian.
@ AV_PIX_FMT_GBRAP16LE
planar GBRA 4:4:4:4 64bpp, little-endian
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
void sws_freeContext(struct SwsContext *swsContext)
Free the swscaler context swsContext.
@ AV_PIX_FMT_YUV444P9LE
planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
@ AV_PIX_FMT_GBRP14LE
planar GBR 4:4:4 42bpp, little-endian
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
static enum AVPixelFormat pix_fmts[]
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Generated on Fri Aug 22 2025 13:59:45 for FFmpeg by
doxygen
1.8.17