| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2011 The WebRTC 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 bool expected_layer_sync[16] = {false, true, false, false, false, false, | 81 bool expected_layer_sync[16] = {false, true, false, false, false, false, |
| 82 false, false, false, true, false, false, | 82 false, false, false, true, false, false, |
| 83 false, false, false, false}; | 83 false, false, false, false}; |
| 84 | 84 |
| 85 uint32_t timestamp = 0; | 85 uint32_t timestamp = 0; |
| 86 for (int i = 0; i < 16; ++i) { | 86 for (int i = 0; i < 16; ++i) { |
| 87 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); | 87 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); |
| 88 EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)); | 88 EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)); |
| 89 tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0); | 89 tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0); |
| 90 EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); | 90 EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); |
| 91 EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx); |
| 92 EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id); |
| 91 EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); | 93 EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); |
| 94 EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync); |
| 92 timestamp += 3000; | 95 timestamp += 3000; |
| 93 } | 96 } |
| 94 } | 97 } |
| 95 | 98 |
| 96 TEST(TemporalLayersTest, 3Layers) { | 99 TEST(TemporalLayersTest, 3Layers) { |
| 97 DefaultTemporalLayers tl(3, 0); | 100 DefaultTemporalLayers tl(3, 0); |
| 98 vpx_codec_enc_cfg_t cfg; | 101 vpx_codec_enc_cfg_t cfg; |
| 99 CodecSpecificInfoVP8 vp8_info; | 102 CodecSpecificInfoVP8 vp8_info; |
| 100 tl.OnRatesUpdated(500, 500, 30); | 103 tl.OnRatesUpdated(500, 500, 30); |
| 101 tl.UpdateConfiguration(&cfg); | 104 tl.UpdateConfiguration(&cfg); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 124 bool expected_layer_sync[16] = {false, true, true, false, false, false, | 127 bool expected_layer_sync[16] = {false, true, true, false, false, false, |
| 125 false, false, false, true, true, false, | 128 false, false, false, true, true, false, |
| 126 false, false, false, false}; | 129 false, false, false, false}; |
| 127 | 130 |
| 128 unsigned int timestamp = 0; | 131 unsigned int timestamp = 0; |
| 129 for (int i = 0; i < 16; ++i) { | 132 for (int i = 0; i < 16; ++i) { |
| 130 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); | 133 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); |
| 131 EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)); | 134 EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)); |
| 132 tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0); | 135 tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0); |
| 133 EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); | 136 EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); |
| 137 EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx); |
| 138 EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id); |
| 134 EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); | 139 EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); |
| 140 EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync); |
| 135 timestamp += 3000; | 141 timestamp += 3000; |
| 136 } | 142 } |
| 137 } | 143 } |
| 138 | 144 |
| 139 TEST(TemporalLayersTest, 4Layers) { | 145 TEST(TemporalLayersTest, 4Layers) { |
| 140 DefaultTemporalLayers tl(4, 0); | 146 DefaultTemporalLayers tl(4, 0); |
| 141 vpx_codec_enc_cfg_t cfg; | 147 vpx_codec_enc_cfg_t cfg; |
| 142 CodecSpecificInfoVP8 vp8_info; | 148 CodecSpecificInfoVP8 vp8_info; |
| 143 tl.OnRatesUpdated(500, 500, 30); | 149 tl.OnRatesUpdated(500, 500, 30); |
| 144 tl.UpdateConfiguration(&cfg); | 150 tl.UpdateConfiguration(&cfg); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 166 bool expected_layer_sync[16] = {false, true, true, true, true, true, | 172 bool expected_layer_sync[16] = {false, true, true, true, true, true, |
| 167 false, true, false, true, false, true, | 173 false, true, false, true, false, true, |
| 168 false, true, false, true}; | 174 false, true, false, true}; |
| 169 | 175 |
| 170 uint32_t timestamp = 0; | 176 uint32_t timestamp = 0; |
| 171 for (int i = 0; i < 16; ++i) { | 177 for (int i = 0; i < 16; ++i) { |
| 172 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); | 178 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); |
| 173 EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)); | 179 EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)); |
| 174 tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0); | 180 tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0); |
| 175 EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); | 181 EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); |
| 182 EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx); |
| 183 EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id); |
| 176 EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); | 184 EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); |
| 185 EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync); |
| 177 timestamp += 3000; | 186 timestamp += 3000; |
| 178 } | 187 } |
| 179 } | 188 } |
| 180 | 189 |
| 181 TEST(TemporalLayersTest, KeyFrame) { | 190 TEST(TemporalLayersTest, KeyFrame) { |
| 182 DefaultTemporalLayers tl(3, 0); | 191 DefaultTemporalLayers tl(3, 0); |
| 183 vpx_codec_enc_cfg_t cfg; | 192 vpx_codec_enc_cfg_t cfg; |
| 184 CodecSpecificInfoVP8 vp8_info; | 193 CodecSpecificInfoVP8 vp8_info; |
| 185 tl.OnRatesUpdated(500, 500, 30); | 194 tl.OnRatesUpdated(500, 500, 30); |
| 186 tl.UpdateConfiguration(&cfg); | 195 tl.UpdateConfiguration(&cfg); |
| 187 | 196 |
| 188 int expected_flags[8] = { | 197 int expected_flags[8] = { |
| 189 kTemporalUpdateLastAndGoldenRefAltRef, | 198 kTemporalUpdateLastAndGoldenRefAltRef, |
| 190 kTemporalUpdateNoneNoRefGolden, | 199 kTemporalUpdateNoneNoRefGolden, |
| 191 kTemporalUpdateGoldenWithoutDependencyRefAltRef, | 200 kTemporalUpdateGoldenWithoutDependencyRefAltRef, |
| 192 kTemporalUpdateNone, | 201 kTemporalUpdateNone, |
| 193 kTemporalUpdateLastRefAltRef, | 202 kTemporalUpdateLastRefAltRef, |
| 194 kTemporalUpdateNone, | 203 kTemporalUpdateNone, |
| 195 kTemporalUpdateGoldenRefAltRef, | 204 kTemporalUpdateGoldenRefAltRef, |
| 196 kTemporalUpdateNone, | 205 kTemporalUpdateNone, |
| 197 }; | 206 }; |
| 198 int expected_temporal_idx[8] = {0, 0, 0, 0, 0, 0, 0, 2}; | 207 int expected_temporal_idx[8] = {0, 2, 1, 2, 0, 2, 1, 2}; |
| 208 bool expected_layer_sync[8] = {false, true, true, false, |
| 209 false, false, false, false}; |
| 199 | 210 |
| 200 uint32_t timestamp = 0; | 211 uint32_t timestamp = 0; |
| 201 for (int i = 0; i < 7; ++i) { | 212 for (int i = 0; i < 7; ++i) { |
| 202 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); | 213 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); |
| 203 EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)); | 214 EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)); |
| 204 tl.PopulateCodecSpecific(true, tl_config, &vp8_info, 0); | 215 tl.PopulateCodecSpecific(true, tl_config, &vp8_info, 0); |
| 205 EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); | 216 EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx); |
| 206 EXPECT_EQ(true, vp8_info.layerSync); | 217 EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id); |
| 218 EXPECT_EQ(0, vp8_info.temporalIdx) |
| 219 << "Key frame should always be packetized as layer 0"; |
| 220 EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync); |
| 221 EXPECT_TRUE(vp8_info.layerSync) << "Key frame should be marked layer sync."; |
| 207 timestamp += 3000; | 222 timestamp += 3000; |
| 208 } | 223 } |
| 209 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); | 224 TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp); |
| 210 EXPECT_EQ(expected_flags[7], VP8EncoderImpl::EncodeFlags(tl_config)); | 225 EXPECT_EQ(expected_flags[7], VP8EncoderImpl::EncodeFlags(tl_config)); |
| 211 tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0); | 226 tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0); |
| 212 EXPECT_EQ(expected_temporal_idx[7], vp8_info.temporalIdx); | 227 EXPECT_NE(0, vp8_info.temporalIdx) |
| 213 EXPECT_EQ(true, vp8_info.layerSync); | 228 << "To test something useful, this frame should not use layer 0."; |
| 229 EXPECT_EQ(expected_temporal_idx[7], vp8_info.temporalIdx) |
| 230 << "Non-keyframe, should use frame temporal index."; |
| 231 EXPECT_EQ(expected_temporal_idx[7], tl_config.packetizer_temporal_idx); |
| 232 EXPECT_EQ(expected_temporal_idx[7], tl_config.encoder_layer_id); |
| 233 EXPECT_FALSE(tl_config.layer_sync); |
| 234 EXPECT_TRUE(vp8_info.layerSync) << "Frame after keyframe should always be " |
| 235 "marked layer sync since it only depends " |
| 236 "on the base layer."; |
| 214 } | 237 } |
| 215 } // namespace webrtc | 238 } // namespace webrtc |
| OLD | NEW |