blob: 5343cf974b02bdcd932431688c47ea5d0e03a940 [file] [log] [blame]
Stefan Holmerf7044682018-07-17 10:16:41 +02001/*
2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <string.h>
12#include <map>
philipelbf2b6202018-08-27 14:33:18 +020013#include <set>
Stefan Holmerf7044682018-07-17 10:16:41 +020014
Yves Gerey3e707812018-11-28 16:47:49 +010015#include "absl/container/inlined_vector.h"
16#include "absl/types/optional.h"
17#include "absl/types/variant.h"
18#include "api/video/video_content_type.h"
19#include "api/video/video_rotation.h"
Stefan Holmer9416ef82018-07-19 10:34:38 +020020#include "call/rtp_payload_params.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "common_types.h" // NOLINT(build/include)
22#include "modules/video_coding/codecs/h264/include/h264_globals.h"
23#include "modules/video_coding/codecs/interface/common_constants.h"
24#include "modules/video_coding/codecs/vp8/include/vp8_globals.h"
25#include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
Stefan Holmerf7044682018-07-17 10:16:41 +020026#include "modules/video_coding/include/video_codec_interface.h"
philipelbf2b6202018-08-27 14:33:18 +020027#include "test/field_trial.h"
Stefan Holmerf7044682018-07-17 10:16:41 +020028#include "test/gtest.h"
29
30namespace webrtc {
31namespace {
32const uint32_t kSsrc1 = 12345;
33const uint32_t kSsrc2 = 23456;
34const int16_t kPictureId = 123;
35const int16_t kTl0PicIdx = 20;
36const uint8_t kTemporalIdx = 1;
37const int16_t kInitialPictureId1 = 222;
38const int16_t kInitialTl0PicIdx1 = 99;
philipelbf2b6202018-08-27 14:33:18 +020039const int64_t kDontCare = 0;
Stefan Holmerf7044682018-07-17 10:16:41 +020040} // namespace
41
42TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_Vp8) {
43 RtpPayloadState state2;
44 state2.picture_id = kPictureId;
45 state2.tl0_pic_idx = kTl0PicIdx;
46 std::map<uint32_t, RtpPayloadState> states = {{kSsrc2, state2}};
47
48 RtpPayloadParams params(kSsrc2, &state2);
49 EncodedImage encoded_image;
50 encoded_image.rotation_ = kVideoRotation_90;
51 encoded_image.content_type_ = VideoContentType::SCREENSHARE;
Niels Möllerd3b8c632018-08-27 15:33:42 +020052 encoded_image.SetSpatialIndex(1);
Stefan Holmerf7044682018-07-17 10:16:41 +020053
54 CodecSpecificInfo codec_info;
55 memset(&codec_info, 0, sizeof(CodecSpecificInfo));
56 codec_info.codecType = kVideoCodecVP8;
philipelbf2b6202018-08-27 14:33:18 +020057 codec_info.codecSpecific.VP8.temporalIdx = 0;
Stefan Holmerf7044682018-07-17 10:16:41 +020058 codec_info.codecSpecific.VP8.keyIdx = kNoKeyIdx;
philipelbf2b6202018-08-27 14:33:18 +020059 codec_info.codecSpecific.VP8.layerSync = false;
Stefan Holmerf7044682018-07-17 10:16:41 +020060 codec_info.codecSpecific.VP8.nonReference = true;
61
philipelbf2b6202018-08-27 14:33:18 +020062 RTPVideoHeader header =
63 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
64
65 codec_info.codecType = kVideoCodecVP8;
philipelbf2b6202018-08-27 14:33:18 +020066 codec_info.codecSpecific.VP8.temporalIdx = 1;
67 codec_info.codecSpecific.VP8.layerSync = true;
68
69 header = params.GetRtpVideoHeader(encoded_image, &codec_info, 1);
Stefan Holmerf7044682018-07-17 10:16:41 +020070
71 EXPECT_EQ(kVideoRotation_90, header.rotation);
72 EXPECT_EQ(VideoContentType::SCREENSHARE, header.content_type);
73 EXPECT_EQ(1, header.simulcastIdx);
74 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +000075 const auto& vp8_header =
76 absl::get<RTPVideoHeaderVP8>(header.video_type_header);
77 EXPECT_EQ(kPictureId + 2, vp8_header.pictureId);
78 EXPECT_EQ(kTemporalIdx, vp8_header.temporalIdx);
79 EXPECT_EQ(kTl0PicIdx + 1, vp8_header.tl0PicIdx);
80 EXPECT_EQ(kNoKeyIdx, vp8_header.keyIdx);
81 EXPECT_TRUE(vp8_header.layerSync);
82 EXPECT_TRUE(vp8_header.nonReference);
Stefan Holmerf7044682018-07-17 10:16:41 +020083}
84
85TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_Vp9) {
86 RtpPayloadState state;
87 state.picture_id = kPictureId;
88 state.tl0_pic_idx = kTl0PicIdx;
89 RtpPayloadParams params(kSsrc1, &state);
90
91 EncodedImage encoded_image;
92 encoded_image.rotation_ = kVideoRotation_90;
93 encoded_image.content_type_ = VideoContentType::SCREENSHARE;
Niels Möllerd3b8c632018-08-27 15:33:42 +020094 encoded_image.SetSpatialIndex(0);
Stefan Holmerf7044682018-07-17 10:16:41 +020095 CodecSpecificInfo codec_info;
96 memset(&codec_info, 0, sizeof(CodecSpecificInfo));
97 codec_info.codecType = kVideoCodecVP9;
98 codec_info.codecSpecific.VP9.num_spatial_layers = 3;
99 codec_info.codecSpecific.VP9.first_frame_in_picture = true;
Stefan Holmerf7044682018-07-17 10:16:41 +0200100 codec_info.codecSpecific.VP9.temporal_idx = 2;
101 codec_info.codecSpecific.VP9.end_of_picture = false;
102
philipelbf2b6202018-08-27 14:33:18 +0200103 RTPVideoHeader header =
104 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200105
106 EXPECT_EQ(kVideoRotation_90, header.rotation);
107 EXPECT_EQ(VideoContentType::SCREENSHARE, header.content_type);
108 EXPECT_EQ(kVideoCodecVP9, header.codec);
Johannes Krond0b69a82018-12-03 14:18:53 +0100109 EXPECT_FALSE(header.color_space);
philipel29d88462018-08-08 14:26:00 +0200110 const auto& vp9_header =
111 absl::get<RTPVideoHeaderVP9>(header.video_type_header);
112 EXPECT_EQ(kPictureId + 1, vp9_header.picture_id);
113 EXPECT_EQ(kTl0PicIdx, vp9_header.tl0_pic_idx);
114 EXPECT_EQ(vp9_header.temporal_idx, codec_info.codecSpecific.VP9.temporal_idx);
Niels Möllerd3b8c632018-08-27 15:33:42 +0200115 EXPECT_EQ(vp9_header.spatial_idx, encoded_image.SpatialIndex());
philipel29d88462018-08-08 14:26:00 +0200116 EXPECT_EQ(vp9_header.num_spatial_layers,
Stefan Holmerf7044682018-07-17 10:16:41 +0200117 codec_info.codecSpecific.VP9.num_spatial_layers);
philipel29d88462018-08-08 14:26:00 +0200118 EXPECT_EQ(vp9_header.end_of_picture,
Stefan Holmerf7044682018-07-17 10:16:41 +0200119 codec_info.codecSpecific.VP9.end_of_picture);
120
121 // Next spatial layer.
122 codec_info.codecSpecific.VP9.first_frame_in_picture = false;
Stefan Holmerf7044682018-07-17 10:16:41 +0200123 codec_info.codecSpecific.VP9.end_of_picture = true;
124
Niels Möllerd3b8c632018-08-27 15:33:42 +0200125 encoded_image.SetSpatialIndex(1);
Johannes Krond0b69a82018-12-03 14:18:53 +0100126 ColorSpace color_space(
127 ColorSpace::PrimaryID::kSMPTE170M, ColorSpace::TransferID::kSMPTE170M,
128 ColorSpace::MatrixID::kSMPTE170M, ColorSpace::RangeID::kFull);
129 encoded_image.SetColorSpace(&color_space);
philipelbf2b6202018-08-27 14:33:18 +0200130 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200131
132 EXPECT_EQ(kVideoRotation_90, header.rotation);
133 EXPECT_EQ(VideoContentType::SCREENSHARE, header.content_type);
134 EXPECT_EQ(kVideoCodecVP9, header.codec);
Johannes Krond0b69a82018-12-03 14:18:53 +0100135 EXPECT_EQ(absl::make_optional(color_space), header.color_space);
philipel29d88462018-08-08 14:26:00 +0200136 EXPECT_EQ(kPictureId + 1, vp9_header.picture_id);
137 EXPECT_EQ(kTl0PicIdx, vp9_header.tl0_pic_idx);
138 EXPECT_EQ(vp9_header.temporal_idx, codec_info.codecSpecific.VP9.temporal_idx);
Niels Möllerd3b8c632018-08-27 15:33:42 +0200139 EXPECT_EQ(vp9_header.spatial_idx, encoded_image.SpatialIndex());
philipel29d88462018-08-08 14:26:00 +0200140 EXPECT_EQ(vp9_header.num_spatial_layers,
Stefan Holmerf7044682018-07-17 10:16:41 +0200141 codec_info.codecSpecific.VP9.num_spatial_layers);
philipel29d88462018-08-08 14:26:00 +0200142 EXPECT_EQ(vp9_header.end_of_picture,
Stefan Holmerf7044682018-07-17 10:16:41 +0200143 codec_info.codecSpecific.VP9.end_of_picture);
144}
145
146TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_H264) {
147 RtpPayloadParams params(kSsrc1, {});
148
149 EncodedImage encoded_image;
150 CodecSpecificInfo codec_info;
151 memset(&codec_info, 0, sizeof(CodecSpecificInfo));
152 codec_info.codecType = kVideoCodecH264;
153 codec_info.codecSpecific.H264.packetization_mode =
154 H264PacketizationMode::SingleNalUnit;
155
philipelbf2b6202018-08-27 14:33:18 +0200156 RTPVideoHeader header =
157 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200158
159 EXPECT_EQ(0, header.simulcastIdx);
160 EXPECT_EQ(kVideoCodecH264, header.codec);
161 const auto& h264 = absl::get<RTPVideoHeaderH264>(header.video_type_header);
162 EXPECT_EQ(H264PacketizationMode::SingleNalUnit, h264.packetization_mode);
163}
164
165TEST(RtpPayloadParamsTest, PictureIdIsSetForVp8) {
166 RtpPayloadState state;
167 state.picture_id = kInitialPictureId1;
168 state.tl0_pic_idx = kInitialTl0PicIdx1;
169
170 EncodedImage encoded_image;
171 CodecSpecificInfo codec_info;
172 memset(&codec_info, 0, sizeof(CodecSpecificInfo));
173 codec_info.codecType = kVideoCodecVP8;
Stefan Holmerf7044682018-07-17 10:16:41 +0200174
175 RtpPayloadParams params(kSsrc1, &state);
philipelbf2b6202018-08-27 14:33:18 +0200176 RTPVideoHeader header =
177 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200178 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +0000179 EXPECT_EQ(kInitialPictureId1 + 1,
180 absl::get<RTPVideoHeaderVP8>(header.video_type_header).pictureId);
Stefan Holmerf7044682018-07-17 10:16:41 +0200181
182 // State should hold latest used picture id and tl0_pic_idx.
183 state = params.state();
184 EXPECT_EQ(kInitialPictureId1 + 1, state.picture_id);
185 EXPECT_EQ(kInitialTl0PicIdx1 + 1, state.tl0_pic_idx);
186}
187
188TEST(RtpPayloadParamsTest, PictureIdWraps) {
189 RtpPayloadState state;
190 state.picture_id = kMaxTwoBytePictureId;
191 state.tl0_pic_idx = kInitialTl0PicIdx1;
192
193 EncodedImage encoded_image;
194 CodecSpecificInfo codec_info;
195 memset(&codec_info, 0, sizeof(CodecSpecificInfo));
196 codec_info.codecType = kVideoCodecVP8;
197 codec_info.codecSpecific.VP8.temporalIdx = kNoTemporalIdx;
198
199 RtpPayloadParams params(kSsrc1, &state);
philipelbf2b6202018-08-27 14:33:18 +0200200 RTPVideoHeader header =
201 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200202 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +0000203 EXPECT_EQ(0,
204 absl::get<RTPVideoHeaderVP8>(header.video_type_header).pictureId);
Stefan Holmerf7044682018-07-17 10:16:41 +0200205
206 // State should hold latest used picture id and tl0_pic_idx.
207 EXPECT_EQ(0, params.state().picture_id); // Wrapped.
208 EXPECT_EQ(kInitialTl0PicIdx1, params.state().tl0_pic_idx);
209}
210
211TEST(RtpPayloadParamsTest, Tl0PicIdxUpdatedForVp8) {
212 RtpPayloadState state;
213 state.picture_id = kInitialPictureId1;
214 state.tl0_pic_idx = kInitialTl0PicIdx1;
215
216 EncodedImage encoded_image;
217 // Modules are sending for this test.
218 // OnEncodedImage, temporalIdx: 1.
219 CodecSpecificInfo codec_info;
220 memset(&codec_info, 0, sizeof(CodecSpecificInfo));
221 codec_info.codecType = kVideoCodecVP8;
222 codec_info.codecSpecific.VP8.temporalIdx = 1;
223
224 RtpPayloadParams params(kSsrc1, &state);
philipelbf2b6202018-08-27 14:33:18 +0200225 RTPVideoHeader header =
226 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200227
228 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +0000229 const auto& vp8_header =
230 absl::get<RTPVideoHeaderVP8>(header.video_type_header);
231 EXPECT_EQ(kInitialPictureId1 + 1, vp8_header.pictureId);
232 EXPECT_EQ(kInitialTl0PicIdx1, vp8_header.tl0PicIdx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200233
234 // OnEncodedImage, temporalIdx: 0.
235 codec_info.codecSpecific.VP8.temporalIdx = 0;
236
philipelbf2b6202018-08-27 14:33:18 +0200237 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200238 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +0000239 EXPECT_EQ(kInitialPictureId1 + 2, vp8_header.pictureId);
240 EXPECT_EQ(kInitialTl0PicIdx1 + 1, vp8_header.tl0PicIdx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200241
242 // State should hold latest used picture id and tl0_pic_idx.
243 EXPECT_EQ(kInitialPictureId1 + 2, params.state().picture_id);
244 EXPECT_EQ(kInitialTl0PicIdx1 + 1, params.state().tl0_pic_idx);
245}
246
247TEST(RtpPayloadParamsTest, Tl0PicIdxUpdatedForVp9) {
248 RtpPayloadState state;
249 state.picture_id = kInitialPictureId1;
250 state.tl0_pic_idx = kInitialTl0PicIdx1;
251
252 EncodedImage encoded_image;
253 // Modules are sending for this test.
254 // OnEncodedImage, temporalIdx: 1.
255 CodecSpecificInfo codec_info;
256 memset(&codec_info, 0, sizeof(CodecSpecificInfo));
257 codec_info.codecType = kVideoCodecVP9;
258 codec_info.codecSpecific.VP9.temporal_idx = 1;
259 codec_info.codecSpecific.VP9.first_frame_in_picture = true;
260
261 RtpPayloadParams params(kSsrc1, &state);
philipelbf2b6202018-08-27 14:33:18 +0200262 RTPVideoHeader header =
263 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200264
265 EXPECT_EQ(kVideoCodecVP9, header.codec);
philipel29d88462018-08-08 14:26:00 +0200266 const auto& vp9_header =
267 absl::get<RTPVideoHeaderVP9>(header.video_type_header);
268 EXPECT_EQ(kInitialPictureId1 + 1, vp9_header.picture_id);
269 EXPECT_EQ(kInitialTl0PicIdx1, vp9_header.tl0_pic_idx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200270
271 // OnEncodedImage, temporalIdx: 0.
272 codec_info.codecSpecific.VP9.temporal_idx = 0;
273
philipelbf2b6202018-08-27 14:33:18 +0200274 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200275
276 EXPECT_EQ(kVideoCodecVP9, header.codec);
philipel29d88462018-08-08 14:26:00 +0200277 EXPECT_EQ(kInitialPictureId1 + 2, vp9_header.picture_id);
278 EXPECT_EQ(kInitialTl0PicIdx1 + 1, vp9_header.tl0_pic_idx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200279
280 // OnEncodedImage, first_frame_in_picture = false
281 codec_info.codecSpecific.VP9.first_frame_in_picture = false;
282
philipelbf2b6202018-08-27 14:33:18 +0200283 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200284
285 EXPECT_EQ(kVideoCodecVP9, header.codec);
philipel29d88462018-08-08 14:26:00 +0200286 EXPECT_EQ(kInitialPictureId1 + 2, vp9_header.picture_id);
287 EXPECT_EQ(kInitialTl0PicIdx1 + 1, vp9_header.tl0_pic_idx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200288
289 // State should hold latest used picture id and tl0_pic_idx.
290 EXPECT_EQ(kInitialPictureId1 + 2, params.state().picture_id);
291 EXPECT_EQ(kInitialTl0PicIdx1 + 1, params.state().tl0_pic_idx);
292}
philipelbf2b6202018-08-27 14:33:18 +0200293
294TEST(RtpPayloadParamsTest, PictureIdForOldGenericFormat) {
295 test::ScopedFieldTrials generic_picture_id(
296 "WebRTC-GenericPictureId/Enabled/");
297 RtpPayloadState state{};
298
299 EncodedImage encoded_image;
300 CodecSpecificInfo codec_info{};
301 codec_info.codecType = kVideoCodecGeneric;
302
303 RtpPayloadParams params(kSsrc1, &state);
304 RTPVideoHeader header =
305 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
306
307 EXPECT_EQ(kVideoCodecGeneric, header.codec);
308 ASSERT_TRUE(header.generic);
309 EXPECT_EQ(0, header.generic->frame_id);
310
311 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
312 ASSERT_TRUE(header.generic);
313 EXPECT_EQ(1, header.generic->frame_id);
314}
315
316class RtpPayloadParamsVp8ToGenericTest : public ::testing::Test {
317 public:
318 enum LayerSync { kNoSync, kSync };
319
philipel569397f2018-09-26 12:25:31 +0200320 RtpPayloadParamsVp8ToGenericTest()
321 : generic_descriptor_field_trial_("WebRTC-GenericDescriptor/Enabled/"),
322 state_(),
323 params_(123, &state_) {}
philipelbf2b6202018-08-27 14:33:18 +0200324
325 void ConvertAndCheck(int temporal_index,
326 int64_t shared_frame_id,
327 FrameType frame_type,
328 LayerSync layer_sync,
philipelfab91292018-10-17 14:36:08 +0200329 const std::set<int64_t>& expected_deps,
330 uint16_t width = 0,
331 uint16_t height = 0) {
philipelbf2b6202018-08-27 14:33:18 +0200332 EncodedImage encoded_image;
333 encoded_image._frameType = frame_type;
philipelfab91292018-10-17 14:36:08 +0200334 encoded_image._encodedWidth = width;
335 encoded_image._encodedHeight = height;
philipelbf2b6202018-08-27 14:33:18 +0200336
337 CodecSpecificInfo codec_info{};
338 codec_info.codecType = kVideoCodecVP8;
339 codec_info.codecSpecific.VP8.temporalIdx = temporal_index;
340 codec_info.codecSpecific.VP8.layerSync = layer_sync == kSync;
341
342 RTPVideoHeader header =
343 params_.GetRtpVideoHeader(encoded_image, &codec_info, shared_frame_id);
344
345 ASSERT_TRUE(header.generic);
346 EXPECT_TRUE(header.generic->higher_spatial_layers.empty());
347 EXPECT_EQ(header.generic->spatial_index, 0);
348
349 EXPECT_EQ(header.generic->frame_id, shared_frame_id);
350 EXPECT_EQ(header.generic->temporal_index, temporal_index);
351 std::set<int64_t> actual_deps(header.generic->dependencies.begin(),
352 header.generic->dependencies.end());
353 EXPECT_EQ(expected_deps, actual_deps);
philipelfab91292018-10-17 14:36:08 +0200354
355 EXPECT_EQ(header.width, width);
356 EXPECT_EQ(header.height, height);
philipelbf2b6202018-08-27 14:33:18 +0200357 }
358
359 protected:
philipel569397f2018-09-26 12:25:31 +0200360 test::ScopedFieldTrials generic_descriptor_field_trial_;
philipelbf2b6202018-08-27 14:33:18 +0200361 RtpPayloadState state_;
362 RtpPayloadParams params_;
363};
364
365TEST_F(RtpPayloadParamsVp8ToGenericTest, Keyframe) {
philipelfab91292018-10-17 14:36:08 +0200366 ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {}, 480, 360);
philipelbf2b6202018-08-27 14:33:18 +0200367 ConvertAndCheck(0, 1, kVideoFrameDelta, kNoSync, {0});
philipelfab91292018-10-17 14:36:08 +0200368 ConvertAndCheck(0, 2, kVideoFrameKey, kNoSync, {}, 480, 360);
philipelbf2b6202018-08-27 14:33:18 +0200369}
370
371TEST_F(RtpPayloadParamsVp8ToGenericTest, TooHighTemporalIndex) {
philipelfab91292018-10-17 14:36:08 +0200372 ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {}, 480, 360);
philipelbf2b6202018-08-27 14:33:18 +0200373
374 EncodedImage encoded_image;
375 encoded_image._frameType = kVideoFrameDelta;
376 CodecSpecificInfo codec_info{};
377 codec_info.codecType = kVideoCodecVP8;
378 codec_info.codecSpecific.VP8.temporalIdx =
379 RtpGenericFrameDescriptor::kMaxTemporalLayers;
380 codec_info.codecSpecific.VP8.layerSync = false;
381
382 RTPVideoHeader header =
383 params_.GetRtpVideoHeader(encoded_image, &codec_info, 1);
384 EXPECT_FALSE(header.generic);
385}
386
387TEST_F(RtpPayloadParamsVp8ToGenericTest, LayerSync) {
388 // 02120212 pattern
philipelfab91292018-10-17 14:36:08 +0200389 ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {}, 480, 360);
philipelbf2b6202018-08-27 14:33:18 +0200390 ConvertAndCheck(2, 1, kVideoFrameDelta, kNoSync, {0});
391 ConvertAndCheck(1, 2, kVideoFrameDelta, kNoSync, {0});
392 ConvertAndCheck(2, 3, kVideoFrameDelta, kNoSync, {0, 1, 2});
393
394 ConvertAndCheck(0, 4, kVideoFrameDelta, kNoSync, {0});
395 ConvertAndCheck(2, 5, kVideoFrameDelta, kNoSync, {2, 3, 4});
396 ConvertAndCheck(1, 6, kVideoFrameDelta, kSync, {4}); // layer sync
397 ConvertAndCheck(2, 7, kVideoFrameDelta, kNoSync, {4, 5, 6});
398}
399
400TEST_F(RtpPayloadParamsVp8ToGenericTest, FrameIdGaps) {
401 // 0101 pattern
philipelfab91292018-10-17 14:36:08 +0200402 ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {}, 480, 360);
philipelbf2b6202018-08-27 14:33:18 +0200403 ConvertAndCheck(1, 1, kVideoFrameDelta, kNoSync, {0});
404
405 ConvertAndCheck(0, 5, kVideoFrameDelta, kNoSync, {0});
406 ConvertAndCheck(1, 10, kVideoFrameDelta, kNoSync, {1, 5});
407
408 ConvertAndCheck(0, 15, kVideoFrameDelta, kNoSync, {5});
409 ConvertAndCheck(1, 20, kVideoFrameDelta, kNoSync, {10, 15});
410}
411
Stefan Holmerf7044682018-07-17 10:16:41 +0200412} // namespace webrtc