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 #ifndef VPX_TEST_ENCODE_TEST_DRIVER_H_ 11*fb1b10abSAndroid Build Coastguard Worker #define VPX_TEST_ENCODE_TEST_DRIVER_H_ 12*fb1b10abSAndroid Build Coastguard Worker 13*fb1b10abSAndroid Build Coastguard Worker #include <string> 14*fb1b10abSAndroid Build Coastguard Worker #include <vector> 15*fb1b10abSAndroid Build Coastguard Worker 16*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h" 17*fb1b10abSAndroid Build Coastguard Worker 18*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h" 19*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER 20*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vp8cx.h" 21*fb1b10abSAndroid Build Coastguard Worker #endif 22*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_tpl.h" 23*fb1b10abSAndroid Build Coastguard Worker 24*fb1b10abSAndroid Build Coastguard Worker namespace libvpx_test { 25*fb1b10abSAndroid Build Coastguard Worker 26*fb1b10abSAndroid Build Coastguard Worker class CodecFactory; 27*fb1b10abSAndroid Build Coastguard Worker class VideoSource; 28*fb1b10abSAndroid Build Coastguard Worker 29*fb1b10abSAndroid Build Coastguard Worker enum TestMode { 30*fb1b10abSAndroid Build Coastguard Worker kRealTime, 31*fb1b10abSAndroid Build Coastguard Worker kOnePassGood, 32*fb1b10abSAndroid Build Coastguard Worker kOnePassBest, 33*fb1b10abSAndroid Build Coastguard Worker kTwoPassGood, 34*fb1b10abSAndroid Build Coastguard Worker kTwoPassBest 35*fb1b10abSAndroid Build Coastguard Worker }; 36*fb1b10abSAndroid Build Coastguard Worker 37*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY 38*fb1b10abSAndroid Build Coastguard Worker #define ALL_TEST_MODES ::testing::Values(::libvpx_test::kRealTime) 39*fb1b10abSAndroid Build Coastguard Worker #define ONE_PASS_TEST_MODES ::testing::Values(::libvpx_test::kRealTime) 40*fb1b10abSAndroid Build Coastguard Worker #define ONE_OR_TWO_PASS_TEST_MODES ::testing::Values(::libvpx_test::kRealTime) 41*fb1b10abSAndroid Build Coastguard Worker #else 42*fb1b10abSAndroid Build Coastguard Worker #define ALL_TEST_MODES \ 43*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(::libvpx_test::kRealTime, ::libvpx_test::kOnePassGood, \ 44*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::kOnePassBest, ::libvpx_test::kTwoPassGood, \ 45*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::kTwoPassBest) 46*fb1b10abSAndroid Build Coastguard Worker #define ONE_PASS_TEST_MODES \ 47*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(::libvpx_test::kRealTime, ::libvpx_test::kOnePassGood, \ 48*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::kOnePassBest) 49*fb1b10abSAndroid Build Coastguard Worker 50*fb1b10abSAndroid Build Coastguard Worker #define ONE_OR_TWO_PASS_TEST_MODES \ 51*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(::libvpx_test::kOnePassGood, ::libvpx_test::kTwoPassGood) 52*fb1b10abSAndroid Build Coastguard Worker #endif 53*fb1b10abSAndroid Build Coastguard Worker 54*fb1b10abSAndroid Build Coastguard Worker #define TWO_PASS_TEST_MODES \ 55*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(::libvpx_test::kTwoPassGood, ::libvpx_test::kTwoPassBest) 56*fb1b10abSAndroid Build Coastguard Worker 57*fb1b10abSAndroid Build Coastguard Worker // Provides an object to handle the libvpx get_cx_data() iteration pattern 58*fb1b10abSAndroid Build Coastguard Worker class CxDataIterator { 59*fb1b10abSAndroid Build Coastguard Worker public: CxDataIterator(vpx_codec_ctx_t * encoder)60*fb1b10abSAndroid Build Coastguard Worker explicit CxDataIterator(vpx_codec_ctx_t *encoder) 61*fb1b10abSAndroid Build Coastguard Worker : encoder_(encoder), iter_(nullptr) {} 62*fb1b10abSAndroid Build Coastguard Worker Next()63*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_cx_pkt_t *Next() { 64*fb1b10abSAndroid Build Coastguard Worker return vpx_codec_get_cx_data(encoder_, &iter_); 65*fb1b10abSAndroid Build Coastguard Worker } 66*fb1b10abSAndroid Build Coastguard Worker 67*fb1b10abSAndroid Build Coastguard Worker private: 68*fb1b10abSAndroid Build Coastguard Worker vpx_codec_ctx_t *encoder_; 69*fb1b10abSAndroid Build Coastguard Worker vpx_codec_iter_t iter_; 70*fb1b10abSAndroid Build Coastguard Worker }; 71*fb1b10abSAndroid Build Coastguard Worker 72*fb1b10abSAndroid Build Coastguard Worker // Implements an in-memory store for libvpx twopass statistics 73*fb1b10abSAndroid Build Coastguard Worker class TwopassStatsStore { 74*fb1b10abSAndroid Build Coastguard Worker public: Append(const vpx_codec_cx_pkt_t & pkt)75*fb1b10abSAndroid Build Coastguard Worker void Append(const vpx_codec_cx_pkt_t &pkt) { 76*fb1b10abSAndroid Build Coastguard Worker buffer_.append(reinterpret_cast<char *>(pkt.data.twopass_stats.buf), 77*fb1b10abSAndroid Build Coastguard Worker pkt.data.twopass_stats.sz); 78*fb1b10abSAndroid Build Coastguard Worker } 79*fb1b10abSAndroid Build Coastguard Worker buf()80*fb1b10abSAndroid Build Coastguard Worker vpx_fixed_buf_t buf() { 81*fb1b10abSAndroid Build Coastguard Worker const vpx_fixed_buf_t buf = { &buffer_[0], buffer_.size() }; 82*fb1b10abSAndroid Build Coastguard Worker return buf; 83*fb1b10abSAndroid Build Coastguard Worker } 84*fb1b10abSAndroid Build Coastguard Worker Reset()85*fb1b10abSAndroid Build Coastguard Worker void Reset() { buffer_.clear(); } 86*fb1b10abSAndroid Build Coastguard Worker 87*fb1b10abSAndroid Build Coastguard Worker protected: 88*fb1b10abSAndroid Build Coastguard Worker std::string buffer_; 89*fb1b10abSAndroid Build Coastguard Worker }; 90*fb1b10abSAndroid Build Coastguard Worker 91*fb1b10abSAndroid Build Coastguard Worker // Provides a simplified interface to manage one video encoding pass, given 92*fb1b10abSAndroid Build Coastguard Worker // a configuration and video source. 93*fb1b10abSAndroid Build Coastguard Worker // 94*fb1b10abSAndroid Build Coastguard Worker // TODO(jkoleszar): The exact services it provides and the appropriate 95*fb1b10abSAndroid Build Coastguard Worker // level of abstraction will be fleshed out as more tests are written. 96*fb1b10abSAndroid Build Coastguard Worker class Encoder { 97*fb1b10abSAndroid Build Coastguard Worker public: Encoder(vpx_codec_enc_cfg_t cfg,vpx_enc_deadline_t deadline,const unsigned long init_flags,TwopassStatsStore * stats)98*fb1b10abSAndroid Build Coastguard Worker Encoder(vpx_codec_enc_cfg_t cfg, vpx_enc_deadline_t deadline, 99*fb1b10abSAndroid Build Coastguard Worker const unsigned long init_flags, TwopassStatsStore *stats) 100*fb1b10abSAndroid Build Coastguard Worker : cfg_(cfg), deadline_(deadline), init_flags_(init_flags), stats_(stats) { 101*fb1b10abSAndroid Build Coastguard Worker memset(&encoder_, 0, sizeof(encoder_)); 102*fb1b10abSAndroid Build Coastguard Worker } 103*fb1b10abSAndroid Build Coastguard Worker ~Encoder()104*fb1b10abSAndroid Build Coastguard Worker virtual ~Encoder() { vpx_codec_destroy(&encoder_); } 105*fb1b10abSAndroid Build Coastguard Worker GetCxData()106*fb1b10abSAndroid Build Coastguard Worker CxDataIterator GetCxData() { return CxDataIterator(&encoder_); } 107*fb1b10abSAndroid Build Coastguard Worker 108*fb1b10abSAndroid Build Coastguard Worker void InitEncoder(VideoSource *video); 109*fb1b10abSAndroid Build Coastguard Worker GetPreviewFrame()110*fb1b10abSAndroid Build Coastguard Worker const vpx_image_t *GetPreviewFrame() { 111*fb1b10abSAndroid Build Coastguard Worker return vpx_codec_get_preview_frame(&encoder_); 112*fb1b10abSAndroid Build Coastguard Worker } 113*fb1b10abSAndroid Build Coastguard Worker // This is a thin wrapper around vpx_codec_encode(), so refer to 114*fb1b10abSAndroid Build Coastguard Worker // vpx_encoder.h for its semantics. 115*fb1b10abSAndroid Build Coastguard Worker void EncodeFrame(VideoSource *video, vpx_enc_frame_flags_t frame_flags); 116*fb1b10abSAndroid Build Coastguard Worker 117*fb1b10abSAndroid Build Coastguard Worker // Convenience wrapper for EncodeFrame() EncodeFrame(VideoSource * video)118*fb1b10abSAndroid Build Coastguard Worker void EncodeFrame(VideoSource *video) { EncodeFrame(video, 0); } 119*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,int arg)120*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, int arg) { 121*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 122*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 123*fb1b10abSAndroid Build Coastguard Worker } 124*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,int * arg)125*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, int *arg) { 126*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 127*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 128*fb1b10abSAndroid Build Coastguard Worker } 129*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,struct vpx_scaling_mode * arg)130*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, struct vpx_scaling_mode *arg) { 131*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 132*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 133*fb1b10abSAndroid Build Coastguard Worker } 134*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,struct vpx_svc_layer_id * arg)135*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, struct vpx_svc_layer_id *arg) { 136*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 137*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 138*fb1b10abSAndroid Build Coastguard Worker } 139*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,struct vpx_svc_ref_frame_config * arg)140*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, struct vpx_svc_ref_frame_config *arg) { 141*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 142*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 143*fb1b10abSAndroid Build Coastguard Worker } 144*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,struct vpx_svc_parameters * arg)145*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, struct vpx_svc_parameters *arg) { 146*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 147*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 148*fb1b10abSAndroid Build Coastguard Worker } 149*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,struct vpx_svc_frame_drop * arg)150*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, struct vpx_svc_frame_drop *arg) { 151*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 152*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 153*fb1b10abSAndroid Build Coastguard Worker } 154*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,struct vpx_svc_spatial_layer_sync * arg)155*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, struct vpx_svc_spatial_layer_sync *arg) { 156*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 157*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 158*fb1b10abSAndroid Build Coastguard Worker } 159*fb1b10abSAndroid Build Coastguard Worker 160*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_ENCODER Control(int ctrl_id,vpx_rc_funcs_t * arg)161*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, vpx_rc_funcs_t *arg) { 162*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 163*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 164*fb1b10abSAndroid Build Coastguard Worker } 165*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,VpxTplGopStats * arg)166*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, VpxTplGopStats *arg) { 167*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 168*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 169*fb1b10abSAndroid Build Coastguard Worker } 170*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_ENCODER 171*fb1b10abSAndroid Build Coastguard Worker 172*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER Control(int ctrl_id,vpx_active_map_t * arg)173*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, vpx_active_map_t *arg) { 174*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 175*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 176*fb1b10abSAndroid Build Coastguard Worker } 177*fb1b10abSAndroid Build Coastguard Worker Control(int ctrl_id,vpx_roi_map_t * arg)178*fb1b10abSAndroid Build Coastguard Worker void Control(int ctrl_id, vpx_roi_map_t *arg) { 179*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg); 180*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 181*fb1b10abSAndroid Build Coastguard Worker } 182*fb1b10abSAndroid Build Coastguard Worker #endif Config(const vpx_codec_enc_cfg_t * cfg)183*fb1b10abSAndroid Build Coastguard Worker void Config(const vpx_codec_enc_cfg_t *cfg) { 184*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res = vpx_codec_enc_config_set(&encoder_, cfg); 185*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); 186*fb1b10abSAndroid Build Coastguard Worker cfg_ = *cfg; 187*fb1b10abSAndroid Build Coastguard Worker } 188*fb1b10abSAndroid Build Coastguard Worker set_deadline(vpx_enc_deadline_t deadline)189*fb1b10abSAndroid Build Coastguard Worker void set_deadline(vpx_enc_deadline_t deadline) { deadline_ = deadline; } 190*fb1b10abSAndroid Build Coastguard Worker 191*fb1b10abSAndroid Build Coastguard Worker protected: 192*fb1b10abSAndroid Build Coastguard Worker virtual vpx_codec_iface_t *CodecInterface() const = 0; 193*fb1b10abSAndroid Build Coastguard Worker EncoderError()194*fb1b10abSAndroid Build Coastguard Worker const char *EncoderError() { 195*fb1b10abSAndroid Build Coastguard Worker const char *detail = vpx_codec_error_detail(&encoder_); 196*fb1b10abSAndroid Build Coastguard Worker return detail ? detail : vpx_codec_error(&encoder_); 197*fb1b10abSAndroid Build Coastguard Worker } 198*fb1b10abSAndroid Build Coastguard Worker 199*fb1b10abSAndroid Build Coastguard Worker // Encode an image 200*fb1b10abSAndroid Build Coastguard Worker void EncodeFrameInternal(const VideoSource &video, 201*fb1b10abSAndroid Build Coastguard Worker vpx_enc_frame_flags_t frame_flags); 202*fb1b10abSAndroid Build Coastguard Worker 203*fb1b10abSAndroid Build Coastguard Worker // Flush the encoder on EOS 204*fb1b10abSAndroid Build Coastguard Worker void Flush(); 205*fb1b10abSAndroid Build Coastguard Worker 206*fb1b10abSAndroid Build Coastguard Worker vpx_codec_ctx_t encoder_; 207*fb1b10abSAndroid Build Coastguard Worker vpx_codec_enc_cfg_t cfg_; 208*fb1b10abSAndroid Build Coastguard Worker vpx_enc_deadline_t deadline_; 209*fb1b10abSAndroid Build Coastguard Worker unsigned long init_flags_; 210*fb1b10abSAndroid Build Coastguard Worker TwopassStatsStore *stats_; 211*fb1b10abSAndroid Build Coastguard Worker }; 212*fb1b10abSAndroid Build Coastguard Worker 213*fb1b10abSAndroid Build Coastguard Worker // Common test functionality for all Encoder tests. 214*fb1b10abSAndroid Build Coastguard Worker // 215*fb1b10abSAndroid Build Coastguard Worker // This class is a mixin which provides the main loop common to all 216*fb1b10abSAndroid Build Coastguard Worker // encoder tests. It provides hooks which can be overridden by subclasses 217*fb1b10abSAndroid Build Coastguard Worker // to implement each test's specific behavior, while centralizing the bulk 218*fb1b10abSAndroid Build Coastguard Worker // of the boilerplate. Note that it doesn't inherit the gtest testing 219*fb1b10abSAndroid Build Coastguard Worker // classes directly, so that tests can be parameterized differently. 220*fb1b10abSAndroid Build Coastguard Worker class EncoderTest { 221*fb1b10abSAndroid Build Coastguard Worker protected: EncoderTest(const CodecFactory * codec)222*fb1b10abSAndroid Build Coastguard Worker explicit EncoderTest(const CodecFactory *codec) 223*fb1b10abSAndroid Build Coastguard Worker : codec_(codec), abort_(false), init_flags_(0), frame_flags_(0) { 224*fb1b10abSAndroid Build Coastguard Worker // Default to 1 thread. 225*fb1b10abSAndroid Build Coastguard Worker cfg_.g_threads = 1; 226*fb1b10abSAndroid Build Coastguard Worker } 227*fb1b10abSAndroid Build Coastguard Worker ~EncoderTest()228*fb1b10abSAndroid Build Coastguard Worker virtual ~EncoderTest() {} 229*fb1b10abSAndroid Build Coastguard Worker 230*fb1b10abSAndroid Build Coastguard Worker // Initialize the cfg_ member with the default configuration. 231*fb1b10abSAndroid Build Coastguard Worker void InitializeConfig(); 232*fb1b10abSAndroid Build Coastguard Worker 233*fb1b10abSAndroid Build Coastguard Worker // Map the TestMode enum to the deadline_ and passes_ variables. 234*fb1b10abSAndroid Build Coastguard Worker void SetMode(TestMode mode); 235*fb1b10abSAndroid Build Coastguard Worker 236*fb1b10abSAndroid Build Coastguard Worker // Set encoder flag. set_init_flags(unsigned long flag)237*fb1b10abSAndroid Build Coastguard Worker void set_init_flags(unsigned long flag) { // NOLINT(runtime/int) 238*fb1b10abSAndroid Build Coastguard Worker init_flags_ = flag; 239*fb1b10abSAndroid Build Coastguard Worker } 240*fb1b10abSAndroid Build Coastguard Worker 241*fb1b10abSAndroid Build Coastguard Worker // Main loop 242*fb1b10abSAndroid Build Coastguard Worker virtual void RunLoop(VideoSource *video); 243*fb1b10abSAndroid Build Coastguard Worker 244*fb1b10abSAndroid Build Coastguard Worker // Hook to be called at the beginning of a pass. BeginPassHook(unsigned int)245*fb1b10abSAndroid Build Coastguard Worker virtual void BeginPassHook(unsigned int /*pass*/) {} 246*fb1b10abSAndroid Build Coastguard Worker 247*fb1b10abSAndroid Build Coastguard Worker // Hook to be called at the end of a pass. EndPassHook()248*fb1b10abSAndroid Build Coastguard Worker virtual void EndPassHook() {} 249*fb1b10abSAndroid Build Coastguard Worker 250*fb1b10abSAndroid Build Coastguard Worker // Hook to be called before encoding a frame. PreEncodeFrameHook(VideoSource *)251*fb1b10abSAndroid Build Coastguard Worker virtual void PreEncodeFrameHook(VideoSource * /*video*/) {} PreEncodeFrameHook(VideoSource *,Encoder *)252*fb1b10abSAndroid Build Coastguard Worker virtual void PreEncodeFrameHook(VideoSource * /*video*/, 253*fb1b10abSAndroid Build Coastguard Worker Encoder * /*encoder*/) {} 254*fb1b10abSAndroid Build Coastguard Worker PreDecodeFrameHook(VideoSource *,Decoder *)255*fb1b10abSAndroid Build Coastguard Worker virtual void PreDecodeFrameHook(VideoSource * /*video*/, 256*fb1b10abSAndroid Build Coastguard Worker Decoder * /*decoder*/) {} 257*fb1b10abSAndroid Build Coastguard Worker PostEncodeFrameHook(Encoder *)258*fb1b10abSAndroid Build Coastguard Worker virtual void PostEncodeFrameHook(Encoder * /*encoder*/) {} 259*fb1b10abSAndroid Build Coastguard Worker 260*fb1b10abSAndroid Build Coastguard Worker // Hook to be called on every compressed data packet. FramePktHook(const vpx_codec_cx_pkt_t *)261*fb1b10abSAndroid Build Coastguard Worker virtual void FramePktHook(const vpx_codec_cx_pkt_t * /*pkt*/) {} 262*fb1b10abSAndroid Build Coastguard Worker 263*fb1b10abSAndroid Build Coastguard Worker // Hook to be called on every PSNR packet. PSNRPktHook(const vpx_codec_cx_pkt_t *)264*fb1b10abSAndroid Build Coastguard Worker virtual void PSNRPktHook(const vpx_codec_cx_pkt_t * /*pkt*/) {} 265*fb1b10abSAndroid Build Coastguard Worker 266*fb1b10abSAndroid Build Coastguard Worker // Hook to be called on every first pass stats packet. StatsPktHook(const vpx_codec_cx_pkt_t *)267*fb1b10abSAndroid Build Coastguard Worker virtual void StatsPktHook(const vpx_codec_cx_pkt_t * /*pkt*/) {} 268*fb1b10abSAndroid Build Coastguard Worker 269*fb1b10abSAndroid Build Coastguard Worker // Hook to determine whether the encode loop should continue. Continue()270*fb1b10abSAndroid Build Coastguard Worker virtual bool Continue() const { 271*fb1b10abSAndroid Build Coastguard Worker return !(::testing::Test::HasFatalFailure() || abort_); 272*fb1b10abSAndroid Build Coastguard Worker } 273*fb1b10abSAndroid Build Coastguard Worker 274*fb1b10abSAndroid Build Coastguard Worker const CodecFactory *codec_; 275*fb1b10abSAndroid Build Coastguard Worker // Hook to determine whether to decode frame after encoding DoDecode()276*fb1b10abSAndroid Build Coastguard Worker virtual bool DoDecode() const { return true; } 277*fb1b10abSAndroid Build Coastguard Worker 278*fb1b10abSAndroid Build Coastguard Worker // Hook to handle encode/decode mismatch 279*fb1b10abSAndroid Build Coastguard Worker virtual void MismatchHook(const vpx_image_t *img1, const vpx_image_t *img2); 280*fb1b10abSAndroid Build Coastguard Worker 281*fb1b10abSAndroid Build Coastguard Worker // Hook to be called on every decompressed frame. DecompressedFrameHook(const vpx_image_t &,vpx_codec_pts_t)282*fb1b10abSAndroid Build Coastguard Worker virtual void DecompressedFrameHook(const vpx_image_t & /*img*/, 283*fb1b10abSAndroid Build Coastguard Worker vpx_codec_pts_t /*pts*/) {} 284*fb1b10abSAndroid Build Coastguard Worker 285*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 VideoSource &,Decoder * decoder)286*fb1b10abSAndroid Build Coastguard Worker virtual bool HandleDecodeResult(const vpx_codec_err_t res_dec, 287*fb1b10abSAndroid Build Coastguard Worker const VideoSource & /*video*/, 288*fb1b10abSAndroid Build Coastguard Worker Decoder *decoder) { 289*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError(); 290*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK == res_dec; 291*fb1b10abSAndroid Build Coastguard Worker } 292*fb1b10abSAndroid Build Coastguard Worker 293*fb1b10abSAndroid Build Coastguard Worker // Hook that can modify the encoder's output data MutateEncoderOutputHook(const vpx_codec_cx_pkt_t * pkt)294*fb1b10abSAndroid Build Coastguard Worker virtual const vpx_codec_cx_pkt_t *MutateEncoderOutputHook( 295*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_cx_pkt_t *pkt) { 296*fb1b10abSAndroid Build Coastguard Worker return pkt; 297*fb1b10abSAndroid Build Coastguard Worker } 298*fb1b10abSAndroid Build Coastguard Worker 299*fb1b10abSAndroid Build Coastguard Worker bool abort_; 300*fb1b10abSAndroid Build Coastguard Worker vpx_codec_enc_cfg_t cfg_; 301*fb1b10abSAndroid Build Coastguard Worker vpx_codec_dec_cfg_t dec_cfg_; 302*fb1b10abSAndroid Build Coastguard Worker unsigned int passes_; 303*fb1b10abSAndroid Build Coastguard Worker vpx_enc_deadline_t deadline_; 304*fb1b10abSAndroid Build Coastguard Worker TwopassStatsStore stats_; 305*fb1b10abSAndroid Build Coastguard Worker unsigned long init_flags_; 306*fb1b10abSAndroid Build Coastguard Worker vpx_enc_frame_flags_t frame_flags_; 307*fb1b10abSAndroid Build Coastguard Worker }; 308*fb1b10abSAndroid Build Coastguard Worker 309*fb1b10abSAndroid Build Coastguard Worker } // namespace libvpx_test 310*fb1b10abSAndroid Build Coastguard Worker 311*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_TEST_ENCODE_TEST_DRIVER_H_ 312