| Index: source/libvpx/test/encode_test_driver.cc
|
| ===================================================================
|
| --- source/libvpx/test/encode_test_driver.cc (revision 293588)
|
| +++ source/libvpx/test/encode_test_driver.cc (working copy)
|
| @@ -17,6 +17,21 @@
|
| #include "third_party/googletest/src/include/gtest/gtest.h"
|
|
|
| namespace libvpx_test {
|
| +void Encoder::InitEncoder(VideoSource *video) {
|
| + vpx_codec_err_t res;
|
| + const vpx_image_t *img = video->img();
|
| +
|
| + if (video->img() && !encoder_.priv) {
|
| + cfg_.g_w = img->d_w;
|
| + cfg_.g_h = img->d_h;
|
| + cfg_.g_timebase = video->timebase();
|
| + cfg_.rc_twopass_stats_in = stats_->buf();
|
| + res = vpx_codec_enc_init(&encoder_, CodecInterface(), &cfg_,
|
| + init_flags_);
|
| + ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
|
| + }
|
| +}
|
| +
|
| void Encoder::EncodeFrame(VideoSource *video, const unsigned long frame_flags) {
|
| if (video->img())
|
| EncodeFrameInternal(*video, frame_flags);
|
| @@ -39,17 +54,6 @@
|
| vpx_codec_err_t res;
|
| const vpx_image_t *img = video.img();
|
|
|
| - // Handle first frame initialization
|
| - if (!encoder_.priv) {
|
| - cfg_.g_w = img->d_w;
|
| - cfg_.g_h = img->d_h;
|
| - cfg_.g_timebase = video.timebase();
|
| - cfg_.rc_twopass_stats_in = stats_->buf();
|
| - res = vpx_codec_enc_init(&encoder_, CodecInterface(), &cfg_,
|
| - init_flags_);
|
| - ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
|
| - }
|
| -
|
| // Handle frame resizing
|
| if (cfg_.g_w != img->d_w || cfg_.g_h != img->d_h) {
|
| cfg_.g_w = img->d_w;
|
| @@ -60,8 +64,7 @@
|
|
|
| // Encode the frame
|
| API_REGISTER_STATE_CHECK(
|
| - res = vpx_codec_encode(&encoder_,
|
| - video.img(), video.pts(), video.duration(),
|
| + res = vpx_codec_encode(&encoder_, img, video.pts(), video.duration(),
|
| frame_flags, deadline_));
|
| ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
|
| }
|
| @@ -77,6 +80,7 @@
|
|
|
| void EncoderTest::InitializeConfig() {
|
| const vpx_codec_err_t res = codec_->DefaultEncoderConfig(&cfg_, 0);
|
| + dec_cfg_ = vpx_codec_dec_cfg_t();
|
| ASSERT_EQ(VPX_CODEC_OK, res);
|
| }
|
|
|
| @@ -158,9 +162,18 @@
|
| Encoder* const encoder = codec_->CreateEncoder(cfg_, deadline_, init_flags_,
|
| &stats_);
|
| ASSERT_TRUE(encoder != NULL);
|
| - Decoder* const decoder = codec_->CreateDecoder(dec_cfg, 0);
|
| +
|
| + video->Begin();
|
| + encoder->InitEncoder(video);
|
| +
|
| + unsigned long dec_init_flags = 0; // NOLINT
|
| + // Use fragment decoder if encoder outputs partitions.
|
| + // NOTE: fragment decoder and partition encoder are only supported by VP8.
|
| + if (init_flags_ & VPX_CODEC_USE_OUTPUT_PARTITION)
|
| + dec_init_flags |= VPX_CODEC_USE_INPUT_FRAGMENTS;
|
| + Decoder* const decoder = codec_->CreateDecoder(dec_cfg, dec_init_flags, 0);
|
| bool again;
|
| - for (again = true, video->Begin(); again; video->Next()) {
|
| + for (again = true; again; video->Next()) {
|
| again = (video->img() != NULL);
|
|
|
| PreEncodeFrameHook(video);
|
| @@ -200,6 +213,13 @@
|
| }
|
| }
|
|
|
| + // Flush the decoder when there are no more fragments.
|
| + if ((init_flags_ & VPX_CODEC_USE_OUTPUT_PARTITION) && has_dxdata) {
|
| + const vpx_codec_err_t res_dec = decoder->DecodeFrame(NULL, 0);
|
| + if (!HandleDecodeResult(res_dec, *video, decoder))
|
| + break;
|
| + }
|
| +
|
| if (has_dxdata && has_cxdata) {
|
| const vpx_image_t *img_enc = encoder->GetPreviewFrame();
|
| DxDataIterator dec_iter = decoder->GetDxData();
|
|
|