1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef TEST_CODEC_FACTORY_H_
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define TEST_CODEC_FACTORY_H_
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangextern "C" {
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h"
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vpx_decoder.h"
16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vpx_encoder.h"
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vp8cx.h"
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_DECODER || CONFIG_VP9_DECODER
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vp8dx.h"
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/decode_test_driver.h"
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/encode_test_driver.h"
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangnamespace libvpx_test {
28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass CodecFactory {
30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  CodecFactory() {}
32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual ~CodecFactory() {}
34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 unsigned long deadline) const = 0;
37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 unsigned long deadline,
40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 const unsigned long init_flags,
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 TwopassStatsStore *stats) const = 0;
42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                               int usage) const = 0;
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* Provide CodecTestWith<n>Params classes for a variable number of parameters
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * to avoid having to include a pointer to the CodecFactory in every test
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * definition.
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtemplate<class T1>
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass CodecTestWithParam : public ::testing::TestWithParam<
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    std::tr1::tuple< const libvpx_test::CodecFactory*, T1 > > {
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtemplate<class T1, class T2>
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass CodecTestWith2Params : public ::testing::TestWithParam<
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    std::tr1::tuple< const libvpx_test::CodecFactory*, T1, T2 > > {
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtemplate<class T1, class T2, class T3>
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass CodecTestWith3Params : public ::testing::TestWithParam<
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    std::tr1::tuple< const libvpx_test::CodecFactory*, T1, T2, T3 > > {
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * VP8 Codec Definitions
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass VP8Decoder : public Decoder {
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      : Decoder(cfg, deadline) {}
74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang protected:
76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual const vpx_codec_iface_t* CodecInterface() const {
77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_DECODER
78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return &vpx_codec_vp8_dx_algo;
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return NULL;
81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass VP8Encoder : public Encoder {
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang             const unsigned long init_flags, TwopassStatsStore *stats)
89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      : Encoder(cfg, deadline, init_flags, stats) {}
90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang protected:
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual const vpx_codec_iface_t* CodecInterface() const {
93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return &vpx_codec_vp8_cx_algo;
95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return NULL;
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass VP8CodecFactory : public CodecFactory {
102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8CodecFactory() : CodecFactory() {}
104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 unsigned long deadline) const {
107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_DECODER
108ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return new VP8Decoder(cfg, deadline);
109ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return NULL;
111ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 unsigned long deadline,
116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 const unsigned long init_flags,
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 TwopassStatsStore *stats) const {
118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return new VP8Encoder(cfg, deadline, init_flags, stats);
120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return NULL;
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                               int usage) const {
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER
128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return vpx_codec_enc_config_default(&vpx_codec_vp8_cx_algo, cfg, usage);
129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return VPX_CODEC_INCAPABLE;
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst libvpx_test::VP8CodecFactory kVP8;
136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13791037db265ecdd914a26e056cf69207b4f50924ehkuang#define VP8_INSTANTIATE_TEST_CASE(test, ...)\
138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  INSTANTIATE_TEST_CASE_P(VP8, test, \
139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      ::testing::Combine( \
140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang              &libvpx_test::kVP8)), \
14291037db265ecdd914a26e056cf69207b4f50924ehkuang          __VA_ARGS__))
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
14491037db265ecdd914a26e056cf69207b4f50924ehkuang#define VP8_INSTANTIATE_TEST_CASE(test, ...)
145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // CONFIG_VP8
146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * VP9 Codec Definitions
150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9
152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass VP9Decoder : public Decoder {
153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      : Decoder(cfg, deadline) {}
156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang protected:
158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual const vpx_codec_iface_t* CodecInterface() const {
159ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_DECODER
160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return &vpx_codec_vp9_dx_algo;
161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return NULL;
163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass VP9Encoder : public Encoder {
168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang             const unsigned long init_flags, TwopassStatsStore *stats)
171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      : Encoder(cfg, deadline, init_flags, stats) {}
172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang protected:
174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual const vpx_codec_iface_t* CodecInterface() const {
175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return &vpx_codec_vp9_cx_algo;
177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return NULL;
179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass VP9CodecFactory : public CodecFactory {
184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public:
185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9CodecFactory() : CodecFactory() {}
186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual Decoder* CreateDecoder(vpx_codec_dec_cfg_t cfg,
188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 unsigned long deadline) const {
189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_DECODER
190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return new VP9Decoder(cfg, deadline);
191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return NULL;
193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual Encoder* CreateEncoder(vpx_codec_enc_cfg_t cfg,
197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 unsigned long deadline,
198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 const unsigned long init_flags,
199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                 TwopassStatsStore *stats) const {
200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return new VP9Encoder(cfg, deadline, init_flags, stats);
202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return NULL;
204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  virtual vpx_codec_err_t DefaultEncoderConfig(vpx_codec_enc_cfg_t *cfg,
208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                               int usage) const {
209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER
210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return vpx_codec_enc_config_default(&vpx_codec_vp9_cx_algo, cfg, usage);
211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    return VPX_CODEC_INCAPABLE;
213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif
214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangconst libvpx_test::VP9CodecFactory kVP9;
218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21991037db265ecdd914a26e056cf69207b4f50924ehkuang#define VP9_INSTANTIATE_TEST_CASE(test, ...)\
220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  INSTANTIATE_TEST_CASE_P(VP9, test, \
221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      ::testing::Combine( \
222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \
223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang               &libvpx_test::kVP9)), \
22491037db265ecdd914a26e056cf69207b4f50924ehkuang          __VA_ARGS__))
225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else
22691037db265ecdd914a26e056cf69207b4f50924ehkuang#define VP9_INSTANTIATE_TEST_CASE(test, ...)
227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // CONFIG_VP9
228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}  // namespace libvpx_test
231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // TEST_CODEC_FACTORY_H_
233