yading@11: /* yading@11: * Copyright (C) 2002 Michael Niedermayer yading@11: * yading@11: * This file is part of FFmpeg. yading@11: * yading@11: * FFmpeg is free software; you can redistribute it and/or yading@11: * modify it under the terms of the GNU Lesser General Public yading@11: * License as published by the Free Software Foundation; either yading@11: * version 2.1 of the License, or (at your option) any later version. yading@11: * yading@11: * FFmpeg is distributed in the hope that it will be useful, yading@11: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@11: * Lesser General Public License for more details. yading@11: * yading@11: * You should have received a copy of the GNU Lesser General Public yading@11: * License along with FFmpeg; if not, write to the Free Software yading@11: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@11: */ yading@11: yading@11: #include yading@11: #include /* for memset() */ yading@11: #include yading@11: #include yading@11: yading@11: #include "swscale.h" yading@11: #include "rgb2rgb.h" yading@11: #include "libavutil/mem.h" yading@11: yading@11: #define SIZE 1000 yading@11: #define srcByte 0x55 yading@11: #define dstByte 0xBB yading@11: yading@11: #define FUNC(s, d, n) { s, d, #n, n } yading@11: yading@11: int main(int argc, char **argv) yading@11: { yading@11: int i, funcNum; yading@11: uint8_t *srcBuffer = av_malloc(SIZE); yading@11: uint8_t *dstBuffer = av_malloc(SIZE); yading@11: int failedNum = 0; yading@11: int passedNum = 0; yading@11: yading@11: if (!srcBuffer || !dstBuffer) yading@11: return -1; yading@11: yading@11: av_log(NULL, AV_LOG_INFO, "memory corruption test ...\n"); yading@11: sws_rgb2rgb_init(); yading@11: yading@11: for (funcNum = 0; ; funcNum++) { yading@11: struct func_info_s { yading@11: int src_bpp; yading@11: int dst_bpp; yading@11: const char *name; yading@11: void (*func)(const uint8_t *src, uint8_t *dst, int src_size); yading@11: } func_info[] = { yading@11: FUNC(2, 2, rgb12to15), yading@11: FUNC(2, 2, rgb15to16), yading@11: FUNC(2, 3, rgb15to24), yading@11: FUNC(2, 4, rgb15to32), yading@11: FUNC(2, 3, rgb16to24), yading@11: FUNC(2, 4, rgb16to32), yading@11: FUNC(3, 2, rgb24to15), yading@11: FUNC(3, 2, rgb24to16), yading@11: FUNC(3, 4, rgb24to32), yading@11: FUNC(4, 2, rgb32to15), yading@11: FUNC(4, 2, rgb32to16), yading@11: FUNC(4, 3, rgb32to24), yading@11: FUNC(2, 2, rgb16to15), yading@11: FUNC(2, 2, rgb12tobgr12), yading@11: FUNC(2, 2, rgb15tobgr15), yading@11: FUNC(2, 2, rgb15tobgr16), yading@11: FUNC(2, 3, rgb15tobgr24), yading@11: FUNC(2, 4, rgb15tobgr32), yading@11: FUNC(2, 2, rgb16tobgr15), yading@11: FUNC(2, 2, rgb16tobgr16), yading@11: FUNC(2, 3, rgb16tobgr24), yading@11: FUNC(2, 4, rgb16tobgr32), yading@11: FUNC(3, 2, rgb24tobgr15), yading@11: FUNC(3, 2, rgb24tobgr16), yading@11: FUNC(3, 3, rgb24tobgr24), yading@11: FUNC(3, 4, rgb24tobgr32), yading@11: FUNC(4, 2, rgb32tobgr15), yading@11: FUNC(4, 2, rgb32tobgr16), yading@11: FUNC(4, 3, rgb32tobgr24), yading@11: FUNC(4, 4, shuffle_bytes_2103), /* rgb32tobgr32 */ yading@11: FUNC(6, 6, rgb48tobgr48_nobswap), yading@11: FUNC(6, 6, rgb48tobgr48_bswap), yading@11: FUNC(8, 6, rgb64to48_nobswap), yading@11: FUNC(8, 6, rgb64to48_bswap), yading@11: FUNC(8, 6, rgb64tobgr48_nobswap), yading@11: FUNC(8, 6, rgb64tobgr48_bswap), yading@11: FUNC(0, 0, NULL) yading@11: }; yading@11: int width; yading@11: int failed = 0; yading@11: int srcBpp = 0; yading@11: int dstBpp = 0; yading@11: yading@11: if (!func_info[funcNum].func) yading@11: break; yading@11: yading@11: av_log(NULL, AV_LOG_INFO, "."); yading@11: memset(srcBuffer, srcByte, SIZE); yading@11: yading@11: for (width = 63; width > 0; width--) { yading@11: int dstOffset; yading@11: for (dstOffset = 128; dstOffset < 196; dstOffset += 4) { yading@11: int srcOffset; yading@11: memset(dstBuffer, dstByte, SIZE); yading@11: yading@11: for (srcOffset = 128; srcOffset < 196; srcOffset += 4) { yading@11: uint8_t *src = srcBuffer + srcOffset; yading@11: uint8_t *dst = dstBuffer + dstOffset; yading@11: const char *name = NULL; yading@11: yading@11: // don't fill the screen with shit ... yading@11: if (failed) yading@11: break; yading@11: yading@11: srcBpp = func_info[funcNum].src_bpp; yading@11: dstBpp = func_info[funcNum].dst_bpp; yading@11: name = func_info[funcNum].name; yading@11: yading@11: func_info[funcNum].func(src, dst, width * srcBpp); yading@11: yading@11: if (!srcBpp) yading@11: break; yading@11: yading@11: for (i = 0; i < SIZE; i++) { yading@11: if (srcBuffer[i] != srcByte) { yading@11: av_log(NULL, AV_LOG_INFO, yading@11: "src damaged at %d w:%d src:%d dst:%d %s\n", yading@11: i, width, srcOffset, dstOffset, name); yading@11: failed = 1; yading@11: break; yading@11: } yading@11: } yading@11: for (i = 0; i < dstOffset; i++) { yading@11: if (dstBuffer[i] != dstByte) { yading@11: av_log(NULL, AV_LOG_INFO, yading@11: "dst damaged at %d w:%d src:%d dst:%d %s\n", yading@11: i, width, srcOffset, dstOffset, name); yading@11: failed = 1; yading@11: break; yading@11: } yading@11: } yading@11: for (i = dstOffset + width * dstBpp; i < SIZE; i++) { yading@11: if (dstBuffer[i] != dstByte) { yading@11: av_log(NULL, AV_LOG_INFO, yading@11: "dst damaged at %d w:%d src:%d dst:%d %s\n", yading@11: i, width, srcOffset, dstOffset, name); yading@11: failed = 1; yading@11: break; yading@11: } yading@11: } yading@11: } yading@11: } yading@11: } yading@11: if (failed) yading@11: failedNum++; yading@11: else if (srcBpp) yading@11: passedNum++; yading@11: } yading@11: yading@11: av_log(NULL, AV_LOG_INFO, yading@11: "\n%d converters passed, %d converters randomly overwrote memory\n", yading@11: passedNum, failedNum); yading@11: return failedNum; yading@11: }