Libav
colorspace.c
Go to the documentation of this file.
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 <stdlib.h>
24 #include <inttypes.h>
25 
26 #include "libavutil/mem.h"
27 
28 #include "libswscale/rgb2rgb.h"
29 #include "libswscale/swscale.h"
30 
31 #define SIZE 1000
32 #define srcByte 0x55
33 #define dstByte 0xBB
34 
35 #define FUNC(s, d, n) { s, d, #n, n }
36 
37 int main(void)
38 {
39  int i, funcNum;
40  uint8_t *srcBuffer = av_malloc(SIZE);
41  uint8_t *dstBuffer = av_malloc(SIZE);
42  int failedNum = 0;
43  int passedNum = 0;
44 
45  if (!srcBuffer || !dstBuffer)
46  return -1;
47 
48  av_log(NULL, AV_LOG_INFO, "memory corruption test ...\n");
50 
51  for (funcNum = 0; ; funcNum++) {
52  struct func_info_s {
53  int src_bpp;
54  int dst_bpp;
55  const char *name;
56  void (*func)(const uint8_t *src, uint8_t *dst, int src_size);
57  } func_info[] = {
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, rgb15tobgr15),
71  FUNC(2, 2, rgb15tobgr16),
72  FUNC(2, 3, rgb15tobgr24),
73  FUNC(2, 4, rgb15tobgr32),
74  FUNC(2, 2, rgb16tobgr15),
75  FUNC(2, 2, rgb16tobgr16),
76  FUNC(2, 3, rgb16tobgr24),
77  FUNC(2, 4, rgb16tobgr32),
78  FUNC(3, 2, rgb24tobgr15),
79  FUNC(3, 2, rgb24tobgr16),
80  FUNC(3, 3, rgb24tobgr24),
81  FUNC(3, 4, rgb24tobgr32),
82  FUNC(4, 2, rgb32tobgr15),
83  FUNC(4, 2, rgb32tobgr16),
84  FUNC(4, 3, rgb32tobgr24),
85  FUNC(4, 4, shuffle_bytes_2103), /* rgb32tobgr32 */
86  FUNC(0, 0, NULL)
87  };
88  int width;
89  int failed = 0;
90  int srcBpp = 0;
91  int dstBpp = 0;
92 
93  if (!func_info[funcNum].func)
94  break;
95 
96  av_log(NULL, AV_LOG_INFO, ".");
97  memset(srcBuffer, srcByte, SIZE);
98 
99  for (width = 63; width > 0; width--) {
100  int dstOffset;
101  for (dstOffset = 128; dstOffset < 196; dstOffset += 4) {
102  int srcOffset;
103  memset(dstBuffer, dstByte, SIZE);
104 
105  for (srcOffset = 128; srcOffset < 196; srcOffset += 4) {
106  uint8_t *src = srcBuffer + srcOffset;
107  uint8_t *dst = dstBuffer + dstOffset;
108  const char *name = NULL;
109 
110  // don't fill the screen with shit ...
111  if (failed)
112  break;
113 
114  srcBpp = func_info[funcNum].src_bpp;
115  dstBpp = func_info[funcNum].dst_bpp;
116  name = func_info[funcNum].name;
117 
118  func_info[funcNum].func(src, dst, width * srcBpp);
119 
120  if (!srcBpp)
121  break;
122 
123  for (i = 0; i < SIZE; i++) {
124  if (srcBuffer[i] != srcByte) {
126  "src damaged at %d w:%d src:%d dst:%d %s\n",
127  i, width, srcOffset, dstOffset, name);
128  failed = 1;
129  break;
130  }
131  }
132  for (i = 0; i < dstOffset; i++) {
133  if (dstBuffer[i] != dstByte) {
135  "dst damaged at %d w:%d src:%d dst:%d %s\n",
136  i, width, srcOffset, dstOffset, name);
137  failed = 1;
138  break;
139  }
140  }
141  for (i = dstOffset + width * dstBpp; i < SIZE; i++) {
142  if (dstBuffer[i] != dstByte) {
144  "dst damaged at %d w:%d src:%d dst:%d %s\n",
145  i, width, srcOffset, dstOffset, name);
146  failed = 1;
147  break;
148  }
149  }
150  }
151  }
152  }
153  if (failed)
154  failedNum++;
155  else if (srcBpp)
156  passedNum++;
157  }
158 
160  "\n%d converters passed, %d converters randomly overwrote memory\n",
161  passedNum, failedNum);
162  return failedNum;
163 }
void(* rgb15to32)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:52
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:62
av_cold void ff_rgb2rgb_init(void)
Definition: rgb2rgb.c:132
void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:177
memory handling functions
void rgb16tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:232
void(* rgb32tobgr16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:36
av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
#define SIZE
Definition: colorspace.c:31
#define dstByte
Definition: colorspace.c:33
void(* rgb16tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:42
void(* rgb24tobgr16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:40
void(* shuffle_bytes_2103)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:54
void(* rgb32to16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:45
uint8_t
#define srcByte
Definition: colorspace.c:32
void rgb16to24(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:218
external api for the swscale stuff
#define src
Definition: vp8dsp.c:254
int main(void)
Definition: colorspace.c:37
void(* rgb15tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:43
void(* rgb32tobgr15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:37
void(* rgb24to16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:47
void rgb15tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:288
const char * name
Definition: qsvenc.c:44
void(* rgb24tobgr32)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:38
NULL
Definition: eval.c:55
void(* rgb16to15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:50
static int width
Definition: utils.c:156
#define AV_LOG_INFO
Standard information.
Definition: log.h:135
void(* func)(void)
Definition: checkasm.c:65
static void(WINAPI *cond_broadcast)(pthread_cond_t *cond)
void rgb32to24(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:139
void(* rgb24to15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:48
void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:157
void(* rgb16to32)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:49
void rgb15tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:298
void(* rgb24tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:39
void(* rgb24tobgr15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:41
#define FUNC(s, d, n)
Definition: colorspace.c:35
void(* rgb32to15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:46
void rgb15tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:252
void(* rgb32tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:35
void rgb16tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:242
void(* rgb15to16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:51
void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:274