diff options
Diffstat (limited to 'test/encode_test_driver.cc')
-rw-r--r-- | test/encode_test_driver.cc | 91 |
1 files changed, 55 insertions, 36 deletions
diff --git a/test/encode_test_driver.cc b/test/encode_test_driver.cc index 56339cae0..709831efe 100644 --- a/test/encode_test_driver.cc +++ b/test/encode_test_driver.cc @@ -7,11 +7,11 @@ * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ -#include "vpx_config.h" + +#include "./vpx_config.h" +#include "test/codec_factory.h" #include "test/encode_test_driver.h" -#if CONFIG_VP8_DECODER #include "test/decode_test_driver.h" -#endif #include "test/register_state_check.h" #include "test/video_source.h" #include "third_party/googletest/src/include/gtest/gtest.h" @@ -45,7 +45,7 @@ void Encoder::EncodeFrameInternal(const VideoSource &video, cfg_.g_h = img->d_h; cfg_.g_timebase = video.timebase(); cfg_.rc_twopass_stats_in = stats_->buf(); - res = vpx_codec_enc_init(&encoder_, &vpx_codec_vp8_cx_algo, &cfg_, + res = vpx_codec_enc_init(&encoder_, CodecInterface(), &cfg_, init_flags_); ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); } @@ -72,6 +72,11 @@ void Encoder::Flush() { ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError(); } +void EncoderTest::InitializeConfig() { + const vpx_codec_err_t res = codec_->DefaultEncoderConfig(&cfg_, 0); + ASSERT_EQ(VPX_CODEC_OK, res); +} + void EncoderTest::SetMode(TestMode mode) { switch (mode) { case kRealTime: @@ -109,29 +114,33 @@ static bool compare_img(const vpx_image_t *img1, const unsigned int height_y = img1->d_h; unsigned int i; for (i = 0; i < height_y; ++i) - match = ( memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y], - img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y], - width_y) == 0) && match; + match = (memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y], + img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y], + width_y) == 0) && match; const unsigned int width_uv = (img1->d_w + 1) >> 1; const unsigned int height_uv = (img1->d_h + 1) >> 1; for (i = 0; i < height_uv; ++i) - match = ( memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U], - img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U], - width_uv) == 0) && match; + match = (memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U], + img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U], + width_uv) == 0) && match; for (i = 0; i < height_uv; ++i) - match = ( memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V], - img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V], - width_uv) == 0) && match; + match = (memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V], + img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V], + width_uv) == 0) && match; return match; } +void EncoderTest::MismatchHook(const vpx_image_t *img1, + const vpx_image_t *img2) { + ASSERT_TRUE(0) << "Encode/Decode mismatch found"; +} + void EncoderTest::RunLoop(VideoSource *video) { -#if CONFIG_VP8_DECODER vpx_codec_dec_cfg_t dec_cfg = {0}; -#endif stats_.Reset(); + ASSERT_TRUE(passes_ == 1 || passes_ == 2); for (unsigned int pass = 0; pass < passes_; pass++) { last_pts_ = 0; @@ -143,31 +152,34 @@ void EncoderTest::RunLoop(VideoSource *video) { cfg_.g_pass = VPX_RC_LAST_PASS; BeginPassHook(pass); - Encoder encoder(cfg_, deadline_, init_flags_, &stats_); -#if CONFIG_VP8_DECODER - Decoder decoder(dec_cfg, 0); - bool has_cxdata = false; -#endif + Encoder* const encoder = codec_->CreateEncoder(cfg_, deadline_, init_flags_, + &stats_); + ASSERT_TRUE(encoder != NULL); + Decoder* const decoder = codec_->CreateDecoder(dec_cfg, 0); bool again; for (again = true, video->Begin(); again; video->Next()) { - again = video->img() != NULL; + again = (video->img() != NULL); PreEncodeFrameHook(video); - PreEncodeFrameHook(video, &encoder); - encoder.EncodeFrame(video, frame_flags_); + PreEncodeFrameHook(video, encoder); + encoder->EncodeFrame(video, frame_flags_); - CxDataIterator iter = encoder.GetCxData(); + CxDataIterator iter = encoder->GetCxData(); + bool has_cxdata = false; + bool has_dxdata = false; while (const vpx_codec_cx_pkt_t *pkt = iter.Next()) { + pkt = MutateEncoderOutputHook(pkt); again = true; - switch (pkt->kind) { case VPX_CODEC_CX_FRAME_PKT: -#if CONFIG_VP8_DECODER has_cxdata = true; - decoder.DecodeFrame((const uint8_t*)pkt->data.frame.buf, - pkt->data.frame.sz); -#endif + if (decoder && DoDecode()) { + vpx_codec_err_t res_dec = decoder->DecodeFrame( + (const uint8_t*)pkt->data.frame.buf, pkt->data.frame.sz); + ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError(); + has_dxdata = true; + } ASSERT_GE(pkt->data.frame.pts, last_pts_); last_pts_ = pkt->data.frame.pts; FramePktHook(pkt); @@ -182,25 +194,32 @@ void EncoderTest::RunLoop(VideoSource *video) { } } -#if CONFIG_VP8_DECODER - if (has_cxdata) { - const vpx_image_t *img_enc = encoder.GetPreviewFrame(); - DxDataIterator dec_iter = decoder.GetDxData(); + if (has_dxdata && has_cxdata) { + const vpx_image_t *img_enc = encoder->GetPreviewFrame(); + DxDataIterator dec_iter = decoder->GetDxData(); const vpx_image_t *img_dec = dec_iter.Next(); - if(img_enc && img_dec) { + if (img_enc && img_dec) { const bool res = compare_img(img_enc, img_dec); - ASSERT_TRUE(res)<< "Encoder/Decoder mismatch found."; + if (!res) { // Mismatch + MismatchHook(img_enc, img_dec); + } } + if (img_dec) + DecompressedFrameHook(*img_dec, video->pts()); } -#endif if (!Continue()) break; } EndPassHook(); + if (decoder) + delete decoder; + delete encoder; + if (!Continue()) break; } } + } // namespace libvpx_test |