codec_factory.h revision ba164dffc5a6795bce97fae02b51ccf3330e15e4
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 137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP8_INSTANTIATE_TEST_CASE(test, params)\ 138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang INSTANTIATE_TEST_CASE_P(VP8, test, \ 139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ::testing::Combine( \ 140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \ 141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &libvpx_test::kVP8)), \ 142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang params)) 143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP8_INSTANTIATE_TEST_CASE(test, params) 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 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_INSTANTIATE_TEST_CASE(test, params)\ 220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang INSTANTIATE_TEST_CASE_P(VP9, test, \ 221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ::testing::Combine( \ 222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ::testing::Values(static_cast<const libvpx_test::CodecFactory*>( \ 223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &libvpx_test::kVP9)), \ 224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang params)) 225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_INSTANTIATE_TEST_CASE(test, params) 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif // CONFIG_VP9 228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} // namespace libvpx_test 231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif // TEST_CODEC_FACTORY_H_ 233