1/* 2 * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> 3 * 4 * This file is part of Libav. 5 * 6 * Libav 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. 10 * 11 * Libav 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. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with Libav; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#include <stdio.h> 22#include <string.h> /* for memset() */ 23#include <unistd.h> 24#include <stdlib.h> 25#include <inttypes.h> 26 27#include "swscale.h" 28#include "rgb2rgb.h" 29 30#define SIZE 1000 31#define srcByte 0x55 32#define dstByte 0xBB 33 34#define FUNC(s, d, n) { s, d, #n, n } 35 36int main(int argc, char **argv) 37{ 38 int i, funcNum; 39 uint8_t *srcBuffer = av_malloc(SIZE); 40 uint8_t *dstBuffer = av_malloc(SIZE); 41 int failedNum = 0; 42 int passedNum = 0; 43 44 if (!srcBuffer || !dstBuffer) 45 return -1; 46 47 av_log(NULL, AV_LOG_INFO, "memory corruption test ...\n"); 48 sws_rgb2rgb_init(); 49 50 for (funcNum = 0; ; funcNum++) { 51 struct func_info_s { 52 int src_bpp; 53 int dst_bpp; 54 const char *name; 55 void (*func)(const uint8_t *src, uint8_t *dst, int src_size); 56 } func_info[] = { 57 FUNC(2, 2, rgb15to16), 58 FUNC(2, 3, rgb15to24), 59 FUNC(2, 4, rgb15to32), 60 FUNC(2, 3, rgb16to24), 61 FUNC(2, 4, rgb16to32), 62 FUNC(3, 2, rgb24to15), 63 FUNC(3, 2, rgb24to16), 64 FUNC(3, 4, rgb24to32), 65 FUNC(4, 2, rgb32to15), 66 FUNC(4, 2, rgb32to16), 67 FUNC(4, 3, rgb32to24), 68 FUNC(2, 2, rgb16to15), 69 FUNC(2, 2, rgb15tobgr15), 70 FUNC(2, 2, rgb15tobgr16), 71 FUNC(2, 3, rgb15tobgr24), 72 FUNC(2, 4, rgb15tobgr32), 73 FUNC(2, 2, rgb16tobgr15), 74 FUNC(2, 2, rgb16tobgr16), 75 FUNC(2, 3, rgb16tobgr24), 76 FUNC(2, 4, rgb16tobgr32), 77 FUNC(3, 2, rgb24tobgr15), 78 FUNC(3, 2, rgb24tobgr16), 79 FUNC(3, 3, rgb24tobgr24), 80 FUNC(3, 4, rgb24tobgr32), 81 FUNC(4, 2, rgb32tobgr15), 82 FUNC(4, 2, rgb32tobgr16), 83 FUNC(4, 3, rgb32tobgr24), 84 FUNC(4, 4, shuffle_bytes_2103), /* rgb32tobgr32 */ 85 FUNC(0, 0, NULL) 86 }; 87 int width; 88 int failed = 0; 89 int srcBpp = 0; 90 int dstBpp = 0; 91 92 if (!func_info[funcNum].func) 93 break; 94 95 av_log(NULL, AV_LOG_INFO, "."); 96 memset(srcBuffer, srcByte, SIZE); 97 98 for (width = 63; width > 0; width--) { 99 int dstOffset; 100 for (dstOffset = 128; dstOffset < 196; dstOffset += 4) { 101 int srcOffset; 102 memset(dstBuffer, dstByte, SIZE); 103 104 for (srcOffset = 128; srcOffset < 196; srcOffset += 4) { 105 uint8_t *src = srcBuffer + srcOffset; 106 uint8_t *dst = dstBuffer + dstOffset; 107 const char *name = NULL; 108 109 // don't fill the screen with shit ... 110 if (failed) 111 break; 112 113 srcBpp = func_info[funcNum].src_bpp; 114 dstBpp = func_info[funcNum].dst_bpp; 115 name = func_info[funcNum].name; 116 117 func_info[funcNum].func(src, dst, width * srcBpp); 118 119 if (!srcBpp) 120 break; 121 122 for (i = 0; i < SIZE; i++) { 123 if (srcBuffer[i] != srcByte) { 124 av_log(NULL, AV_LOG_INFO, 125 "src damaged at %d w:%d src:%d dst:%d %s\n", 126 i, width, srcOffset, dstOffset, name); 127 failed = 1; 128 break; 129 } 130 } 131 for (i = 0; i < dstOffset; i++) { 132 if (dstBuffer[i] != dstByte) { 133 av_log(NULL, AV_LOG_INFO, 134 "dst damaged at %d w:%d src:%d dst:%d %s\n", 135 i, width, srcOffset, dstOffset, name); 136 failed = 1; 137 break; 138 } 139 } 140 for (i = dstOffset + width * dstBpp; i < SIZE; i++) { 141 if (dstBuffer[i] != dstByte) { 142 av_log(NULL, AV_LOG_INFO, 143 "dst damaged at %d w:%d src:%d dst:%d %s\n", 144 i, width, srcOffset, dstOffset, name); 145 failed = 1; 146 break; 147 } 148 } 149 } 150 } 151 } 152 if (failed) 153 failedNum++; 154 else if (srcBpp) 155 passedNum++; 156 } 157 158 av_log(NULL, AV_LOG_INFO, 159 "\n%d converters passed, %d converters randomly overwrote memory\n", 160 passedNum, failedNum); 161 return failedNum; 162} 163