FFmpeg
motion.c
Go to the documentation of this file.
1 /*
2  * (c) 2001 Fabrice Bellard
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 /**
22  * @file
23  * motion test.
24  */
25 
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29 
30 #include "config.h"
31 #include "libavcodec/me_cmp.h"
32 #include "libavutil/internal.h"
33 #include "libavutil/lfg.h"
34 #include "libavutil/mem.h"
35 #include "libavutil/time.h"
36 
37 #undef printf
38 
39 #define WIDTH 64
40 #define HEIGHT 64
41 
44 
45 static void fill_random(uint8_t *tab, int size)
46 {
47  int i;
48  AVLFG prng;
49 
50  av_lfg_init(&prng, 1);
51  for(i=0;i<size;i++) {
52  tab[i] = av_lfg_get(&prng) % 256;
53  }
54 }
55 
56 static void help(void)
57 {
58  printf("motion-test [-h]\n"
59  "test motion implementations\n");
60 }
61 
62 #define NB_ITS 500
63 
64 int dummy;
65 
66 static void test_motion(const char *name,
67  me_cmp_func test_func, me_cmp_func ref_func)
68 {
69  int x, y, d1, d2, it;
70  uint8_t *ptr;
71  int64_t ti;
72  printf("testing '%s'\n", name);
73 
74  /* test correctness */
75  for(it=0;it<20;it++) {
76 
78  fill_random(img2, WIDTH * HEIGHT);
79 
80  for(y=0;y<HEIGHT-17;y++) {
81  for(x=0;x<WIDTH-17;x++) {
82  ptr = img2 + y * WIDTH + x;
83  d1 = test_func(NULL, img1, ptr, WIDTH, 8);
84  d2 = ref_func(NULL, img1, ptr, WIDTH, 8);
85  if (d1 != d2) {
86  printf("error: mmx=%d c=%d\n", d1, d2);
87  }
88  }
89  }
90  }
91  emms_c();
92 
93  /* speed test */
94  ti = av_gettime_relative();
95  d1 = 0;
96  for(it=0;it<NB_ITS;it++) {
97  for(y=0;y<HEIGHT-17;y++) {
98  for(x=0;x<WIDTH-17;x++) {
99  ptr = img2 + y * WIDTH + x;
100  d1 += test_func(NULL, img1, ptr, WIDTH, 8);
101  }
102  }
103  }
104  emms_c();
105  dummy = d1; /* avoid optimization */
106  ti = av_gettime_relative() - ti;
107 
108  printf(" %0.0f kop/s\n",
109  (double)NB_ITS * (WIDTH - 16) * (HEIGHT - 16) /
110  (double)(ti / 1000.0));
111 }
112 
113 
114 int main(int argc, char **argv)
115 {
117  int c;
118  MECmpContext cctx, mmxctx;
120  int flags_size = HAVE_MMXEXT ? 2 : 1;
121 
122  if (argc > 1) {
123  help();
124  return 1;
125  }
126 
127  printf("ffmpeg motion test\n");
128 
132  memset(&cctx, 0, sizeof(cctx));
133  ff_me_cmp_init(&cctx, ctx);
134  for (c = 0; c < flags_size; c++) {
135  int x;
136  av_force_cpu_flags(flags[c]);
137  memset(&mmxctx, 0, sizeof(mmxctx));
138  ff_me_cmp_init(&mmxctx, ctx);
139 
140  for (x = 0; x < 2; x++) {
141  printf("%s for %dx%d pixels\n", c ? "mmx2" : "mmx",
142  x ? 8 : 16, x ? 8 : 16);
143  test_motion("mmx", mmxctx.pix_abs[x][0], cctx.pix_abs[x][0]);
144  test_motion("mmx_x2", mmxctx.pix_abs[x][1], cctx.pix_abs[x][1]);
145  test_motion("mmx_y2", mmxctx.pix_abs[x][2], cctx.pix_abs[x][2]);
146  test_motion("mmx_xy2", mmxctx.pix_abs[x][3], cctx.pix_abs[x][3]);
147  }
148  }
149  av_free(ctx);
150 
151  return 0;
152 }
Definition: lfg.h:27
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
Definition: me_cmp.c:1035
#define NULL
Definition: coverity.c:32
static void fill_random(uint8_t *tab, int size)
Definition: motion.c:45
Memory handling functions.
#define WIDTH
Definition: motion.c:39
static uint8_t img2[WIDTH *HEIGHT]
Definition: motion.c:43
static uint8_t img1[WIDTH *HEIGHT]
Definition: motion.c:42
uint8_t
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
#define AV_CPU_FLAG_MMXEXT
SSE integer functions or AMD MMX ext.
Definition: cpu.h:32
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s it
int(* me_cmp_func)(struct MpegEncContext *c, uint8_t *blk1, uint8_t *blk2, ptrdiff_t stride, int h)
Definition: me_cmp.h:48
ptrdiff_t size
Definition: opengl_enc.c:100
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
#define HEIGHT
Definition: motion.c:40
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:1648
me_cmp_func pix_abs[2][4]
Definition: me_cmp.h:78
common internal API header
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:911
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
Definition: options.c:156
AVFormatContext * ctx
Definition: movenc.c:48
static void help(void)
Definition: motion.c:56
int dummy
Definition: motion.c:64
#define NB_ITS
Definition: motion.c:62
main external API structure.
Definition: avcodec.h:1568
#define AV_CPU_FLAG_MMX
standard MMX
Definition: cpu.h:31
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
Definition: lfg.h:47
static void test_motion(const char *name, me_cmp_func test_func, me_cmp_func ref_func)
Definition: motion.c:66
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
Definition: lfg.c:32
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
#define flags(name, subs,...)
Definition: cbs_av1.c:561
#define av_free(p)
printf("static const uint8_t my_array[100] = {\n")
int main(int argc, char **argv)
Definition: motion.c:114
static const struct twinvq_data tab
void av_force_cpu_flags(int arg)
Disables cpu detection and forces the specified flags.
Definition: cpu.c:65
const char * name
Definition: opengl_enc.c:102