1 /*
2  *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 #ifndef TEST_CODEC_FACTORY_H_
11 #define TEST_CODEC_FACTORY_H_
12 
13 #include "./vpx_config.h"
14 #include "vpx/vpx_decoder.h"
15 #include "vpx/vpx_encoder.h"
16 #if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER || CONFIG_VP10_ENCODER
17 #include "vpx/vp8cx.h"
18 #endif
19 #if CONFIG_VP8_DECODER || CONFIG_VP9_DECODER || CONFIG_VP10_DECODER
20 #include "vpx/vp8dx.h"
21 #endif
22 
23 #include "test/decode_test_driver.h"
24 #include "test/encode_test_driver.h"
25 namespace libvpx_test {
26 
27 const int kCodecFactoryParam = 0;
28 
29 class CodecFactory {
30  public:
CodecFactory()31   CodecFactory() {}
32 
~CodecFactory()33   virtual ~CodecFactory() {}
34 
35   virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
36                                  unsigned long deadline) const = 0;
37 
38   virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
39                                  const vpx_codec_flags_t flags,
40                                  unsigned long deadline)  // NOLINT(runtime/int)
41                                  const = 0;
42 
43   virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
44                                  unsigned long deadline,
45                                  const unsigned long init_flags,
46                                  TwopassStatsStore *stats) const = 0;
47 
48   virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
49                                                int usage) const = 0;
50 };
51 
52 /* Provide CodecTestWith<n>Params classes for a variable number of parameters
53  * to avoid having to include a pointer to the CodecFactory in every test
54  * definition.
55  */
56 template<class T1>
57 class CodecTestWithParam : public ::testing::TestWithParam<
58     std::tr1::tuple< const libvpx_test::CodecFactory*, T1 > > {
59 };
60 
61 template<class T1, class T2>
62 class CodecTestWith2Params : public ::testing::TestWithParam<
63     std::tr1::tuple< const libvpx_test::CodecFactory*, T1, T2 > > {
64 };
65 
66 template<class T1, class T2, class T3>
67 class CodecTestWith3Params : public ::testing::TestWithParam<
68     std::tr1::tuple< const libvpx_test::CodecFactory*, T1, T2, T3 > > {
69 };
70 
71 /*
72  * VP8 Codec Definitions
73  */
74 #if CONFIG_VP8
75 class VP8Decoder : public Decoder {
76  public:
VP8Decoder(vpx_codec_dec_cfg_t cfg,unsigned long deadline)77   VP8Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
78       : Decoder(cfg, deadline) {}
79 
VP8Decoder(vpx_codec_dec_cfg_t cfg,const vpx_codec_flags_t flag,unsigned long deadline)80   VP8Decoder(vpx_codec_dec_cfg_t cfg, const vpx_codec_flags_t flag,
81              unsigned long deadline)  // NOLINT
82       : Decoder(cfg, flag, deadline) {}
83 
84  protected:
CodecInterface()85   virtual vpx_codec_iface_t* CodecInterface() const {
86 #if CONFIG_VP8_DECODER
87     return &vpx_codec_vp8_dx_algo;
88 #else
89     return NULL;
90 #endif
91   }
92 };
93 
94 class VP8Encoder : public Encoder {
95  public:
VP8Encoder(vpx_codec_enc_cfg_t cfg,unsigned long deadline,const unsigned long init_flags,TwopassStatsStore * stats)96   VP8Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
97              const unsigned long init_flags, TwopassStatsStore *stats)
98       : Encoder(cfg, deadline, init_flags, stats) {}
99 
100  protected:
CodecInterface()101   virtual vpx_codec_iface_t* CodecInterface() const {
102 #if CONFIG_VP8_ENCODER
103     return &vpx_codec_vp8_cx_algo;
104 #else
105     return NULL;
106 #endif
107   }
108 };
109 
110 class VP8CodecFactory : public CodecFactory {
111  public:
VP8CodecFactory()112   VP8CodecFactory() : CodecFactory() {}
113 
CreateDecoder(vpx_codec_dec_cfg_t cfg,unsigned long deadline)114   virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
115                                  unsigned long deadline) const {
116     return CreateDecoder(cfg, 0, deadline);
117   }
118 
CreateDecoder(vpx_codec_dec_cfg_t cfg,const vpx_codec_flags_t flags,unsigned long deadline)119   virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
120                                  const vpx_codec_flags_t flags,
121                                  unsigned long deadline) const {  // NOLINT
122 #if CONFIG_VP8_DECODER
123     return new VP8Decoder(cfg, flags, deadline);
124 #else
125     return NULL;
126 #endif
127   }
128 
CreateEncoder(vpx_codec_enc_cfg_t cfg,unsigned long deadline,const unsigned long init_flags,TwopassStatsStore * stats)129   virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
130                                  unsigned long deadline,
131                                  const unsigned long init_flags,
132                                  TwopassStatsStore *stats) const {
133 #if CONFIG_VP8_ENCODER
134     return new VP8Encoder(cfg, deadline, init_flags, stats);
135 #else
136     return NULL;
137 #endif
138   }
139 
DefaultEncoderConfig(vpx_codec_enc_cfg_t * cfg,int usage)140   virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
141                                                int usage) const {
142 #if CONFIG_VP8_ENCODER
143     return vpx_codec_enc_config_default(&vpx_codec_vp8_cx_algo, cfg, usage);
144 #else
145     return VPX_CODEC_INCAPABLE;
146 #endif
147   }
148 };
149 
150 const libvpx_test::VP8CodecFactory kVP8;
151 
152 #define VP8_INSTANTIATE_TEST_CASE(test, ...)\
153   INSTANTIATE_TEST_CASE_P(VP8, test, \
154       ::testing::Combine( \
155           ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \
156               &libvpx_test::kVP8)), \
157           __VA_ARGS__))
158 #else
159 #define VP8_INSTANTIATE_TEST_CASE(test, ...)
160 #endif  // CONFIG_VP8
161 
162 
163 /*
164  * VP9 Codec Definitions
165  */
166 #if CONFIG_VP9
167 class VP9Decoder : public Decoder {
168  public:
VP9Decoder(vpx_codec_dec_cfg_t cfg,unsigned long deadline)169   VP9Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
170       : Decoder(cfg, deadline) {}
171 
VP9Decoder(vpx_codec_dec_cfg_t cfg,const vpx_codec_flags_t flag,unsigned long deadline)172   VP9Decoder(vpx_codec_dec_cfg_t cfg, const vpx_codec_flags_t flag,
173              unsigned long deadline)  // NOLINT
174       : Decoder(cfg, flag, deadline) {}
175 
176  protected:
CodecInterface()177   virtual vpx_codec_iface_t* CodecInterface() const {
178 #if CONFIG_VP9_DECODER
179     return &vpx_codec_vp9_dx_algo;
180 #else
181     return NULL;
182 #endif
183   }
184 };
185 
186 class VP9Encoder : public Encoder {
187  public:
VP9Encoder(vpx_codec_enc_cfg_t cfg,unsigned long deadline,const unsigned long init_flags,TwopassStatsStore * stats)188   VP9Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
189              const unsigned long init_flags, TwopassStatsStore *stats)
190       : Encoder(cfg, deadline, init_flags, stats) {}
191 
192  protected:
CodecInterface()193   virtual vpx_codec_iface_t* CodecInterface() const {
194 #if CONFIG_VP9_ENCODER
195     return &vpx_codec_vp9_cx_algo;
196 #else
197     return NULL;
198 #endif
199   }
200 };
201 
202 class VP9CodecFactory : public CodecFactory {
203  public:
VP9CodecFactory()204   VP9CodecFactory() : CodecFactory() {}
205 
CreateDecoder(vpx_codec_dec_cfg_t cfg,unsigned long deadline)206   virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
207                                  unsigned long deadline) const {
208     return CreateDecoder(cfg, 0, deadline);
209   }
210 
CreateDecoder(vpx_codec_dec_cfg_t cfg,const vpx_codec_flags_t flags,unsigned long deadline)211   virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
212                                  const vpx_codec_flags_t flags,
213                                  unsigned long deadline) const {  // NOLINT
214 #if CONFIG_VP9_DECODER
215     return new VP9Decoder(cfg, flags, deadline);
216 #else
217     return NULL;
218 #endif
219   }
220 
CreateEncoder(vpx_codec_enc_cfg_t cfg,unsigned long deadline,const unsigned long init_flags,TwopassStatsStore * stats)221   virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
222                                  unsigned long deadline,
223                                  const unsigned long init_flags,
224                                  TwopassStatsStore *stats) const {
225 #if CONFIG_VP9_ENCODER
226     return new VP9Encoder(cfg, deadline, init_flags, stats);
227 #else
228     return NULL;
229 #endif
230   }
231 
DefaultEncoderConfig(vpx_codec_enc_cfg_t * cfg,int usage)232   virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
233                                                int usage) const {
234 #if CONFIG_VP9_ENCODER
235     return vpx_codec_enc_config_default(&vpx_codec_vp9_cx_algo, cfg, usage);
236 #elif CONFIG_VP10_ENCODER
237     return vpx_codec_enc_config_default(&vpx_codec_vp10_cx_algo, cfg, usage);
238 #else
239     return VPX_CODEC_INCAPABLE;
240 #endif
241   }
242 };
243 
244 const libvpx_test::VP9CodecFactory kVP9;
245 
246 #define VP9_INSTANTIATE_TEST_CASE(test, ...)\
247   INSTANTIATE_TEST_CASE_P(VP9, test, \
248       ::testing::Combine( \
249           ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \
250                &libvpx_test::kVP9)), \
251           __VA_ARGS__))
252 #else
253 #define VP9_INSTANTIATE_TEST_CASE(test, ...)
254 #endif  // CONFIG_VP9
255 
256 /*
257  * VP10 Codec Definitions
258  */
259 #if CONFIG_VP10
260 class VP10Decoder : public Decoder {
261  public:
VP10Decoder(vpx_codec_dec_cfg_t cfg,unsigned long deadline)262   VP10Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
263       : Decoder(cfg, deadline) {}
264 
VP10Decoder(vpx_codec_dec_cfg_t cfg,const vpx_codec_flags_t flag,unsigned long deadline)265   VP10Decoder(vpx_codec_dec_cfg_t cfg, const vpx_codec_flags_t flag,
266               unsigned long deadline)  // NOLINT
267       : Decoder(cfg, flag, deadline) {}
268 
269  protected:
CodecInterface()270   virtual vpx_codec_iface_t* CodecInterface() const {
271 #if CONFIG_VP10_DECODER
272     return &vpx_codec_vp10_dx_algo;
273 #else
274     return NULL;
275 #endif
276   }
277 };
278 
279 class VP10Encoder : public Encoder {
280  public:
VP10Encoder(vpx_codec_enc_cfg_t cfg,unsigned long deadline,const unsigned long init_flags,TwopassStatsStore * stats)281   VP10Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
282               const unsigned long init_flags, TwopassStatsStore *stats)
283       : Encoder(cfg, deadline, init_flags, stats) {}
284 
285  protected:
CodecInterface()286   virtual vpx_codec_iface_t* CodecInterface() const {
287 #if CONFIG_VP10_ENCODER
288     return &vpx_codec_vp10_cx_algo;
289 #else
290     return NULL;
291 #endif
292   }
293 };
294 
295 class VP10CodecFactory : public CodecFactory {
296  public:
VP10CodecFactory()297   VP10CodecFactory() : CodecFactory() {}
298 
CreateDecoder(vpx_codec_dec_cfg_t cfg,unsigned long deadline)299   virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
300                                  unsigned long deadline) const {
301     return CreateDecoder(cfg, 0, deadline);
302   }
303 
CreateDecoder(vpx_codec_dec_cfg_t cfg,const vpx_codec_flags_t flags,unsigned long deadline)304   virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
305                                  const vpx_codec_flags_t flags,
306                                  unsigned long deadline) const {  // NOLINT
307 #if CONFIG_VP10_DECODER
308     return new VP10Decoder(cfg, flags, deadline);
309 #else
310     return NULL;
311 #endif
312   }
313 
CreateEncoder(vpx_codec_enc_cfg_t cfg,unsigned long deadline,const unsigned long init_flags,TwopassStatsStore * stats)314   virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
315                                  unsigned long deadline,
316                                  const unsigned long init_flags,
317                                  TwopassStatsStore *stats) const {
318 #if CONFIG_VP10_ENCODER
319     return new VP10Encoder(cfg, deadline, init_flags, stats);
320 #else
321     return NULL;
322 #endif
323   }
324 
DefaultEncoderConfig(vpx_codec_enc_cfg_t * cfg,int usage)325   virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
326                                                int usage) const {
327 #if CONFIG_VP10_ENCODER
328     return vpx_codec_enc_config_default(&vpx_codec_vp10_cx_algo, cfg, usage);
329 #else
330     return VPX_CODEC_INCAPABLE;
331 #endif
332   }
333 };
334 
335 const libvpx_test::VP10CodecFactory kVP10;
336 
337 #define VP10_INSTANTIATE_TEST_CASE(test, ...)\
338   INSTANTIATE_TEST_CASE_P(VP10, test, \
339       ::testing::Combine( \
340           ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \
341                &libvpx_test::kVP10)), \
342           __VA_ARGS__))
343 #else
344 #define VP10_INSTANTIATE_TEST_CASE(test, ...)
345 #endif  // CONFIG_VP10
346 
347 }  // namespace libvpx_test
348 #endif  // TEST_CODEC_FACTORY_H_
349