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
60 };
61
62 const char *
usage =
"floatimg_cmp -pixel_format <pix_fmt> -size <image_size> -ref <testfile>\n";
63
64 int main(
int argc,
char **argv)
65 {
69 uint8_t *ptr;
71
74 int rgbStride[4];
75
77 int dstStride[4];
78
79 int i, x, y,
p,
size, count;
80 int res = -1;
84
85 double sum;
86 float minimum, maximum,
diff;
87
91
92 for (
i = 1;
i < argc;
i += 2) {
93 if (argv[
i][0] !=
'-' ||
i + 1 == argc)
94 goto bad_option;
95 if (!strcmp(argv[
i],
"-ref")) {
96 fp = fopen(argv[
i + 1],
"rb");
97 if (!fp) {
98 fprintf(stderr,
"could not open '%s'\n", argv[
i + 1]);
99 goto end;
100 }
101 }
else if (!strcmp(argv[
i],
"-size")) {
103 if (res < 0) {
104 fprintf(stderr,
"invalid video size %s\n", argv[
i + 1]);
105 goto end;
106 }
107 }
else if (!strcmp(argv[
i],
"-pixel_format")) {
110 fprintf(stderr,
"invalid pixel format %s\n", argv[
i + 1]);
111 goto end;
112 }
113 } else {
114 bad_option:
115 fprintf(stderr,
"%s",
usage);
116 fprintf(stderr,
"bad option or argument missing (%s)\n", argv[
i]);
117 goto end;
118 };
119 }
120
121 if (!fp) {
125 }
126
127 if (
w <= 0 ||
h <= 0) {
128 fprintf(stderr,
"%s",
usage);
129 fprintf(stderr, "invalid -video_size\n");
130 goto end;
131 }
132
134 fprintf(stderr,
"%s",
usage);
135 fprintf(stderr, "invalid input pixel format\n");
136 goto end;
137 }
138
141 fprintf(stderr, "input pixel format not floating point.\n");
142 goto end;
143 }
144
146 if (res < 0) {
147 fprintf(stderr, "av_image_fill_linesizes failed\n");
148 goto end;
149 }
150 for (
p = 0;
p < 4;
p++) {
151 rgbStride[
p] =
FFALIGN(rgbStride[
p], 16);
155 }
156 if (rgbStride[
p] && (!rgbIn[
p] || !rgbOut[
p])) {
157 goto end;
158 }
159 }
160
163 if (fp) {
164 fseek(fp, 0, SEEK_SET);
165 for (
p = 0;
p < 4;
p++) {
167 continue;
168
170 for (y = 0; y <
h; y++) {
171 size = fread(ptr, 1,
w*4, fp);
173 fprintf(stderr,
"read error: %d\n",
size);
174 goto end;
175 }
177 }
178 }
179 } else {
180 // fill src with random values between 0.0 - 1.0
182 for (
p = 0;
p < 4;
p++) {
184 continue;
185
186 for (y = 0; y <
h; y++) {
187 in = (uint32_t*)(rgbIn[
p] + y * rgbStride[
p]);
188 for (x = 0; x <
w; x++) {
191 }
192 }
193 }
194 }
195
196 // setup intermediate image
197 for (
p = 0;
p < 4;
p++) {
199 }
200
202 if (res < 0) {
203 fprintf(stderr, "av_image_fill_linesizes failed\n");
204 goto end;
205 }
206 for (
p = 0;
p < 4;
p++) {
207 dstStride[
p] =
FFALIGN(dstStride[
p], 16);
210 }
211 if (dstStride[
p] && !
dst[
p]) {
212 goto end;
213 }
214 }
215
216 // srcFormat -> dstFormat
221 goto end;
222 }
223
224 res =
sws_scale(
sws, (
const uint8_t *
const *)rgbIn, rgbStride, 0,
h,
dst, dstStride);
225 if (res < 0 || res !=
h) {
226 fprintf(stderr, "sws_scale failed\n");
227 res = -1;
228 goto end;
229 }
231
232 // dstFormat -> srcFormat
237 goto end;
238 }
239
240 res =
sws_scale(
sws, (
const uint8_t *
const *)
dst, dstStride, 0,
h, rgbOut, rgbStride);
241 if (res < 0 || res !=
h) {
242 fprintf(stderr, "sws_scale failed\n");
243 res = -1;
244 goto end;
245 }
248
249 minimum = FLT_MAX;
250 maximum = -FLT_MAX;
251 count = 0;
252 sum = 0.0;
253
254 for (
p = 0;
p < 4;
p++) {
256 continue;
257
258 for (y = 0; y <
h; y++) {
259 in = (uint32_t*)(rgbIn[
p] + y * rgbStride[
p]);
260 out = (uint32_t*)(rgbOut[
p] + y * rgbStride[
p]);
261 for (x = 0; x <
w; x++) {
265 } else {
268 }
269
274
275 count++;
276 in++;
278 }
279 }
280 }
281
283 fprintf(stdout, "avg diff: %f\nmin diff: %f\nmax diff: %f\n", sum / count, minimum, maximum);
284 res = 0;
285 }
286
287 end:
289 for (
p = 0;
p < 4;
p++) {
293 }
294 if (fp)
295 fclose(fp);
296
297 return res;
298 }
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.
void sws_freeContext(SwsContext *swsContext)
Free the swscaler context swsContext.
@ SWS_BILINEAR
bilinear filtering
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ 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...
@ AV_PIX_FMT_YUV444P10LE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
@ AV_PIX_FMT_GBRP10MSBLE
planar GBR 4:4:4 30bpp, lowest bits zero, 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_GBRP12MSBLE
planar GBR 4:4:4 36bpp, lowest bits zero, little-endian
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
@ AV_PIX_FMT_YUV444P10MSBLE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian
Context structure for the Lagged Fibonacci PRNG.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
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...
static SwsContext * sws[3]
#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
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.
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.
int attribute_align_arg sws_scale(SwsContext *sws, 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_YUV444P9LE
planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
@ 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_YUV444P12MSBLE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
Main external API structure.
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 Wed Nov 19 2025 19:23:33 for FFmpeg by
doxygen
1.8.17