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