2 * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at>
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include <string.h> /* for memset() */
28 #include "libavutil/mem.h"
34 #define FUNC(s, d, n) { s, d, #n, n }
36 int main(int argc
, char **argv
)
39 uint8_t *srcBuffer
= av_malloc(SIZE
);
40 uint8_t *dstBuffer
= av_malloc(SIZE
);
44 if (!srcBuffer
|| !dstBuffer
)
47 av_log(NULL
, AV_LOG_INFO
, "memory corruption test ...\n");
50 for (funcNum
= 0; ; funcNum
++) {
55 void (*func
)(const uint8_t *src
, uint8_t *dst
, int src_size
);
57 FUNC(2, 2, rgb12to15
),
58 FUNC(2, 2, rgb15to16
),
59 FUNC(2, 3, rgb15to24
),
60 FUNC(2, 4, rgb15to32
),
61 FUNC(2, 3, rgb16to24
),
62 FUNC(2, 4, rgb16to32
),
63 FUNC(3, 2, rgb24to15
),
64 FUNC(3, 2, rgb24to16
),
65 FUNC(3, 4, rgb24to32
),
66 FUNC(4, 2, rgb32to15
),
67 FUNC(4, 2, rgb32to16
),
68 FUNC(4, 3, rgb32to24
),
69 FUNC(2, 2, rgb16to15
),
70 FUNC(2, 2, rgb12tobgr12
),
71 FUNC(2, 2, rgb15tobgr15
),
72 FUNC(2, 2, rgb15tobgr16
),
73 FUNC(2, 3, rgb15tobgr24
),
74 FUNC(2, 4, rgb15tobgr32
),
75 FUNC(2, 2, rgb16tobgr15
),
76 FUNC(2, 2, rgb16tobgr16
),
77 FUNC(2, 3, rgb16tobgr24
),
78 FUNC(2, 4, rgb16tobgr32
),
79 FUNC(3, 2, rgb24tobgr15
),
80 FUNC(3, 2, rgb24tobgr16
),
81 FUNC(3, 3, rgb24tobgr24
),
82 FUNC(3, 4, rgb24tobgr32
),
83 FUNC(4, 2, rgb32tobgr15
),
84 FUNC(4, 2, rgb32tobgr16
),
85 FUNC(4, 3, rgb32tobgr24
),
86 FUNC(4, 4, shuffle_bytes_2103
), /* rgb32tobgr32 */
87 FUNC(6, 6, rgb48tobgr48_nobswap
),
88 FUNC(6, 6, rgb48tobgr48_bswap
),
89 FUNC(8, 6, rgb64to48_nobswap
),
90 FUNC(8, 6, rgb64to48_bswap
),
91 FUNC(8, 6, rgb64tobgr48_nobswap
),
92 FUNC(8, 6, rgb64tobgr48_bswap
),
100 if (!func_info
[funcNum
].func
)
103 av_log(NULL
, AV_LOG_INFO
, ".");
104 memset(srcBuffer
, srcByte
, SIZE
);
106 for (width
= 63; width
> 0; width
--) {
108 for (dstOffset
= 128; dstOffset
< 196; dstOffset
+= 4) {
110 memset(dstBuffer
, dstByte
, SIZE
);
112 for (srcOffset
= 128; srcOffset
< 196; srcOffset
+= 4) {
113 uint8_t *src
= srcBuffer
+ srcOffset
;
114 uint8_t *dst
= dstBuffer
+ dstOffset
;
115 const char *name
= NULL
;
117 // don't fill the screen with shit ...
121 srcBpp
= func_info
[funcNum
].src_bpp
;
122 dstBpp
= func_info
[funcNum
].dst_bpp
;
123 name
= func_info
[funcNum
].name
;
125 func_info
[funcNum
].func(src
, dst
, width
* srcBpp
);
130 for (i
= 0; i
< SIZE
; i
++) {
131 if (srcBuffer
[i
] != srcByte
) {
132 av_log(NULL
, AV_LOG_INFO
,
133 "src damaged at %d w:%d src:%d dst:%d %s\n",
134 i
, width
, srcOffset
, dstOffset
, name
);
139 for (i
= 0; i
< dstOffset
; i
++) {
140 if (dstBuffer
[i
] != dstByte
) {
141 av_log(NULL
, AV_LOG_INFO
,
142 "dst damaged at %d w:%d src:%d dst:%d %s\n",
143 i
, width
, srcOffset
, dstOffset
, name
);
148 for (i
= dstOffset
+ width
* dstBpp
; i
< SIZE
; i
++) {
149 if (dstBuffer
[i
] != dstByte
) {
150 av_log(NULL
, AV_LOG_INFO
,
151 "dst damaged at %d w:%d src:%d dst:%d %s\n",
152 i
, width
, srcOffset
, dstOffset
, name
);
166 av_log(NULL
, AV_LOG_INFO
,
167 "\n%d converters passed, %d converters randomly overwrote memory\n",
168 passedNum
, failedNum
);