1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_TEST_DECODE_TEST_DRIVER_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_TEST_DECODE_TEST_DRIVER_H_ 13*fb1b10abSAndroid Build Coastguard Worker #include <cstring> 14*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h" 15*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h" 16*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_decoder.h" 17*fb1b10abSAndroid Build Coastguard Worker 18*fb1b10abSAndroid Build Coastguard Worker namespace libvpx_test { 19*fb1b10abSAndroid Build Coastguard Worker 20*fb1b10abSAndroid Build Coastguard Worker class CodecFactory; 21*fb1b10abSAndroid Build Coastguard Worker class CompressedVideoSource; 22*fb1b10abSAndroid Build Coastguard Worker 23*fb1b10abSAndroid Build Coastguard Worker // Provides an object to handle decoding output 24*fb1b10abSAndroid Build Coastguard Worker class DxDataIterator { 25*fb1b10abSAndroid Build Coastguard Worker public: DxDataIterator(vpx_codec_ctx_t * decoder)26*fb1b10abSAndroid Build Coastguard Worker explicit DxDataIterator(vpx_codec_ctx_t *decoder) 27*fb1b10abSAndroid Build Coastguard Worker : decoder_(decoder), iter_(nullptr) {} 28*fb1b10abSAndroid Build Coastguard Worker Next()29*fb1b10abSAndroid Build Coastguard Worker const vpx_image_t *Next() { return vpx_codec_get_frame(decoder_, &iter_); } 30*fb1b10abSAndroid Build Coastguard Worker 31*fb1b10abSAndroid Build Coastguard Worker private: 32*fb1b10abSAndroid Build Coastguard Worker vpx_codec_ctx_t *decoder_; 33*fb1b10abSAndroid Build Coastguard Worker vpx_codec_iter_t iter_; 34*fb1b10abSAndroid Build Coastguard Worker }; 35*fb1b10abSAndroid Build Coastguard Worker 36*fb1b10abSAndroid Build Coastguard Worker // Provides a simplified interface to manage one video decoding. 37*fb1b10abSAndroid Build Coastguard Worker // Similar to Encoder class, the exact services should be added 38*fb1b10abSAndroid Build Coastguard Worker // as more tests are added. 39*fb1b10abSAndroid Build Coastguard Worker class Decoder { 40*fb1b10abSAndroid Build Coastguard Worker public: Decoder(vpx_codec_dec_cfg_t cfg)41*fb1b10abSAndroid Build Coastguard Worker explicit Decoder(vpx_codec_dec_cfg_t cfg) 42*fb1b10abSAndroid Build Coastguard Worker : cfg_(cfg), flags_(0), init_done_(false) { 43*fb1b10abSAndroid Build Coastguard Worker memset(&decoder_, 0, sizeof(decoder_)); 44*fb1b10abSAndroid Build Coastguard Worker } 45*fb1b10abSAndroid Build Coastguard Worker Decoder(vpx_codec_dec_cfg_t cfg,const vpx_codec_flags_t flag)46*fb1b10abSAndroid Build Coastguard Worker Decoder(vpx_codec_dec_cfg_t cfg, const vpx_codec_flags_t flag) 47*fb1b10abSAndroid Build Coastguard Worker : cfg_(cfg), flags_(flag), init_done_(false) { 48*fb1b10abSAndroid Build Coastguard Worker memset(&decoder_, 0, sizeof(decoder_)); 49*fb1b10abSAndroid Build Coastguard Worker } 50*fb1b10abSAndroid Build Coastguard Worker ~Decoder()51*fb1b10abSAndroid Build Coastguard Worker virtual ~Decoder() { vpx_codec_destroy(&decoder_); } 52*fb1b10abSAndroid Build Coastguard Worker 53*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t PeekStream(const uint8_t *cxdata, size_t size, 54*fb1b10abSAndroid Build Coastguard Worker vpx_codec_stream_info_t *stream_info); 55*fb1b10abSAndroid Build Coastguard Worker 56*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t DecodeFrame(const uint8_t *cxdata, size_t size); 57*fb1b10abSAndroid Build Coastguard Worker 58*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t DecodeFrame(const uint8_t *cxdata, size_t size, 59*fb1b10abSAndroid Build Coastguard Worker void *user_priv); 60*fb1b10abSAndroid Build Coastguard Worker GetDxData()61*fb1b10abSAndroid Build Coastguard Worker DxDataIterator GetDxData() { return DxDataIterator(&decoder_); } 62*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,int arg)63*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, int arg) { Control(ctrl_id, arg, VPX_CODEC_OK); } 64*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,const void * arg)65*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, const void *arg) { 66*fb1b10abSAndroid Build Coastguard Worker InitOnce(); 67*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&decoder_, ctrl_id, arg); 68*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << DecodeError(); 69*fb1b10abSAndroid Build Coastguard Worker } 70*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,int arg,vpx_codec_err_t expected_value)71*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, int arg, vpx_codec_err_t expected_value) { 72*fb1b10abSAndroid Build Coastguard Worker InitOnce(); 73*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&decoder_, ctrl_id, arg); 74*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(expected_value, res) << DecodeError(); 75*fb1b10abSAndroid Build Coastguard Worker } 76*fb1b10abSAndroid Build Coastguard Worker DecodeError()77*fb1b10abSAndroid Build Coastguard Worker const char *DecodeError() { 78*fb1b10abSAndroid Build Coastguard Worker const char *detail = vpx_codec_error_detail(&decoder_); 79*fb1b10abSAndroid Build Coastguard Worker return detail ? detail : vpx_codec_error(&decoder_); 80*fb1b10abSAndroid Build Coastguard Worker } 81*fb1b10abSAndroid Build Coastguard Worker 82*fb1b10abSAndroid Build Coastguard Worker // Passes the external frame buffer information to libvpx. SetFrameBufferFunctions(vpx_get_frame_buffer_cb_fn_t cb_get,vpx_release_frame_buffer_cb_fn_t cb_release,void * user_priv)83*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t SetFrameBufferFunctions( 84*fb1b10abSAndroid Build Coastguard Worker vpx_get_frame_buffer_cb_fn_t cb_get, 85*fb1b10abSAndroid Build Coastguard Worker vpx_release_frame_buffer_cb_fn_t cb_release, void *user_priv) { 86*fb1b10abSAndroid Build Coastguard Worker InitOnce(); 87*fb1b10abSAndroid Build Coastguard Worker return vpx_codec_set_frame_buffer_functions(&decoder_, cb_get, cb_release, 88*fb1b10abSAndroid Build Coastguard Worker user_priv); 89*fb1b10abSAndroid Build Coastguard Worker } 90*fb1b10abSAndroid Build Coastguard Worker GetDecoderName()91*fb1b10abSAndroid Build Coastguard Worker const char *GetDecoderName() const { 92*fb1b10abSAndroid Build Coastguard Worker return vpx_codec_iface_name(CodecInterface()); 93*fb1b10abSAndroid Build Coastguard Worker } 94*fb1b10abSAndroid Build Coastguard Worker 95*fb1b10abSAndroid Build Coastguard Worker bool IsVP8() const; 96*fb1b10abSAndroid Build Coastguard Worker GetDecoder()97*fb1b10abSAndroid Build Coastguard Worker vpx_codec_ctx_t *GetDecoder() { return &decoder_; } 98*fb1b10abSAndroid Build Coastguard Worker 99*fb1b10abSAndroid Build Coastguard Worker protected: 100*fb1b10abSAndroid Build Coastguard Worker virtual vpx_codec_iface_t *CodecInterface() const = 0; 101*fb1b10abSAndroid Build Coastguard Worker InitOnce()102*fb1b10abSAndroid Build Coastguard Worker void InitOnce() { 103*fb1b10abSAndroid Build Coastguard Worker if (!init_done_) { 104*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = 105*fb1b10abSAndroid Build Coastguard Worker vpx_codec_dec_init(&decoder_, CodecInterface(), &cfg_, flags_); 106*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << DecodeError(); 107*fb1b10abSAndroid Build Coastguard Worker init_done_ = true; 108*fb1b10abSAndroid Build Coastguard Worker } 109*fb1b10abSAndroid Build Coastguard Worker } 110*fb1b10abSAndroid Build Coastguard Worker 111*fb1b10abSAndroid Build Coastguard Worker vpx_codec_ctx_t decoder_; 112*fb1b10abSAndroid Build Coastguard Worker vpx_codec_dec_cfg_t cfg_; 113*fb1b10abSAndroid Build Coastguard Worker vpx_codec_flags_t flags_; 114*fb1b10abSAndroid Build Coastguard Worker bool init_done_; 115*fb1b10abSAndroid Build Coastguard Worker }; 116*fb1b10abSAndroid Build Coastguard Worker 117*fb1b10abSAndroid Build Coastguard Worker // Common test functionality for all Decoder tests. 118*fb1b10abSAndroid Build Coastguard Worker class DecoderTest { 119*fb1b10abSAndroid Build Coastguard Worker public: 120*fb1b10abSAndroid Build Coastguard Worker // Main decoding loop 121*fb1b10abSAndroid Build Coastguard Worker virtual void RunLoop(CompressedVideoSource *video); 122*fb1b10abSAndroid Build Coastguard Worker virtual void RunLoop(CompressedVideoSource *video, 123*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_dec_cfg_t &dec_cfg); 124*fb1b10abSAndroid Build Coastguard Worker 125*fb1b10abSAndroid Build Coastguard Worker virtual void set_cfg(const vpx_codec_dec_cfg_t &dec_cfg); 126*fb1b10abSAndroid Build Coastguard Worker virtual void set_flags(const vpx_codec_flags_t flags); 127*fb1b10abSAndroid Build Coastguard Worker 128*fb1b10abSAndroid Build Coastguard Worker // Hook to be called before decompressing every frame. PreDecodeFrameHook(const CompressedVideoSource &,Decoder *)129*fb1b10abSAndroid Build Coastguard Worker virtual void PreDecodeFrameHook(const CompressedVideoSource & /*video*/, 130*fb1b10abSAndroid Build Coastguard Worker Decoder * /*decoder*/) {} 131*fb1b10abSAndroid Build Coastguard Worker 132*fb1b10abSAndroid Build Coastguard Worker // Hook to be called to handle decode result. Return true to continue. HandleDecodeResult(const vpx_codec_err_t res_dec,const CompressedVideoSource &,Decoder * decoder)133*fb1b10abSAndroid Build Coastguard Worker virtual bool HandleDecodeResult(const vpx_codec_err_t res_dec, 134*fb1b10abSAndroid Build Coastguard Worker const CompressedVideoSource & /*video*/, 135*fb1b10abSAndroid Build Coastguard Worker Decoder *decoder) { 136*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError(); 137*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK == res_dec; 138*fb1b10abSAndroid Build Coastguard Worker } 139*fb1b10abSAndroid Build Coastguard Worker 140*fb1b10abSAndroid Build Coastguard Worker // Hook to be called on every decompressed frame. DecompressedFrameHook(const vpx_image_t &,const unsigned int)141*fb1b10abSAndroid Build Coastguard Worker virtual void DecompressedFrameHook(const vpx_image_t & /*img*/, 142*fb1b10abSAndroid Build Coastguard Worker const unsigned int /*frame_number*/) {} 143*fb1b10abSAndroid Build Coastguard Worker 144*fb1b10abSAndroid Build Coastguard Worker // Hook to be called on peek result 145*fb1b10abSAndroid Build Coastguard Worker virtual void HandlePeekResult(Decoder *const decoder, 146*fb1b10abSAndroid Build Coastguard Worker CompressedVideoSource *video, 147*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res_peek); 148*fb1b10abSAndroid Build Coastguard Worker 149*fb1b10abSAndroid Build Coastguard Worker protected: DecoderTest(const CodecFactory * codec)150*fb1b10abSAndroid Build Coastguard Worker explicit DecoderTest(const CodecFactory *codec) 151*fb1b10abSAndroid Build Coastguard Worker : codec_(codec), cfg_(), flags_(0) {} 152*fb1b10abSAndroid Build Coastguard Worker ~DecoderTest()153*fb1b10abSAndroid Build Coastguard Worker virtual ~DecoderTest() {} 154*fb1b10abSAndroid Build Coastguard Worker 155*fb1b10abSAndroid Build Coastguard Worker const CodecFactory *codec_; 156*fb1b10abSAndroid Build Coastguard Worker vpx_codec_dec_cfg_t cfg_; 157*fb1b10abSAndroid Build Coastguard Worker vpx_codec_flags_t flags_; 158*fb1b10abSAndroid Build Coastguard Worker }; 159*fb1b10abSAndroid Build Coastguard Worker 160*fb1b10abSAndroid Build Coastguard Worker } // namespace libvpx_test 161*fb1b10abSAndroid Build Coastguard Worker 162*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_TEST_DECODE_TEST_DRIVER_H_ 163