xref: /aosp_15_r20/external/libvpx/test/encode_test_driver.cc (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 
11*fb1b10abSAndroid Build Coastguard Worker #include <memory>
12*fb1b10abSAndroid Build Coastguard Worker #include <string>
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "test/codec_factory.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "test/decode_test_driver.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "test/encode_test_driver.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "test/video_source.h"
22*fb1b10abSAndroid Build Coastguard Worker 
23*fb1b10abSAndroid Build Coastguard Worker namespace libvpx_test {
InitEncoder(VideoSource * video)24*fb1b10abSAndroid Build Coastguard Worker void Encoder::InitEncoder(VideoSource *video) {
25*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_err_t res;
26*fb1b10abSAndroid Build Coastguard Worker   const vpx_image_t *img = video->img();
27*fb1b10abSAndroid Build Coastguard Worker 
28*fb1b10abSAndroid Build Coastguard Worker   if (video->img() && !encoder_.priv) {
29*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_w = img->d_w;
30*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_h = img->d_h;
31*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_timebase = video->timebase();
32*fb1b10abSAndroid Build Coastguard Worker     cfg_.rc_twopass_stats_in = stats_->buf();
33*fb1b10abSAndroid Build Coastguard Worker 
34*fb1b10abSAndroid Build Coastguard Worker     res = vpx_codec_enc_init(&encoder_, CodecInterface(), &cfg_, init_flags_);
35*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
36*fb1b10abSAndroid Build Coastguard Worker 
37*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_ENCODER
38*fb1b10abSAndroid Build Coastguard Worker     if (CodecInterface() == &vpx_codec_vp9_cx_algo) {
39*fb1b10abSAndroid Build Coastguard Worker       // Default to 1 tile column for VP9.
40*fb1b10abSAndroid Build Coastguard Worker       const int log2_tile_columns = 0;
41*fb1b10abSAndroid Build Coastguard Worker       res = vpx_codec_control_(&encoder_, VP9E_SET_TILE_COLUMNS,
42*fb1b10abSAndroid Build Coastguard Worker                                log2_tile_columns);
43*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
44*fb1b10abSAndroid Build Coastguard Worker     } else
45*fb1b10abSAndroid Build Coastguard Worker #endif
46*fb1b10abSAndroid Build Coastguard Worker     {
47*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP8_ENCODER
48*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(&vpx_codec_vp8_cx_algo, CodecInterface())
49*fb1b10abSAndroid Build Coastguard Worker           << "Unknown Codec Interface";
50*fb1b10abSAndroid Build Coastguard Worker #endif
51*fb1b10abSAndroid Build Coastguard Worker     }
52*fb1b10abSAndroid Build Coastguard Worker   }
53*fb1b10abSAndroid Build Coastguard Worker }
54*fb1b10abSAndroid Build Coastguard Worker 
EncodeFrame(VideoSource * video,const vpx_enc_frame_flags_t frame_flags)55*fb1b10abSAndroid Build Coastguard Worker void Encoder::EncodeFrame(VideoSource *video,
56*fb1b10abSAndroid Build Coastguard Worker                           const vpx_enc_frame_flags_t frame_flags) {
57*fb1b10abSAndroid Build Coastguard Worker   if (video->img()) {
58*fb1b10abSAndroid Build Coastguard Worker     EncodeFrameInternal(*video, frame_flags);
59*fb1b10abSAndroid Build Coastguard Worker   } else {
60*fb1b10abSAndroid Build Coastguard Worker     Flush();
61*fb1b10abSAndroid Build Coastguard Worker   }
62*fb1b10abSAndroid Build Coastguard Worker 
63*fb1b10abSAndroid Build Coastguard Worker   // Handle twopass stats
64*fb1b10abSAndroid Build Coastguard Worker   CxDataIterator iter = GetCxData();
65*fb1b10abSAndroid Build Coastguard Worker 
66*fb1b10abSAndroid Build Coastguard Worker   while (const vpx_codec_cx_pkt_t *pkt = iter.Next()) {
67*fb1b10abSAndroid Build Coastguard Worker     if (pkt->kind != VPX_CODEC_STATS_PKT) continue;
68*fb1b10abSAndroid Build Coastguard Worker 
69*fb1b10abSAndroid Build Coastguard Worker     stats_->Append(*pkt);
70*fb1b10abSAndroid Build Coastguard Worker   }
71*fb1b10abSAndroid Build Coastguard Worker }
72*fb1b10abSAndroid Build Coastguard Worker 
EncodeFrameInternal(const VideoSource & video,const vpx_enc_frame_flags_t frame_flags)73*fb1b10abSAndroid Build Coastguard Worker void Encoder::EncodeFrameInternal(const VideoSource &video,
74*fb1b10abSAndroid Build Coastguard Worker                                   const vpx_enc_frame_flags_t frame_flags) {
75*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_err_t res;
76*fb1b10abSAndroid Build Coastguard Worker   const vpx_image_t *img = video.img();
77*fb1b10abSAndroid Build Coastguard Worker 
78*fb1b10abSAndroid Build Coastguard Worker   // Handle frame resizing
79*fb1b10abSAndroid Build Coastguard Worker   if (cfg_.g_w != img->d_w || cfg_.g_h != img->d_h) {
80*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_w = img->d_w;
81*fb1b10abSAndroid Build Coastguard Worker     cfg_.g_h = img->d_h;
82*fb1b10abSAndroid Build Coastguard Worker     res = vpx_codec_enc_config_set(&encoder_, &cfg_);
83*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
84*fb1b10abSAndroid Build Coastguard Worker   }
85*fb1b10abSAndroid Build Coastguard Worker 
86*fb1b10abSAndroid Build Coastguard Worker   // Encode the frame
87*fb1b10abSAndroid Build Coastguard Worker   API_REGISTER_STATE_CHECK(res = vpx_codec_encode(&encoder_, img, video.pts(),
88*fb1b10abSAndroid Build Coastguard Worker                                                   video.duration(), frame_flags,
89*fb1b10abSAndroid Build Coastguard Worker                                                   deadline_));
90*fb1b10abSAndroid Build Coastguard Worker   ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
91*fb1b10abSAndroid Build Coastguard Worker }
92*fb1b10abSAndroid Build Coastguard Worker 
Flush()93*fb1b10abSAndroid Build Coastguard Worker void Encoder::Flush() {
94*fb1b10abSAndroid Build Coastguard Worker   const vpx_codec_err_t res =
95*fb1b10abSAndroid Build Coastguard Worker       vpx_codec_encode(&encoder_, nullptr, 0, 0, 0, deadline_);
96*fb1b10abSAndroid Build Coastguard Worker   if (!encoder_.priv)
97*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(VPX_CODEC_ERROR, res) << EncoderError();
98*fb1b10abSAndroid Build Coastguard Worker   else
99*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
100*fb1b10abSAndroid Build Coastguard Worker }
101*fb1b10abSAndroid Build Coastguard Worker 
InitializeConfig()102*fb1b10abSAndroid Build Coastguard Worker void EncoderTest::InitializeConfig() {
103*fb1b10abSAndroid Build Coastguard Worker   const vpx_codec_err_t res = codec_->DefaultEncoderConfig(&cfg_, 0);
104*fb1b10abSAndroid Build Coastguard Worker   dec_cfg_ = vpx_codec_dec_cfg_t();
105*fb1b10abSAndroid Build Coastguard Worker   ASSERT_EQ(VPX_CODEC_OK, res);
106*fb1b10abSAndroid Build Coastguard Worker }
107*fb1b10abSAndroid Build Coastguard Worker 
SetMode(TestMode mode)108*fb1b10abSAndroid Build Coastguard Worker void EncoderTest::SetMode(TestMode mode) {
109*fb1b10abSAndroid Build Coastguard Worker   switch (mode) {
110*fb1b10abSAndroid Build Coastguard Worker     case kRealTime: deadline_ = VPX_DL_REALTIME; break;
111*fb1b10abSAndroid Build Coastguard Worker 
112*fb1b10abSAndroid Build Coastguard Worker     case kOnePassGood:
113*fb1b10abSAndroid Build Coastguard Worker     case kTwoPassGood: deadline_ = VPX_DL_GOOD_QUALITY; break;
114*fb1b10abSAndroid Build Coastguard Worker 
115*fb1b10abSAndroid Build Coastguard Worker     case kOnePassBest:
116*fb1b10abSAndroid Build Coastguard Worker     case kTwoPassBest: deadline_ = VPX_DL_BEST_QUALITY; break;
117*fb1b10abSAndroid Build Coastguard Worker 
118*fb1b10abSAndroid Build Coastguard Worker     default: ASSERT_TRUE(false) << "Unexpected mode " << mode;
119*fb1b10abSAndroid Build Coastguard Worker   }
120*fb1b10abSAndroid Build Coastguard Worker 
121*fb1b10abSAndroid Build Coastguard Worker   if (mode == kTwoPassGood || mode == kTwoPassBest) {
122*fb1b10abSAndroid Build Coastguard Worker     passes_ = 2;
123*fb1b10abSAndroid Build Coastguard Worker   } else {
124*fb1b10abSAndroid Build Coastguard Worker     passes_ = 1;
125*fb1b10abSAndroid Build Coastguard Worker   }
126*fb1b10abSAndroid Build Coastguard Worker }
127*fb1b10abSAndroid Build Coastguard Worker // The function should return "true" most of the time, therefore no early
128*fb1b10abSAndroid Build Coastguard Worker // break-out is implemented within the match checking process.
compare_img(const vpx_image_t * img1,const vpx_image_t * img2)129*fb1b10abSAndroid Build Coastguard Worker static bool compare_img(const vpx_image_t *img1, const vpx_image_t *img2) {
130*fb1b10abSAndroid Build Coastguard Worker   bool match = (img1->fmt == img2->fmt) && (img1->cs == img2->cs) &&
131*fb1b10abSAndroid Build Coastguard Worker                (img1->d_w == img2->d_w) && (img1->d_h == img2->d_h);
132*fb1b10abSAndroid Build Coastguard Worker 
133*fb1b10abSAndroid Build Coastguard Worker   if (!match) return false;
134*fb1b10abSAndroid Build Coastguard Worker 
135*fb1b10abSAndroid Build Coastguard Worker   const unsigned int width_y = img1->d_w;
136*fb1b10abSAndroid Build Coastguard Worker   const unsigned int height_y = img1->d_h;
137*fb1b10abSAndroid Build Coastguard Worker   unsigned int i;
138*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < height_y; ++i) {
139*fb1b10abSAndroid Build Coastguard Worker     match = (memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y],
140*fb1b10abSAndroid Build Coastguard Worker                     img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y],
141*fb1b10abSAndroid Build Coastguard Worker                     width_y) == 0) &&
142*fb1b10abSAndroid Build Coastguard Worker             match;
143*fb1b10abSAndroid Build Coastguard Worker   }
144*fb1b10abSAndroid Build Coastguard Worker   const unsigned int width_uv = (img1->d_w + 1) >> 1;
145*fb1b10abSAndroid Build Coastguard Worker   const unsigned int height_uv = (img1->d_h + 1) >> 1;
146*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < height_uv; ++i) {
147*fb1b10abSAndroid Build Coastguard Worker     match = (memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U],
148*fb1b10abSAndroid Build Coastguard Worker                     img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U],
149*fb1b10abSAndroid Build Coastguard Worker                     width_uv) == 0) &&
150*fb1b10abSAndroid Build Coastguard Worker             match;
151*fb1b10abSAndroid Build Coastguard Worker   }
152*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < height_uv; ++i) {
153*fb1b10abSAndroid Build Coastguard Worker     match = (memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V],
154*fb1b10abSAndroid Build Coastguard Worker                     img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V],
155*fb1b10abSAndroid Build Coastguard Worker                     width_uv) == 0) &&
156*fb1b10abSAndroid Build Coastguard Worker             match;
157*fb1b10abSAndroid Build Coastguard Worker   }
158*fb1b10abSAndroid Build Coastguard Worker   return match;
159*fb1b10abSAndroid Build Coastguard Worker }
160*fb1b10abSAndroid Build Coastguard Worker 
MismatchHook(const vpx_image_t *,const vpx_image_t *)161*fb1b10abSAndroid Build Coastguard Worker void EncoderTest::MismatchHook(const vpx_image_t * /*img1*/,
162*fb1b10abSAndroid Build Coastguard Worker                                const vpx_image_t * /*img2*/) {
163*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(0) << "Encode/Decode mismatch found";
164*fb1b10abSAndroid Build Coastguard Worker }
165*fb1b10abSAndroid Build Coastguard Worker 
RunLoop(VideoSource * video)166*fb1b10abSAndroid Build Coastguard Worker void EncoderTest::RunLoop(VideoSource *video) {
167*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_dec_cfg_t dec_cfg = vpx_codec_dec_cfg_t();
168*fb1b10abSAndroid Build Coastguard Worker 
169*fb1b10abSAndroid Build Coastguard Worker   stats_.Reset();
170*fb1b10abSAndroid Build Coastguard Worker 
171*fb1b10abSAndroid Build Coastguard Worker   ASSERT_TRUE(passes_ == 1 || passes_ == 2);
172*fb1b10abSAndroid Build Coastguard Worker   for (unsigned int pass = 0; pass < passes_; pass++) {
173*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_pts_t last_pts = 0;
174*fb1b10abSAndroid Build Coastguard Worker 
175*fb1b10abSAndroid Build Coastguard Worker     if (passes_ == 1) {
176*fb1b10abSAndroid Build Coastguard Worker       cfg_.g_pass = VPX_RC_ONE_PASS;
177*fb1b10abSAndroid Build Coastguard Worker     } else if (pass == 0) {
178*fb1b10abSAndroid Build Coastguard Worker       cfg_.g_pass = VPX_RC_FIRST_PASS;
179*fb1b10abSAndroid Build Coastguard Worker     } else {
180*fb1b10abSAndroid Build Coastguard Worker       cfg_.g_pass = VPX_RC_LAST_PASS;
181*fb1b10abSAndroid Build Coastguard Worker     }
182*fb1b10abSAndroid Build Coastguard Worker 
183*fb1b10abSAndroid Build Coastguard Worker     BeginPassHook(pass);
184*fb1b10abSAndroid Build Coastguard Worker     std::unique_ptr<Encoder> encoder(
185*fb1b10abSAndroid Build Coastguard Worker         codec_->CreateEncoder(cfg_, deadline_, init_flags_, &stats_));
186*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(encoder.get(), nullptr);
187*fb1b10abSAndroid Build Coastguard Worker 
188*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(video->Begin());
189*fb1b10abSAndroid Build Coastguard Worker     encoder->InitEncoder(video);
190*fb1b10abSAndroid Build Coastguard Worker     ASSERT_FALSE(::testing::Test::HasFatalFailure());
191*fb1b10abSAndroid Build Coastguard Worker 
192*fb1b10abSAndroid Build Coastguard Worker     unsigned long dec_init_flags = 0;  // NOLINT
193*fb1b10abSAndroid Build Coastguard Worker     // Use fragment decoder if encoder outputs partitions.
194*fb1b10abSAndroid Build Coastguard Worker     // NOTE: fragment decoder and partition encoder are only supported by VP8.
195*fb1b10abSAndroid Build Coastguard Worker     if (init_flags_ & VPX_CODEC_USE_OUTPUT_PARTITION) {
196*fb1b10abSAndroid Build Coastguard Worker       dec_init_flags |= VPX_CODEC_USE_INPUT_FRAGMENTS;
197*fb1b10abSAndroid Build Coastguard Worker     }
198*fb1b10abSAndroid Build Coastguard Worker     std::unique_ptr<Decoder> decoder(
199*fb1b10abSAndroid Build Coastguard Worker         codec_->CreateDecoder(dec_cfg, dec_init_flags));
200*fb1b10abSAndroid Build Coastguard Worker     bool again;
201*fb1b10abSAndroid Build Coastguard Worker     for (again = true; again; video->Next()) {
202*fb1b10abSAndroid Build Coastguard Worker       again = (video->img() != nullptr);
203*fb1b10abSAndroid Build Coastguard Worker 
204*fb1b10abSAndroid Build Coastguard Worker       PreEncodeFrameHook(video);
205*fb1b10abSAndroid Build Coastguard Worker       PreEncodeFrameHook(video, encoder.get());
206*fb1b10abSAndroid Build Coastguard Worker       encoder->EncodeFrame(video, frame_flags_);
207*fb1b10abSAndroid Build Coastguard Worker 
208*fb1b10abSAndroid Build Coastguard Worker       PostEncodeFrameHook(encoder.get());
209*fb1b10abSAndroid Build Coastguard Worker 
210*fb1b10abSAndroid Build Coastguard Worker       CxDataIterator iter = encoder->GetCxData();
211*fb1b10abSAndroid Build Coastguard Worker 
212*fb1b10abSAndroid Build Coastguard Worker       bool has_cxdata = false;
213*fb1b10abSAndroid Build Coastguard Worker       bool has_dxdata = false;
214*fb1b10abSAndroid Build Coastguard Worker       while (const vpx_codec_cx_pkt_t *pkt = iter.Next()) {
215*fb1b10abSAndroid Build Coastguard Worker         pkt = MutateEncoderOutputHook(pkt);
216*fb1b10abSAndroid Build Coastguard Worker         again = true;
217*fb1b10abSAndroid Build Coastguard Worker         switch (pkt->kind) {
218*fb1b10abSAndroid Build Coastguard Worker           case VPX_CODEC_CX_FRAME_PKT:
219*fb1b10abSAndroid Build Coastguard Worker             has_cxdata = true;
220*fb1b10abSAndroid Build Coastguard Worker             if (decoder != nullptr && DoDecode()) {
221*fb1b10abSAndroid Build Coastguard Worker               PreDecodeFrameHook(video, decoder.get());
222*fb1b10abSAndroid Build Coastguard Worker               vpx_codec_err_t res_dec = decoder->DecodeFrame(
223*fb1b10abSAndroid Build Coastguard Worker                   (const uint8_t *)pkt->data.frame.buf, pkt->data.frame.sz);
224*fb1b10abSAndroid Build Coastguard Worker 
225*fb1b10abSAndroid Build Coastguard Worker               if (!HandleDecodeResult(res_dec, *video, decoder.get())) break;
226*fb1b10abSAndroid Build Coastguard Worker 
227*fb1b10abSAndroid Build Coastguard Worker               has_dxdata = true;
228*fb1b10abSAndroid Build Coastguard Worker             }
229*fb1b10abSAndroid Build Coastguard Worker             ASSERT_GE(pkt->data.frame.pts, last_pts);
230*fb1b10abSAndroid Build Coastguard Worker             last_pts = pkt->data.frame.pts;
231*fb1b10abSAndroid Build Coastguard Worker             FramePktHook(pkt);
232*fb1b10abSAndroid Build Coastguard Worker             break;
233*fb1b10abSAndroid Build Coastguard Worker 
234*fb1b10abSAndroid Build Coastguard Worker           case VPX_CODEC_PSNR_PKT: PSNRPktHook(pkt); break;
235*fb1b10abSAndroid Build Coastguard Worker 
236*fb1b10abSAndroid Build Coastguard Worker           case VPX_CODEC_STATS_PKT: StatsPktHook(pkt); break;
237*fb1b10abSAndroid Build Coastguard Worker 
238*fb1b10abSAndroid Build Coastguard Worker           default: break;
239*fb1b10abSAndroid Build Coastguard Worker         }
240*fb1b10abSAndroid Build Coastguard Worker       }
241*fb1b10abSAndroid Build Coastguard Worker 
242*fb1b10abSAndroid Build Coastguard Worker       // Flush the decoder when there are no more fragments.
243*fb1b10abSAndroid Build Coastguard Worker       if ((init_flags_ & VPX_CODEC_USE_OUTPUT_PARTITION) && has_dxdata) {
244*fb1b10abSAndroid Build Coastguard Worker         const vpx_codec_err_t res_dec = decoder->DecodeFrame(nullptr, 0);
245*fb1b10abSAndroid Build Coastguard Worker         if (!HandleDecodeResult(res_dec, *video, decoder.get())) break;
246*fb1b10abSAndroid Build Coastguard Worker       }
247*fb1b10abSAndroid Build Coastguard Worker 
248*fb1b10abSAndroid Build Coastguard Worker       if (has_dxdata && has_cxdata) {
249*fb1b10abSAndroid Build Coastguard Worker         const vpx_image_t *img_enc = encoder->GetPreviewFrame();
250*fb1b10abSAndroid Build Coastguard Worker         DxDataIterator dec_iter = decoder->GetDxData();
251*fb1b10abSAndroid Build Coastguard Worker         const vpx_image_t *img_dec = dec_iter.Next();
252*fb1b10abSAndroid Build Coastguard Worker         if (img_enc && img_dec) {
253*fb1b10abSAndroid Build Coastguard Worker           const bool res = compare_img(img_enc, img_dec);
254*fb1b10abSAndroid Build Coastguard Worker           if (!res) {  // Mismatch
255*fb1b10abSAndroid Build Coastguard Worker             MismatchHook(img_enc, img_dec);
256*fb1b10abSAndroid Build Coastguard Worker           }
257*fb1b10abSAndroid Build Coastguard Worker         }
258*fb1b10abSAndroid Build Coastguard Worker         if (img_dec) DecompressedFrameHook(*img_dec, video->pts());
259*fb1b10abSAndroid Build Coastguard Worker       }
260*fb1b10abSAndroid Build Coastguard Worker       if (!Continue()) break;
261*fb1b10abSAndroid Build Coastguard Worker     }
262*fb1b10abSAndroid Build Coastguard Worker 
263*fb1b10abSAndroid Build Coastguard Worker     EndPassHook();
264*fb1b10abSAndroid Build Coastguard Worker 
265*fb1b10abSAndroid Build Coastguard Worker     if (!Continue()) break;
266*fb1b10abSAndroid Build Coastguard Worker   }
267*fb1b10abSAndroid Build Coastguard Worker }
268*fb1b10abSAndroid Build Coastguard Worker 
269*fb1b10abSAndroid Build Coastguard Worker }  // namespace libvpx_test
270