Blame view

ffmpeg-4.2.2/tests/checkasm/alacdsp.c 4.48 KB
aac5773f   hucm   功能基本完成,接口待打磨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  /*
   * Copyright (c) 2015 James Almer
   *
   * This file is part of FFmpeg.
   *
   * FFmpeg is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License along
   * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   */
  
  #include <string.h>
  #include "checkasm.h"
  #include "libavcodec/alacdsp.h"
  #include "libavcodec/mathops.h"
  #include "libavutil/common.h"
  #include "libavutil/internal.h"
  
  #define BUF_SIZE 256
  #define MAX_CHANNELS 2
  
  #define randomize_buffers()                           \
      do {                                              \
          int i;                                        \
          for (i = 0; i < BUF_SIZE*MAX_CHANNELS; i++) { \
              int32_t r = sign_extend(rnd(), 24);       \
              ref_buf[i] = r;                           \
              new_buf[i] = r;                           \
          }                                             \
      } while (0)
  
  static void check_decorrelate_stereo(void)
  {
      LOCAL_ALIGNED_16(int32_t, ref_buf, [BUF_SIZE*MAX_CHANNELS]);
      LOCAL_ALIGNED_16(int32_t, new_buf, [BUF_SIZE*MAX_CHANNELS]);
      int32_t *ref[2] = { &ref_buf[BUF_SIZE*0], &ref_buf[BUF_SIZE*1] };
      int32_t *new[2] = { &new_buf[BUF_SIZE*0], &new_buf[BUF_SIZE*1] };
      ALACDSPContext c;
  
      ff_alacdsp_init(&c);
      if (check_func(c.decorrelate_stereo, "alac_decorrelate_stereo")) {
          int len    = (rnd() & 0xFF) + 1;
          int shift  =  rnd() & 0x1F;
          int weight =  rnd() & 0xFF;
          declare_func(void, int32_t *buf[2], int len, int shift, int weight);
  
          randomize_buffers();
          call_ref(ref, len, shift, weight);
          call_new(new, len, shift, weight);
          if (memcmp(ref[0], new[0], len * sizeof(int32_t)) ||
              memcmp(ref[1], new[1], len * sizeof(int32_t)))
              fail();
          bench_new(new, BUF_SIZE, shift, weight);
      }
  
      report("decorrelate_stereo");
  }
  
  #undef randomize_buffers
  #define randomize_buffers()                           \
      do {                                              \
          int i, j;                                     \
          for (i = 0; i < BUF_SIZE; i++) {              \
              for (j = 0; j < ch; j++) {                \
                  int32_t r = sign_extend(rnd(), 24);   \
                  ref[j][i] = r;                        \
                  new[j][i] = r;                        \
                  r = rnd() & 0xFF;                     \
                  ref_ebb[j][i] = r;                    \
                  new_ebb[j][i] = r;                    \
              }                                         \
          }                                             \
      } while (0)
  
  static void check_append_extra_bits(void)
  {
      LOCAL_ALIGNED_16(int32_t, ref_buf, [BUF_SIZE*MAX_CHANNELS*2]);
      LOCAL_ALIGNED_16(int32_t, new_buf, [BUF_SIZE*MAX_CHANNELS*2]);
      int32_t *ref[2]     = { &ref_buf[BUF_SIZE*0], &ref_buf[BUF_SIZE*1] };
      int32_t *new[2]     = { &new_buf[BUF_SIZE*0], &new_buf[BUF_SIZE*1] };
      int32_t *ref_ebb[2] = { &ref_buf[BUF_SIZE*2], &ref_buf[BUF_SIZE*3] };
      int32_t *new_ebb[2] = { &new_buf[BUF_SIZE*2], &new_buf[BUF_SIZE*3] };
      ALACDSPContext c;
      static const char * const channels[2] = { "mono", "stereo" };
      int ch;
  
      ff_alacdsp_init(&c);
      for (ch = 1; ch <= 2; ch++) {
          if (check_func(c.append_extra_bits[ch-1], "alac_append_extra_bits_%s", channels[ch-1])) {
              int len    = (rnd() & 0xFF) + 1;
              declare_func(void, int32_t *buf[2], int32_t *ebb[2], int ebits, int ch, int len);
  
              randomize_buffers();
              call_ref(ref, ref_ebb, 8, ch, len);
              call_new(new, new_ebb, 8, ch, len);
              if (            memcmp(ref[0], new[0], len * sizeof(int32_t)) ||
                  (ch == 2 && memcmp(ref[1], new[1], len * sizeof(int32_t))))
                  fail();
              bench_new(new, new_ebb, 8, ch, BUF_SIZE);
          }
      }
  
      report("append_extra_bits");
  }
  
  void checkasm_check_alacdsp(void)
  {
      check_decorrelate_stereo();
      check_append_extra_bits();
  }