FFmpeg  4.0
snowenc.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg 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  * FFmpeg 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 FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavcodec/snowenc.c"
22 
23 #undef malloc
24 #undef free
25 #undef printf
26 
27 #include "libavutil/lfg.h"
28 #include "libavutil/mathematics.h"
29 
30 int main(void){
31 #define width 256
32 #define height 256
33  int buffer[2][width*height];
34  SnowContext s;
35  int i;
36  AVLFG prng;
39 
42 
43  if (!s.temp_dwt_buffer || !s.temp_idwt_buffer) {
44  fprintf(stderr, "Failed to allocate memory\n");
45  return 1;
46  }
47 
48  av_lfg_init(&prng, 1);
49 
50  printf("testing 5/3 DWT\n");
51  for(i=0; i<width*height; i++)
52  buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345;
53 
56 
57  for(i=0; i<width*height; i++)
58  if(buffer[0][i]!= buffer[1][i]) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
59 
60  printf("testing 9/7 DWT\n");
62  for(i=0; i<width*height; i++)
63  buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345;
64 
67 
68  for(i=0; i<width*height; i++)
69  if(FFABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
70 
71  {
72  int level, orientation, x, y;
73  int64_t errors[8][4];
74  int64_t g=0;
75 
76  memset(errors, 0, sizeof(errors));
79  for(level=0; level<s.spatial_decomposition_count; level++){
80  for(orientation=level ? 1 : 0; orientation<4; orientation++){
82  int h= height >> (s.spatial_decomposition_count-level);
84  DWTELEM *buf= buffer[0];
85  int64_t error=0;
86 
87  if(orientation&1) buf+=w;
88  if(orientation>1) buf+=stride>>1;
89 
90  memset(buffer[0], 0, sizeof(int)*width*height);
91  buf[w/2 + h/2*stride]= 256*256;
93  for(y=0; y<height; y++){
94  for(x=0; x<width; x++){
95  int64_t d= buffer[0][x + y*width];
96  error += d*d;
97  if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9 && level==2) printf("%8"PRId64" ", d);
98  }
99  if(FFABS(height/2-y)<9 && level==2) printf("\n");
100  }
101  error= (int)(sqrt(error)+0.5);
102  errors[level][orientation]= error;
103  if(g) g=av_gcd(g, error);
104  else g= error;
105  }
106  }
107  printf("static int const visual_weight[][4]={\n");
108  for(level=0; level<s.spatial_decomposition_count; level++){
109  printf(" {");
110  for(orientation=0; orientation<4; orientation++){
111  printf("%8"PRId64",", errors[level][orientation]/g);
112  }
113  printf("},\n");
114  }
115  printf("};\n");
116  {
117  int level=2;
119  //int h= height >> (s.spatial_decomposition_count-level);
121  DWTELEM *buf= buffer[0];
122  int64_t error=0;
123 
124  buf+=w;
125  buf+=stride>>1;
126 
127  memset(buffer[0], 0, sizeof(int)*width*height);
128  for(y=0; y<height; y++){
129  for(x=0; x<width; x++){
130  int tab[4]={0,2,3,1};
131  buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
132  }
133  }
135  for(y=0; y<height; y++){
136  for(x=0; x<width; x++){
137  int64_t d= buffer[0][x + y*width];
138  error += d*d;
139  if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9) printf("%8"PRId64" ", d);
140  }
141  if(FFABS(height/2-y)<9) printf("\n");
142  }
143  }
144 
145  }
146  return 0;
147 }
Definition: lfg.h:27
const char * s
Definition: avisynth_c.h:768
const char * g
Definition: vf_curves.c:112
int stride
Definition: mace.c:144
short IDWTELEM
Definition: dirac_dwt.h:27
static char buffer[20]
Definition: seek.c:32
#define height
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
Definition: mathematics.c:37
#define width
uint8_t w
Definition: llviddspenc.c:38
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
static void error(const char *err)
int main(void)
Definition: snowenc.c:30
int spatial_decomposition_count
Definition: snow.h:139
int DWTELEM
Definition: dirac_dwt.h:26
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
Definition: lfg.h:47
void * buf
Definition: avisynth_c.h:690
void ff_spatial_idwt(IDWTELEM *buffer, IDWTELEM *temp, int width, int height, int stride, int type, int decomposition_count)
Definition: snow_dwt.c:731
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
Definition: lfg.c:32
DWTELEM * temp_dwt_buffer
Definition: snow.h:147
int spatial_decomposition_type
Definition: snow.h:136
uint8_t level
Definition: svq3.c:207
int
IDWTELEM * temp_idwt_buffer
Definition: snow.h:149
void ff_spatial_dwt(DWTELEM *buffer, DWTELEM *temp, int width, int height, int stride, int type, int decomposition_count)
Definition: snow_dwt.c:319
static const struct twinvq_data tab
void * av_mallocz_array(size_t nmemb, size_t size)
Allocate a memory block for an array with av_mallocz().
Definition: mem.c:191