1d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org/* 2d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 3d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * 4d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * Use of this source code is governed by a BSD-style license 5d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * that can be found in the LICENSE file in the root of the source 6d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * tree. An additional intellectual property rights grant can be found 7d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * in the file PATENTS. All contributing project authors may 8d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * be found in the AUTHORS file in the root of the source tree. 9d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org */ 10d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 11d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include <string> 12d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h" 13d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "test/codec_factory.h" 14d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "test/decode_test_driver.h" 15d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "test/i420_video_source.h" 16ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 17ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org#include "vp9/decoder/vp9_decoder.h" 18ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 19d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "vpx/svc_context.h" 20d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "vpx/vp8cx.h" 21d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "vpx/vpx_encoder.h" 22d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 23d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgnamespace { 24d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 25d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgusing libvpx_test::CodecFactory; 26d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgusing libvpx_test::Decoder; 27ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgusing libvpx_test::DxDataIterator; 28d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgusing libvpx_test::VP9CodecFactory; 29d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 30d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgclass SvcTest : public ::testing::Test { 31d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org protected: 32d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org static const uint32_t kWidth = 352; 33d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org static const uint32_t kHeight = 288; 34d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 35d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org SvcTest() 36d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org : codec_iface_(0), 37d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org test_file_name_("hantro_collage_w352h288.yuv"), 38d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org codec_initialized_(false), 39d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org decoder_(0) { 40d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org memset(&svc_, 0, sizeof(svc_)); 41d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org memset(&codec_, 0, sizeof(codec_)); 42d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org memset(&codec_enc_, 0, sizeof(codec_enc_)); 43d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org } 44d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 45d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org virtual ~SvcTest() {} 46d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 47d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org virtual void SetUp() { 48d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org svc_.log_level = SVC_LOG_DEBUG; 49d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org svc_.log_print = 0; 50d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 51d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org codec_iface_ = vpx_codec_vp9_cx(); 52d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org const vpx_codec_err_t res = 53d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org vpx_codec_enc_config_default(codec_iface_, &codec_enc_, 0); 54d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 55d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 56d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org codec_enc_.g_w = kWidth; 57d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org codec_enc_.g_h = kHeight; 58d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org codec_enc_.g_timebase.num = 1; 59d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org codec_enc_.g_timebase.den = 60; 60d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org codec_enc_.kf_min_dist = 100; 61d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org codec_enc_.kf_max_dist = 100; 62d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 63d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_codec_dec_cfg_t dec_cfg = vpx_codec_dec_cfg_t(); 64d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org VP9CodecFactory codec_factory; 65d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org decoder_ = codec_factory.CreateDecoder(dec_cfg, 0); 66d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org } 67d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 68d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org virtual void TearDown() { 69ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ReleaseEncoder(); 70d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org delete(decoder_); 71ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 72ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 73ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org void InitializeEncoder() { 74ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org const vpx_codec_err_t res = 75ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 76ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 7787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vpx_codec_control(&codec_, VP8E_SET_CPUUSED, 4); // Make the test faster 78ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_initialized_ = true; 79ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 80ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 81ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org void ReleaseEncoder() { 82ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_svc_release(&svc_); 83d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org if (codec_initialized_) vpx_codec_destroy(&codec_); 84ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_initialized_ = false; 85ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 86ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 8787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org void GetStatsData(std::string *const stats_buf) { 8887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vpx_codec_iter_t iter = NULL; 8987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const vpx_codec_cx_pkt_t *cx_pkt; 9087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 9187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org while ((cx_pkt = vpx_codec_get_cx_data(&codec_, &iter)) != NULL) { 9287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (cx_pkt->kind == VPX_CODEC_STATS_PKT) { 9387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_GT(cx_pkt->data.twopass_stats.sz, 0U); 9487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASSERT_TRUE(cx_pkt->data.twopass_stats.buf != NULL); 9587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org stats_buf->append(static_cast<char*>(cx_pkt->data.twopass_stats.buf), 9687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org cx_pkt->data.twopass_stats.sz); 9787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 9887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 9987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 10087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 101ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org void Pass1EncodeNFrames(const int n, const int layers, 102ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org std::string *const stats_buf) { 103ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_codec_err_t res; 104ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 105ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(n, 0); 106ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(layers, 0); 107ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org svc_.spatial_layers = layers; 108ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_FIRST_PASS; 109ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 110ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 111ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight, 112ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_timebase.den, 113ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_timebase.num, 0, 30); 114ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org video.Begin(); 115ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 116ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org for (int i = 0; i < n; ++i) { 117ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 118ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org video.duration(), VPX_DL_GOOD_QUALITY); 119ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_EQ(VPX_CODEC_OK, res); 12087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org GetStatsData(stats_buf); 121ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org video.Next(); 122ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 123ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 124d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Flush encoder and test EOS packet. 125ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org res = vpx_svc_encode(&svc_, &codec_, NULL, video.pts(), 126ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org video.duration(), VPX_DL_GOOD_QUALITY); 12787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASSERT_EQ(VPX_CODEC_OK, res); 12887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org GetStatsData(stats_buf); 129ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 130ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ReleaseEncoder(); 131ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 132ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 133ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org void StoreFrames(const size_t max_frame_received, 134ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org struct vpx_fixed_buf *const outputs, 135ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org size_t *const frame_received) { 13687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vpx_codec_iter_t iter = NULL; 13787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const vpx_codec_cx_pkt_t *cx_pkt; 13887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 13987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org while ((cx_pkt = vpx_codec_get_cx_data(&codec_, &iter)) != NULL) { 14087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (cx_pkt->kind == VPX_CODEC_CX_FRAME_PKT) { 14187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const size_t frame_size = cx_pkt->data.frame.sz; 14287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 14387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_GT(frame_size, 0U); 14487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASSERT_TRUE(cx_pkt->data.frame.buf != NULL); 14587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASSERT_LT(*frame_received, max_frame_received); 14687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 14787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (*frame_received == 0) 14887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_EQ(1, !!(cx_pkt->data.frame.flags & VPX_FRAME_IS_KEY)); 14987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 15087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org outputs[*frame_received].buf = malloc(frame_size + 16); 15187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASSERT_TRUE(outputs[*frame_received].buf != NULL); 15287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org memcpy(outputs[*frame_received].buf, cx_pkt->data.frame.buf, 15387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org frame_size); 15487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org outputs[*frame_received].sz = frame_size; 15587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ++(*frame_received); 156ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 157ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 158ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 159ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 160ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org void Pass2EncodeNFrames(std::string *const stats_buf, 161ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org const int n, const int layers, 162ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org struct vpx_fixed_buf *const outputs) { 163ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_codec_err_t res; 164ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org size_t frame_received = 0; 165ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 166ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_TRUE(outputs != NULL); 167ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(n, 0); 168ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(layers, 0); 169ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org svc_.spatial_layers = layers; 170ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.rc_target_bitrate = 500; 171ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org if (codec_enc_.g_pass == VPX_RC_LAST_PASS) { 172ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_TRUE(stats_buf != NULL); 173ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(stats_buf->size(), 0U); 174ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.rc_twopass_stats_in.buf = &(*stats_buf)[0]; 175ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.rc_twopass_stats_in.sz = stats_buf->size(); 176ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 177ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 178ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 179ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight, 180ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_timebase.den, 181ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_timebase.num, 0, 30); 182ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org video.Begin(); 183ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 184ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org for (int i = 0; i < n; ++i) { 185ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 186ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org video.duration(), VPX_DL_GOOD_QUALITY); 187ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_EQ(VPX_CODEC_OK, res); 188ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org StoreFrames(n, outputs, &frame_received); 189ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org video.Next(); 190ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 191ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 192d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Flush encoder. 193ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org res = vpx_svc_encode(&svc_, &codec_, NULL, 0, 194ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org video.duration(), VPX_DL_GOOD_QUALITY); 195ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 196ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org StoreFrames(n, outputs, &frame_received); 197ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 198d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org EXPECT_EQ(frame_received, static_cast<size_t>(n)); 199ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 200ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ReleaseEncoder(); 201ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 202ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 203ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org void DecodeNFrames(const struct vpx_fixed_buf *const inputs, const int n) { 204ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org int decoded_frames = 0; 205ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org int received_frames = 0; 206ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 207ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_TRUE(inputs != NULL); 208ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(n, 0); 209ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 210ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org for (int i = 0; i < n; ++i) { 211ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_TRUE(inputs[i].buf != NULL); 212ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(inputs[i].sz, 0U); 213ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org const vpx_codec_err_t res_dec = 214ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org decoder_->DecodeFrame(static_cast<const uint8_t *>(inputs[i].buf), 215ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org inputs[i].sz); 216ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError(); 217ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ++decoded_frames; 218ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 219ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DxDataIterator dec_iter = decoder_->GetDxData(); 220d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org while (dec_iter.Next() != NULL) { 221ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ++received_frames; 222ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 223ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 224ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org EXPECT_EQ(decoded_frames, n); 225ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org EXPECT_EQ(received_frames, n); 226ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 227ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 228d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org void DropLayersAndMakeItVP9Comaptible(struct vpx_fixed_buf *const inputs, 229d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const int num_super_frames, 230d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const int remained_spatial_layers, 231d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const bool is_multiple_frame_contexts) { 232ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_TRUE(inputs != NULL); 233ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(num_super_frames, 0); 234d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ASSERT_GT(remained_spatial_layers, 0); 235ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 236ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org for (int i = 0; i < num_super_frames; ++i) { 237ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org uint32_t frame_sizes[8] = {0}; 238ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org int frame_count = 0; 239ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org int frames_found = 0; 240ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org int frame; 241ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_TRUE(inputs[i].buf != NULL); 242ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(inputs[i].sz, 0U); 243ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 244ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_codec_err_t res = 245ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vp9_parse_superframe_index(static_cast<const uint8_t*>(inputs[i].buf), 246ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org inputs[i].sz, frame_sizes, &frame_count, 247ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org NULL, NULL); 248ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_EQ(VPX_CODEC_OK, res); 249ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 250d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (frame_count == 0) { 251d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // There's no super frame but only a single frame. 252d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ASSERT_EQ(1, remained_spatial_layers); 253d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (is_multiple_frame_contexts) { 254d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Make a new super frame. 255d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org uint8_t marker = 0xc1; 256d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org unsigned int mask; 257d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org int mag; 258d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 259d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Choose the magnitude. 260d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (mag = 0, mask = 0xff; mag < 4; ++mag) { 261d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (inputs[i].sz < mask) 262d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org break; 263d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org mask <<= 8; 264d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org mask |= 0xff; 265d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 266d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org marker |= mag << 3; 267d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org int index_sz = 2 + (mag + 1) * 2; 268d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 269d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org inputs[i].buf = realloc(inputs[i].buf, inputs[i].sz + index_sz + 16); 270d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ASSERT_TRUE(inputs[i].buf != NULL); 271d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org uint8_t *frame_data = static_cast<uint8_t*>(inputs[i].buf); 272d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_data[0] &= ~2; // Set the show_frame flag to 0. 273d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_data += inputs[i].sz; 274d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Add an one byte frame with show_existing_frame. 275d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org *frame_data++ = 0x88; 276d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 277d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Write the super frame index. 278d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org *frame_data++ = marker; 279d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 280d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_sizes[0] = inputs[i].sz; 281d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_sizes[1] = 1; 282d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (int j = 0; j < 2; ++j) { 283d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org unsigned int this_sz = frame_sizes[j]; 284d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (int k = 0; k <= mag; k++) { 285d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org *frame_data++ = this_sz & 0xff; 286d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org this_sz >>= 8; 287d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 288d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 289d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org *frame_data++ = marker; 290d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org inputs[i].sz += index_sz + 1; 291ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 292d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } else { 293d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Found a super frame. 294d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org uint8_t *frame_data = static_cast<uint8_t*>(inputs[i].buf); 295d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org uint8_t *frame_start = frame_data; 296d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (frame = 0; frame < frame_count; ++frame) { 297d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Looking for a visible frame. 298d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (frame_data[0] & 0x02) { 299d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ++frames_found; 300d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (frames_found == remained_spatial_layers) 301d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org break; 302d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 303d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_data += frame_sizes[frame]; 304d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 305d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ASSERT_LT(frame, frame_count) << "Couldn't find a visible frame. " 306d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org << "remained_spatial_layers: " << remained_spatial_layers 307d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org << " super_frame: " << i 308d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org << " is_multiple_frame_context: " << is_multiple_frame_contexts; 309d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (frame == frame_count - 1 && !is_multiple_frame_contexts) 310d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org continue; 311d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 312ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org frame_data += frame_sizes[frame]; 313d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 314d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // We need to add one more frame for multiple frame contexts. 315d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (is_multiple_frame_contexts) 316d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ++frame; 317d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org uint8_t marker = 318d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org static_cast<const uint8_t*>(inputs[i].buf)[inputs[i].sz - 1]; 319d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const uint32_t mag = ((marker >> 3) & 0x3) + 1; 320d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const size_t index_sz = 2 + mag * frame_count; 321d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const size_t new_index_sz = 2 + mag * (frame + 1); 322d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org marker &= 0x0f8; 323d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org marker |= frame; 324d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 325d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Copy existing frame sizes. 326d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memmove(frame_data + (is_multiple_frame_contexts ? 2 : 1), 327d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_start + inputs[i].sz - index_sz + 1, new_index_sz - 2); 328d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (is_multiple_frame_contexts) { 329d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Add a one byte frame with flag show_existing_frame. 330d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org *frame_data++ = 0x88 | (remained_spatial_layers - 1); 331d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 332d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // New marker. 333d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_data[0] = marker; 334d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_data += (mag * (frame + 1) + 1); 335d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 336d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (is_multiple_frame_contexts) { 337d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Write the frame size for the one byte frame. 338d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_data -= mag; 339d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org *frame_data++ = 1; 340d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (uint32_t j = 1; j < mag; ++j) { 341d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org *frame_data++ = 0; 342d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 343d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 344d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 345d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org *frame_data++ = marker; 346d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org inputs[i].sz = frame_data - frame_start; 347d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 348d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (is_multiple_frame_contexts) { 349d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Change the show frame flag to 0 for all frames. 350d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (int j = 0; j < frame; ++j) { 351d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_start[0] &= ~2; 352d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org frame_start += frame_sizes[j]; 353d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 354d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 355ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 356ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 357ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 358ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 359ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org void FreeBitstreamBuffers(struct vpx_fixed_buf *const inputs, const int n) { 360ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_TRUE(inputs != NULL); 361ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org ASSERT_GT(n, 0); 362ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 363ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org for (int i = 0; i < n; ++i) { 364ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org free(inputs[i].buf); 365ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org inputs[i].buf = NULL; 366ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org inputs[i].sz = 0; 367ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org } 368d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org } 369d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 370d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org SvcContext svc_; 371d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org vpx_codec_ctx_t codec_; 372d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org struct vpx_codec_enc_cfg codec_enc_; 373d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org vpx_codec_iface_t *codec_iface_; 374d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org std::string test_file_name_; 375d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org bool codec_initialized_; 376d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org Decoder *decoder_; 377d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org}; 378d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 379d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgTEST_F(SvcTest, SvcInit) { 380d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org // test missing parameters 381d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org vpx_codec_err_t res = vpx_svc_init(NULL, &codec_, codec_iface_, &codec_enc_); 382d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 383d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_init(&svc_, NULL, codec_iface_, &codec_enc_); 384d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 385d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, NULL, &codec_enc_); 386d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 387d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 388d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, codec_iface_, NULL); 389d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 390d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 391d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org svc_.spatial_layers = 6; // too many layers 392d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, codec_iface_, &codec_enc_); 393d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 394d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 395d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org svc_.spatial_layers = 0; // use default layers 396ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 397d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_SS_DEFAULT_LAYERS, svc_.spatial_layers); 398d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 399d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 400d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgTEST_F(SvcTest, InitTwoLayers) { 401d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org svc_.spatial_layers = 2; 402ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 403d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 404d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 405d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgTEST_F(SvcTest, InvalidOptions) { 406d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org vpx_codec_err_t res = vpx_svc_set_options(&svc_, NULL); 407d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 408d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 409d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "not-an-option=1"); 410d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 411d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 412d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 413d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 414d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 415d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgTEST_F(SvcTest, SetLayersOption) { 416d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_codec_err_t res = vpx_svc_set_options(&svc_, "spatial-layers=3"); 417d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 418ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 419d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(3, svc_.spatial_layers); 420d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 421d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 422d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgTEST_F(SvcTest, SetMultipleOptions) { 423e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org vpx_codec_err_t res = 424d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "spatial-layers=2 scale-factors=1/3,2/3"); 425d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 426ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 427d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(2, svc_.spatial_layers); 428d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 429d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 430d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgTEST_F(SvcTest, SetScaleFactorsOption) { 431d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org svc_.spatial_layers = 2; 432d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org vpx_codec_err_t res = 433d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=not-scale-factors"); 434d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 435d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 436d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 437d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 43887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "scale-factors=1/3, 3*3"); 439d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 44087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 44187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 442d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 44387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "scale-factors=1/3"); 444d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 445d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 446d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 447d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 44887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "scale-factors=1/3,2/3"); 44987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 450ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 451d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 452d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 45387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgTEST_F(SvcTest, SetQuantizersOption) { 45487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org svc_.spatial_layers = 2; 45587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vpx_codec_err_t res = vpx_svc_set_options(&svc_, "max-quantizers=nothing"); 456ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 457ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 458ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 459ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org 46087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "min-quantizers=nothing"); 461ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 462ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 463ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 464ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org 46587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "max-quantizers=40"); 46687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 46787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 468d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 469d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 47087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "min-quantizers=40"); 47187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 47287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 473d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 474d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 47587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "max-quantizers=30,30 min-quantizers=40,40"); 476411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 477411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 478411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 479411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org 48087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "max-quantizers=40,40 min-quantizers=30,30"); 481ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 482d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 483d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 48487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgTEST_F(SvcTest, SetAutoAltRefOption) { 48587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org svc_.spatial_layers = 5; 48687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vpx_codec_err_t res = vpx_svc_set_options(&svc_, "auto-alt-refs=none"); 48787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 48887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 489d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 490d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 49187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "auto-alt-refs=1,1,1,1,0"); 492d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 493d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 494d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 495d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 49687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=0,1,1,1,0"); 497ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org InitializeEncoder(); 498d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 499d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 500d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// Test that decoder can handle an SVC frame as the first frame in a sequence. 501ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgTEST_F(SvcTest, OnePassEncodeOneFrame) { 502ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_ONE_PASS; 503ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_fixed_buf output = {0}; 504ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass2EncodeNFrames(NULL, 1, 2, &output); 505ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&output, 1); 506ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org FreeBitstreamBuffers(&output, 1); 507d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 508d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 509ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgTEST_F(SvcTest, OnePassEncodeThreeFrames) { 510ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_ONE_PASS; 511ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_fixed_buf outputs[3]; 512ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 513ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass2EncodeNFrames(NULL, 3, 2, &outputs[0]); 514ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 3); 515ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 3); 516d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 517d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 518ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode10Frames) { 51988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org // First pass encode 52088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org std::string stats_buf; 521ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass1EncodeNFrames(10, 2, &stats_buf); 522ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 523ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // Second pass encode 524ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 525ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_fixed_buf outputs[10]; 526ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 527ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]); 528ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 529ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 530ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org} 531ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 532ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode20FramesWithAltRef) { 533ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // First pass encode 534ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org std::string stats_buf; 535ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass1EncodeNFrames(20, 2, &stats_buf); 536ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 537ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // Second pass encode 538ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 539ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1,1"); 540ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_fixed_buf outputs[20]; 541ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 542ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 20, 2, &outputs[0]); 543ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 20); 544ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 20); 545ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org} 54693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 547d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode2SpatialLayersDecodeBaseLayerOnly) { 548ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // First pass encode 549ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org std::string stats_buf; 550ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass1EncodeNFrames(10, 2, &stats_buf); 55193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 55288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org // Second pass encode 55388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 554ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1,1"); 555ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_fixed_buf outputs[10]; 556ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 557ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]); 558d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 1, false); 559ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 560ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 561ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org} 56293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 563d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode5SpatialLayersDecode54321Layers) { 564ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // First pass encode 565ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org std::string stats_buf; 566ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass1EncodeNFrames(10, 5, &stats_buf); 56793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 568ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // Second pass encode 569ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 570ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=0,1,1,1,0"); 571ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_fixed_buf outputs[10]; 572ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 573ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 5, &outputs[0]); 574ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 575ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 576d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 4, false); 577ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 578d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 3, false); 579ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 580d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 2, false); 581ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 582d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 1, false); 583ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 584ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 585ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 586ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org} 58793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 588ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode2SNRLayers) { 589ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // First pass encode 590ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org std::string stats_buf; 591ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=1/1,1/1"); 592ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass1EncodeNFrames(20, 2, &stats_buf); 593e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 594ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // Second pass encode 595ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 596ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_svc_set_options(&svc_, 597ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org "auto-alt-refs=1,1 scale-factors=1/1,1/1"); 598ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_fixed_buf outputs[20]; 599ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 600ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 20, 2, &outputs[0]); 601ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 20); 602ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 20); 603ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org} 604e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 605ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode3SNRLayersDecode321Layers) { 606ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // First pass encode 607ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org std::string stats_buf; 608ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=1/1,1/1,1/1"); 609ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass1EncodeNFrames(20, 3, &stats_buf); 610e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 611ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org // Second pass encode 612ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 613ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_svc_set_options(&svc_, 614ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org "auto-alt-refs=1,1,1 scale-factors=1/1,1/1,1/1"); 615ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org vpx_fixed_buf outputs[20]; 616ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 617ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 20, 3, &outputs[0]); 618ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 20); 619d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 20, 2, false); 620ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 20); 621d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 20, 1, false); 622ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org DecodeNFrames(&outputs[0], 20); 623ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org 624ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 20); 62593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org} 62693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 627d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, SetMultipleFrameContextsOption) { 628d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.spatial_layers = 5; 629d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_codec_err_t res = 630d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "multi-frame-contexts=1"); 631d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_OK, res); 632d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 633d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 634d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 635d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.spatial_layers = 2; 636d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org res = vpx_svc_set_options(&svc_, "multi-frame-contexts=1"); 637d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org InitializeEncoder(); 638d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 639d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 640d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode2SpatialLayersWithMultipleFrameContexts) { 641d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // First pass encode 642d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org std::string stats_buf; 643d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass1EncodeNFrames(10, 2, &stats_buf); 644d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 645d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Second pass encode 646d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 647d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_error_resilient = 0; 648d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1,1 multi-frame-contexts=1"); 649d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs[10]; 650d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 651d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]); 652d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 2, true); 653d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 654d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 655d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 656d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 657d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, 658d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org TwoPassEncode2SpatialLayersWithMultipleFrameContextsDecodeBaselayer) { 659d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // First pass encode 660d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org std::string stats_buf; 661d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass1EncodeNFrames(10, 2, &stats_buf); 662d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 663d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Second pass encode 664d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 665d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_error_resilient = 0; 666d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1,1 multi-frame-contexts=1"); 667d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs[10]; 668d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 669d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]); 670d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 1, true); 671d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 672d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 673d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 674d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 675d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode2SNRLayersWithMultipleFrameContexts) { 676d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // First pass encode 677d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org std::string stats_buf; 678d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=1/1,1/1"); 679d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass1EncodeNFrames(10, 2, &stats_buf); 680d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 681d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Second pass encode 682d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 683d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_error_resilient = 0; 684d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1,1 scale-factors=1/1,1/1 " 685d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org "multi-frame-contexts=1"); 686d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs[10]; 687d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 688d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]); 689d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 2, true); 690d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 691d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 692d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 693d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 694d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, 695d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org TwoPassEncode3SNRLayersWithMultipleFrameContextsDecode321Layer) { 696d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // First pass encode 697d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org std::string stats_buf; 698d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=1/1,1/1,1/1"); 699d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass1EncodeNFrames(10, 3, &stats_buf); 700d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 701d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Second pass encode 702d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 703d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_error_resilient = 0; 704d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1,1,1 scale-factors=1/1,1/1,1/1 " 705d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org "multi-frame-contexts=1"); 706d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs[10]; 707d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 708d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 3, &outputs[0]); 709d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 710d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs_new[10]; 711d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (int i = 0; i < 10; ++i) { 712d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org outputs_new[i].buf = malloc(outputs[i].sz + 16); 713d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ASSERT_TRUE(outputs_new[i].buf != NULL); 714d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memcpy(outputs_new[i].buf, outputs[i].buf, outputs[i].sz); 715d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org outputs_new[i].sz = outputs[i].sz; 716d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 717d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs_new[0], 10, 3, true); 718d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&outputs_new[0], 10); 719d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 720d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (int i = 0; i < 10; ++i) { 721d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memcpy(outputs_new[i].buf, outputs[i].buf, outputs[i].sz); 722d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org outputs_new[i].sz = outputs[i].sz; 723d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 724d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs_new[0], 10, 2, true); 725d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&outputs_new[0], 10); 726d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 727d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (int i = 0; i < 10; ++i) { 728d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memcpy(outputs_new[i].buf, outputs[i].buf, outputs[i].sz); 729d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org outputs_new[i].sz = outputs[i].sz; 730d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 731d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs_new[0], 10, 1, true); 732d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&outputs_new[0], 10); 733d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 734d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 735d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs_new[0], 10); 736d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 737d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 738d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode2TemporalLayers) { 739d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // First pass encode 740d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org std::string stats_buf; 741d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=1/1"); 742d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.temporal_layers = 2; 743d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass1EncodeNFrames(10, 1, &stats_buf); 744d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 745d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Second pass encode 746d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 747d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.temporal_layers = 2; 748d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1"); 749d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs[10]; 750d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 751d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]); 752d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 753d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 754d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 755d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 756d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode2TemporalLayersWithMultipleFrameContexts) { 757d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // First pass encode 758d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org std::string stats_buf; 759d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=1/1"); 760d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.temporal_layers = 2; 761d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass1EncodeNFrames(10, 1, &stats_buf); 762d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 763d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Second pass encode 764d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 765d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.temporal_layers = 2; 766d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_error_resilient = 0; 767d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1 " 768d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org "multi-frame-contexts=1"); 769d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs[10]; 770d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 771d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]); 772d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 1, true); 773d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&outputs[0], 10); 774d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 775d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 776d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 777d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, TwoPassEncode2TemporalLayersDecodeBaseLayer) { 778d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // First pass encode 779d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org std::string stats_buf; 780d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=1/1"); 781d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.temporal_layers = 2; 782d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass1EncodeNFrames(10, 1, &stats_buf); 783d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 784d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Second pass encode 785d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 786d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.temporal_layers = 2; 787d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1"); 788d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs[10]; 789d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 790d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]); 791d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 792d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf base_layer[5]; 793d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (int i = 0; i < 5; ++i) 794d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org base_layer[i] = outputs[i * 2]; 795d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 796d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&base_layer[0], 5); 797d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 798d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 799d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 800d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgTEST_F(SvcTest, 801d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org TwoPassEncode2TemporalLayersWithMultipleFrameContextsDecodeBaseLayer) { 802d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // First pass encode 803d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org std::string stats_buf; 804d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "scale-factors=1/1"); 805d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.temporal_layers = 2; 806d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass1EncodeNFrames(10, 1, &stats_buf); 807d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 808d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org // Second pass encode 809d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_pass = VPX_RC_LAST_PASS; 810d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org svc_.temporal_layers = 2; 811d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org codec_enc_.g_error_resilient = 0; 812d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1 " 813d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org "multi-frame-contexts=1"); 814d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf outputs[10]; 815d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org memset(&outputs[0], 0, sizeof(outputs)); 816d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]); 817d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DropLayersAndMakeItVP9Comaptible(&outputs[0], 10, 1, true); 818d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 819d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_fixed_buf base_layer[5]; 820d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org for (int i = 0; i < 5; ++i) 821d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org base_layer[i] = outputs[i * 2]; 822d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 823d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org DecodeNFrames(&base_layer[0], 5); 824d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org FreeBitstreamBuffers(&outputs[0], 10); 825d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 826d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 827d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} // namespace 828