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(); |