xref: /aosp_15_r20/external/libvpx/test/encode_test_driver.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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