Libav 0.7.1
|
00001 /* 00002 * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> 00003 * 00004 * This file is part of Libav. 00005 * 00006 * Libav is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * Libav is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with Libav; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00019 */ 00020 00021 #include <stdio.h> 00022 #include <string.h> /* for memset() */ 00023 #include <unistd.h> 00024 #include <stdlib.h> 00025 #include <inttypes.h> 00026 00027 #include "swscale.h" 00028 #include "rgb2rgb.h" 00029 00030 #define SIZE 1000 00031 #define srcByte 0x55 00032 #define dstByte 0xBB 00033 00034 #define FUNC(s,d,n) {s,d,#n,n} 00035 00036 int main(int argc, char **argv) 00037 { 00038 int i, funcNum; 00039 uint8_t *srcBuffer= (uint8_t*)av_malloc(SIZE); 00040 uint8_t *dstBuffer= (uint8_t*)av_malloc(SIZE); 00041 int failedNum=0; 00042 int passedNum=0; 00043 00044 if (!srcBuffer || !dstBuffer) 00045 return -1; 00046 00047 av_log(NULL, AV_LOG_INFO, "memory corruption test ...\n"); 00048 sws_rgb2rgb_init(); 00049 00050 for(funcNum=0; ; funcNum++) { 00051 struct func_info_s { 00052 int src_bpp; 00053 int dst_bpp; 00054 const char *name; 00055 void (*func)(const uint8_t *src, uint8_t *dst, int src_size); 00056 } func_info[] = { 00057 FUNC(2, 2, rgb15to16), 00058 FUNC(2, 3, rgb15to24), 00059 FUNC(2, 4, rgb15to32), 00060 FUNC(2, 3, rgb16to24), 00061 FUNC(2, 4, rgb16to32), 00062 FUNC(3, 2, rgb24to15), 00063 FUNC(3, 2, rgb24to16), 00064 FUNC(3, 4, rgb24to32), 00065 FUNC(4, 2, rgb32to15), 00066 FUNC(4, 2, rgb32to16), 00067 FUNC(4, 3, rgb32to24), 00068 FUNC(2, 2, rgb16to15), 00069 FUNC(2, 2, rgb15tobgr15), 00070 FUNC(2, 2, rgb15tobgr16), 00071 FUNC(2, 3, rgb15tobgr24), 00072 FUNC(2, 4, rgb15tobgr32), 00073 FUNC(2, 2, rgb16tobgr15), 00074 FUNC(2, 2, rgb16tobgr16), 00075 FUNC(2, 3, rgb16tobgr24), 00076 FUNC(2, 4, rgb16tobgr32), 00077 FUNC(3, 2, rgb24tobgr15), 00078 FUNC(3, 2, rgb24tobgr16), 00079 FUNC(3, 3, rgb24tobgr24), 00080 FUNC(3, 4, rgb24tobgr32), 00081 FUNC(4, 2, rgb32tobgr15), 00082 FUNC(4, 2, rgb32tobgr16), 00083 FUNC(4, 3, rgb32tobgr24), 00084 FUNC(4, 4, shuffle_bytes_2103), /* rgb32tobgr32 */ 00085 FUNC(0, 0, NULL) 00086 }; 00087 int width; 00088 int failed=0; 00089 int srcBpp=0; 00090 int dstBpp=0; 00091 00092 if (!func_info[funcNum].func) break; 00093 00094 av_log(NULL, AV_LOG_INFO,"."); 00095 memset(srcBuffer, srcByte, SIZE); 00096 00097 for(width=63; width>0; width--) { 00098 int dstOffset; 00099 for(dstOffset=128; dstOffset<196; dstOffset+=4) { 00100 int srcOffset; 00101 memset(dstBuffer, dstByte, SIZE); 00102 00103 for(srcOffset=128; srcOffset<196; srcOffset+=4) { 00104 uint8_t *src= srcBuffer+srcOffset; 00105 uint8_t *dst= dstBuffer+dstOffset; 00106 const char *name=NULL; 00107 00108 if(failed) break; //don't fill the screen with shit ... 00109 00110 srcBpp = func_info[funcNum].src_bpp; 00111 dstBpp = func_info[funcNum].dst_bpp; 00112 name = func_info[funcNum].name; 00113 00114 func_info[funcNum].func(src, dst, width*srcBpp); 00115 00116 if(!srcBpp) break; 00117 00118 for(i=0; i<SIZE; i++) { 00119 if(srcBuffer[i]!=srcByte) { 00120 av_log(NULL, AV_LOG_INFO, "src damaged at %d w:%d src:%d dst:%d %s\n", 00121 i, width, srcOffset, dstOffset, name); 00122 failed=1; 00123 break; 00124 } 00125 } 00126 for(i=0; i<dstOffset; i++) { 00127 if(dstBuffer[i]!=dstByte) { 00128 av_log(NULL, AV_LOG_INFO, "dst damaged at %d w:%d src:%d dst:%d %s\n", 00129 i, width, srcOffset, dstOffset, name); 00130 failed=1; 00131 break; 00132 } 00133 } 00134 for(i=dstOffset + width*dstBpp; i<SIZE; i++) { 00135 if(dstBuffer[i]!=dstByte) { 00136 av_log(NULL, AV_LOG_INFO, "dst damaged at %d w:%d src:%d dst:%d %s\n", 00137 i, width, srcOffset, dstOffset, name); 00138 failed=1; 00139 break; 00140 } 00141 } 00142 } 00143 } 00144 } 00145 if(failed) failedNum++; 00146 else if(srcBpp) passedNum++; 00147 } 00148 00149 av_log(NULL, AV_LOG_INFO, "\n%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum); 00150 return failedNum; 00151 }