| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 codec_enc_.g_w = kWidth; | 56 codec_enc_.g_w = kWidth; |
| 57 codec_enc_.g_h = kHeight; | 57 codec_enc_.g_h = kHeight; |
| 58 codec_enc_.g_timebase.num = 1; | 58 codec_enc_.g_timebase.num = 1; |
| 59 codec_enc_.g_timebase.den = 60; | 59 codec_enc_.g_timebase.den = 60; |
| 60 codec_enc_.kf_min_dist = 100; | 60 codec_enc_.kf_min_dist = 100; |
| 61 codec_enc_.kf_max_dist = 100; | 61 codec_enc_.kf_max_dist = 100; |
| 62 | 62 |
| 63 vpx_codec_dec_cfg_t dec_cfg = vpx_codec_dec_cfg_t(); | 63 vpx_codec_dec_cfg_t dec_cfg = vpx_codec_dec_cfg_t(); |
| 64 VP9CodecFactory codec_factory; | 64 VP9CodecFactory codec_factory; |
| 65 decoder_ = codec_factory.CreateDecoder(dec_cfg, 0); | 65 decoder_ = codec_factory.CreateDecoder(dec_cfg, 0); |
| 66 |
| 67 tile_columns_ = 0; |
| 68 tile_rows_ = 0; |
| 66 } | 69 } |
| 67 | 70 |
| 68 virtual void TearDown() { | 71 virtual void TearDown() { |
| 69 ReleaseEncoder(); | 72 ReleaseEncoder(); |
| 70 delete(decoder_); | 73 delete(decoder_); |
| 71 } | 74 } |
| 72 | 75 |
| 73 void InitializeEncoder() { | 76 void InitializeEncoder() { |
| 74 const vpx_codec_err_t res = | 77 const vpx_codec_err_t res = |
| 75 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); | 78 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
| 76 EXPECT_EQ(VPX_CODEC_OK, res); | 79 EXPECT_EQ(VPX_CODEC_OK, res); |
| 77 vpx_codec_control(&codec_, VP8E_SET_CPUUSED, 4); // Make the test faster | 80 vpx_codec_control(&codec_, VP8E_SET_CPUUSED, 4); // Make the test faster |
| 81 vpx_codec_control(&codec_, VP9E_SET_TILE_COLUMNS, tile_columns_); |
| 82 vpx_codec_control(&codec_, VP9E_SET_TILE_ROWS, tile_rows_); |
| 78 codec_initialized_ = true; | 83 codec_initialized_ = true; |
| 79 } | 84 } |
| 80 | 85 |
| 81 void ReleaseEncoder() { | 86 void ReleaseEncoder() { |
| 82 vpx_svc_release(&svc_); | 87 vpx_svc_release(&svc_); |
| 83 if (codec_initialized_) vpx_codec_destroy(&codec_); | 88 if (codec_initialized_) vpx_codec_destroy(&codec_); |
| 84 codec_initialized_ = false; | 89 codec_initialized_ = false; |
| 85 } | 90 } |
| 86 | 91 |
| 87 void GetStatsData(std::string *const stats_buf) { | 92 void GetStatsData(std::string *const stats_buf) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 101 void Pass1EncodeNFrames(const int n, const int layers, | 106 void Pass1EncodeNFrames(const int n, const int layers, |
| 102 std::string *const stats_buf) { | 107 std::string *const stats_buf) { |
| 103 vpx_codec_err_t res; | 108 vpx_codec_err_t res; |
| 104 | 109 |
| 105 ASSERT_GT(n, 0); | 110 ASSERT_GT(n, 0); |
| 106 ASSERT_GT(layers, 0); | 111 ASSERT_GT(layers, 0); |
| 107 svc_.spatial_layers = layers; | 112 svc_.spatial_layers = layers; |
| 108 codec_enc_.g_pass = VPX_RC_FIRST_PASS; | 113 codec_enc_.g_pass = VPX_RC_FIRST_PASS; |
| 109 InitializeEncoder(); | 114 InitializeEncoder(); |
| 110 | 115 |
| 111 libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight, | 116 libvpx_test::I420VideoSource video(test_file_name_, |
| 117 codec_enc_.g_w, codec_enc_.g_h, |
| 112 codec_enc_.g_timebase.den, | 118 codec_enc_.g_timebase.den, |
| 113 codec_enc_.g_timebase.num, 0, 30); | 119 codec_enc_.g_timebase.num, 0, 30); |
| 114 video.Begin(); | 120 video.Begin(); |
| 115 | 121 |
| 116 for (int i = 0; i < n; ++i) { | 122 for (int i = 0; i < n; ++i) { |
| 117 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), | 123 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), |
| 118 video.duration(), VPX_DL_GOOD_QUALITY); | 124 video.duration(), VPX_DL_GOOD_QUALITY); |
| 119 ASSERT_EQ(VPX_CODEC_OK, res); | 125 ASSERT_EQ(VPX_CODEC_OK, res); |
| 120 GetStatsData(stats_buf); | 126 GetStatsData(stats_buf); |
| 121 video.Next(); | 127 video.Next(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 svc_.spatial_layers = layers; | 175 svc_.spatial_layers = layers; |
| 170 codec_enc_.rc_target_bitrate = 500; | 176 codec_enc_.rc_target_bitrate = 500; |
| 171 if (codec_enc_.g_pass == VPX_RC_LAST_PASS) { | 177 if (codec_enc_.g_pass == VPX_RC_LAST_PASS) { |
| 172 ASSERT_TRUE(stats_buf != NULL); | 178 ASSERT_TRUE(stats_buf != NULL); |
| 173 ASSERT_GT(stats_buf->size(), 0U); | 179 ASSERT_GT(stats_buf->size(), 0U); |
| 174 codec_enc_.rc_twopass_stats_in.buf = &(*stats_buf)[0]; | 180 codec_enc_.rc_twopass_stats_in.buf = &(*stats_buf)[0]; |
| 175 codec_enc_.rc_twopass_stats_in.sz = stats_buf->size(); | 181 codec_enc_.rc_twopass_stats_in.sz = stats_buf->size(); |
| 176 } | 182 } |
| 177 InitializeEncoder(); | 183 InitializeEncoder(); |
| 178 | 184 |
| 179 libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight, | 185 libvpx_test::I420VideoSource video(test_file_name_, |
| 186 codec_enc_.g_w, codec_enc_.g_h, |
| 180 codec_enc_.g_timebase.den, | 187 codec_enc_.g_timebase.den, |
| 181 codec_enc_.g_timebase.num, 0, 30); | 188 codec_enc_.g_timebase.num, 0, 30); |
| 182 video.Begin(); | 189 video.Begin(); |
| 183 | 190 |
| 184 for (int i = 0; i < n; ++i) { | 191 for (int i = 0; i < n; ++i) { |
| 185 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), | 192 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), |
| 186 video.duration(), VPX_DL_GOOD_QUALITY); | 193 video.duration(), VPX_DL_GOOD_QUALITY); |
| 187 ASSERT_EQ(VPX_CODEC_OK, res); | 194 ASSERT_EQ(VPX_CODEC_OK, res); |
| 188 StoreFrames(n, outputs, &frame_received); | 195 StoreFrames(n, outputs, &frame_received); |
| 189 video.Next(); | 196 video.Next(); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 } | 310 } |
| 304 } | 311 } |
| 305 | 312 |
| 306 SvcContext svc_; | 313 SvcContext svc_; |
| 307 vpx_codec_ctx_t codec_; | 314 vpx_codec_ctx_t codec_; |
| 308 struct vpx_codec_enc_cfg codec_enc_; | 315 struct vpx_codec_enc_cfg codec_enc_; |
| 309 vpx_codec_iface_t *codec_iface_; | 316 vpx_codec_iface_t *codec_iface_; |
| 310 std::string test_file_name_; | 317 std::string test_file_name_; |
| 311 bool codec_initialized_; | 318 bool codec_initialized_; |
| 312 Decoder *decoder_; | 319 Decoder *decoder_; |
| 320 int tile_columns_; |
| 321 int tile_rows_; |
| 313 }; | 322 }; |
| 314 | 323 |
| 315 TEST_F(SvcTest, SvcInit) { | 324 TEST_F(SvcTest, SvcInit) { |
| 316 // test missing parameters | 325 // test missing parameters |
| 317 vpx_codec_err_t res = vpx_svc_init(NULL, &codec_, codec_iface_, &codec_enc_); | 326 vpx_codec_err_t res = vpx_svc_init(NULL, &codec_, codec_iface_, &codec_enc_); |
| 318 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); | 327 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
| 319 res = vpx_svc_init(&svc_, NULL, codec_iface_, &codec_enc_); | 328 res = vpx_svc_init(&svc_, NULL, codec_iface_, &codec_enc_); |
| 320 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); | 329 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
| 321 res = vpx_svc_init(&svc_, &codec_, NULL, &codec_enc_); | 330 res = vpx_svc_init(&svc_, &codec_, NULL, &codec_enc_); |
| 322 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); | 331 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]); | 739 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]); |
| 731 | 740 |
| 732 vpx_fixed_buf base_layer[5]; | 741 vpx_fixed_buf base_layer[5]; |
| 733 for (int i = 0; i < 5; ++i) | 742 for (int i = 0; i < 5; ++i) |
| 734 base_layer[i] = outputs[i * 2]; | 743 base_layer[i] = outputs[i * 2]; |
| 735 | 744 |
| 736 DecodeNFrames(&base_layer[0], 5); | 745 DecodeNFrames(&base_layer[0], 5); |
| 737 FreeBitstreamBuffers(&outputs[0], 10); | 746 FreeBitstreamBuffers(&outputs[0], 10); |
| 738 } | 747 } |
| 739 | 748 |
| 749 TEST_F(SvcTest, TwoPassEncode2TemporalLayersWithTiles) { |
| 750 // First pass encode |
| 751 std::string stats_buf; |
| 752 vpx_svc_set_options(&svc_, "scale-factors=1/1"); |
| 753 svc_.temporal_layers = 2; |
| 754 Pass1EncodeNFrames(10, 1, &stats_buf); |
| 755 |
| 756 // Second pass encode |
| 757 codec_enc_.g_pass = VPX_RC_LAST_PASS; |
| 758 svc_.temporal_layers = 2; |
| 759 vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1"); |
| 760 codec_enc_.g_w = 704; |
| 761 codec_enc_.g_h = 144; |
| 762 tile_columns_ = 1; |
| 763 tile_rows_ = 1; |
| 764 vpx_fixed_buf outputs[10]; |
| 765 memset(&outputs[0], 0, sizeof(outputs)); |
| 766 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]); |
| 767 DecodeNFrames(&outputs[0], 10); |
| 768 FreeBitstreamBuffers(&outputs[0], 10); |
| 769 } |
| 770 |
| 771 TEST_F(SvcTest, |
| 772 TwoPassEncode2TemporalLayersWithMultipleFrameContextsAndTiles) { |
| 773 // First pass encode |
| 774 std::string stats_buf; |
| 775 vpx_svc_set_options(&svc_, "scale-factors=1/1"); |
| 776 svc_.temporal_layers = 2; |
| 777 Pass1EncodeNFrames(10, 1, &stats_buf); |
| 778 |
| 779 // Second pass encode |
| 780 codec_enc_.g_pass = VPX_RC_LAST_PASS; |
| 781 svc_.temporal_layers = 2; |
| 782 codec_enc_.g_error_resilient = 0; |
| 783 codec_enc_.g_w = 704; |
| 784 codec_enc_.g_h = 144; |
| 785 tile_columns_ = 1; |
| 786 tile_rows_ = 1; |
| 787 vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1 " |
| 788 "multi-frame-contexts=1"); |
| 789 vpx_fixed_buf outputs[10]; |
| 790 memset(&outputs[0], 0, sizeof(outputs)); |
| 791 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]); |
| 792 DecodeNFrames(&outputs[0], 10); |
| 793 FreeBitstreamBuffers(&outputs[0], 10); |
| 794 } |
| 795 |
| 740 } // namespace | 796 } // namespace |
| OLD | NEW |