blob: 6216034b8a4de35d2e60f483a9d02cd44b24de7f [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 "modules/video_coding/codecs/h264/include/h264_globals.h"
22#include "modules/video_coding/codecs/interface/common_constants.h"
23#include "modules/video_coding/codecs/vp8/include/vp8_globals.h"
24#include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
Stefan Holmerf7044682018-07-17 10:16:41 +020025#include "modules/video_coding/include/video_codec_interface.h"
philipelbf2b6202018-08-27 14:33:18 +020026#include "test/field_trial.h"
Stefan Holmerf7044682018-07-17 10:16:41 +020027#include "test/gtest.h"
28
29namespace webrtc {
30namespace {
31const uint32_t kSsrc1 = 12345;
32const uint32_t kSsrc2 = 23456;
33const int16_t kPictureId = 123;
34const int16_t kTl0PicIdx = 20;
35const uint8_t kTemporalIdx = 1;
36const int16_t kInitialPictureId1 = 222;
37const int16_t kInitialTl0PicIdx1 = 99;
philipelbf2b6202018-08-27 14:33:18 +020038const int64_t kDontCare = 0;
Stefan Holmerf7044682018-07-17 10:16:41 +020039} // namespace
40
41TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_Vp8) {
42 RtpPayloadState state2;
43 state2.picture_id = kPictureId;
44 state2.tl0_pic_idx = kTl0PicIdx;
45 std::map<uint32_t, RtpPayloadState> states = {{kSsrc2, state2}};
46
47 RtpPayloadParams params(kSsrc2, &state2);
48 EncodedImage encoded_image;
49 encoded_image.rotation_ = kVideoRotation_90;
50 encoded_image.content_type_ = VideoContentType::SCREENSHARE;
Niels Möllerd3b8c632018-08-27 15:33:42 +020051 encoded_image.SetSpatialIndex(1);
Stefan Holmerf7044682018-07-17 10:16:41 +020052
53 CodecSpecificInfo codec_info;
Stefan Holmerf7044682018-07-17 10:16:41 +020054 codec_info.codecType = kVideoCodecVP8;
philipelbf2b6202018-08-27 14:33:18 +020055 codec_info.codecSpecific.VP8.temporalIdx = 0;
Stefan Holmerf7044682018-07-17 10:16:41 +020056 codec_info.codecSpecific.VP8.keyIdx = kNoKeyIdx;
philipelbf2b6202018-08-27 14:33:18 +020057 codec_info.codecSpecific.VP8.layerSync = false;
Stefan Holmerf7044682018-07-17 10:16:41 +020058 codec_info.codecSpecific.VP8.nonReference = true;
59
philipelbf2b6202018-08-27 14:33:18 +020060 RTPVideoHeader header =
61 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
62
63 codec_info.codecType = kVideoCodecVP8;
philipelbf2b6202018-08-27 14:33:18 +020064 codec_info.codecSpecific.VP8.temporalIdx = 1;
65 codec_info.codecSpecific.VP8.layerSync = true;
66
67 header = params.GetRtpVideoHeader(encoded_image, &codec_info, 1);
Stefan Holmerf7044682018-07-17 10:16:41 +020068
69 EXPECT_EQ(kVideoRotation_90, header.rotation);
70 EXPECT_EQ(VideoContentType::SCREENSHARE, header.content_type);
71 EXPECT_EQ(1, header.simulcastIdx);
72 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +000073 const auto& vp8_header =
74 absl::get<RTPVideoHeaderVP8>(header.video_type_header);
75 EXPECT_EQ(kPictureId + 2, vp8_header.pictureId);
76 EXPECT_EQ(kTemporalIdx, vp8_header.temporalIdx);
77 EXPECT_EQ(kTl0PicIdx + 1, vp8_header.tl0PicIdx);
78 EXPECT_EQ(kNoKeyIdx, vp8_header.keyIdx);
79 EXPECT_TRUE(vp8_header.layerSync);
80 EXPECT_TRUE(vp8_header.nonReference);
Stefan Holmerf7044682018-07-17 10:16:41 +020081}
82
83TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_Vp9) {
84 RtpPayloadState state;
85 state.picture_id = kPictureId;
86 state.tl0_pic_idx = kTl0PicIdx;
87 RtpPayloadParams params(kSsrc1, &state);
88
89 EncodedImage encoded_image;
90 encoded_image.rotation_ = kVideoRotation_90;
91 encoded_image.content_type_ = VideoContentType::SCREENSHARE;
Niels Möllerd3b8c632018-08-27 15:33:42 +020092 encoded_image.SetSpatialIndex(0);
Stefan Holmerf7044682018-07-17 10:16:41 +020093 CodecSpecificInfo codec_info;
Stefan Holmerf7044682018-07-17 10:16:41 +020094 codec_info.codecType = kVideoCodecVP9;
95 codec_info.codecSpecific.VP9.num_spatial_layers = 3;
96 codec_info.codecSpecific.VP9.first_frame_in_picture = true;
Stefan Holmerf7044682018-07-17 10:16:41 +020097 codec_info.codecSpecific.VP9.temporal_idx = 2;
98 codec_info.codecSpecific.VP9.end_of_picture = false;
99
philipelbf2b6202018-08-27 14:33:18 +0200100 RTPVideoHeader header =
101 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200102
103 EXPECT_EQ(kVideoRotation_90, header.rotation);
104 EXPECT_EQ(VideoContentType::SCREENSHARE, header.content_type);
105 EXPECT_EQ(kVideoCodecVP9, header.codec);
Johannes Krond0b69a82018-12-03 14:18:53 +0100106 EXPECT_FALSE(header.color_space);
philipel29d88462018-08-08 14:26:00 +0200107 const auto& vp9_header =
108 absl::get<RTPVideoHeaderVP9>(header.video_type_header);
109 EXPECT_EQ(kPictureId + 1, vp9_header.picture_id);
110 EXPECT_EQ(kTl0PicIdx, vp9_header.tl0_pic_idx);
111 EXPECT_EQ(vp9_header.temporal_idx, codec_info.codecSpecific.VP9.temporal_idx);
Niels Möllerd3b8c632018-08-27 15:33:42 +0200112 EXPECT_EQ(vp9_header.spatial_idx, encoded_image.SpatialIndex());
philipel29d88462018-08-08 14:26:00 +0200113 EXPECT_EQ(vp9_header.num_spatial_layers,
Stefan Holmerf7044682018-07-17 10:16:41 +0200114 codec_info.codecSpecific.VP9.num_spatial_layers);
philipel29d88462018-08-08 14:26:00 +0200115 EXPECT_EQ(vp9_header.end_of_picture,
Stefan Holmerf7044682018-07-17 10:16:41 +0200116 codec_info.codecSpecific.VP9.end_of_picture);
117
118 // Next spatial layer.
119 codec_info.codecSpecific.VP9.first_frame_in_picture = false;
Stefan Holmerf7044682018-07-17 10:16:41 +0200120 codec_info.codecSpecific.VP9.end_of_picture = true;
121
Niels Möllerd3b8c632018-08-27 15:33:42 +0200122 encoded_image.SetSpatialIndex(1);
Johannes Krond0b69a82018-12-03 14:18:53 +0100123 ColorSpace color_space(
124 ColorSpace::PrimaryID::kSMPTE170M, ColorSpace::TransferID::kSMPTE170M,
125 ColorSpace::MatrixID::kSMPTE170M, ColorSpace::RangeID::kFull);
Danil Chapovalovb7698942019-02-05 11:32:19 +0100126 encoded_image.SetColorSpace(color_space);
philipelbf2b6202018-08-27 14:33:18 +0200127 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200128
129 EXPECT_EQ(kVideoRotation_90, header.rotation);
130 EXPECT_EQ(VideoContentType::SCREENSHARE, header.content_type);
131 EXPECT_EQ(kVideoCodecVP9, header.codec);
Johannes Krond0b69a82018-12-03 14:18:53 +0100132 EXPECT_EQ(absl::make_optional(color_space), header.color_space);
philipel29d88462018-08-08 14:26:00 +0200133 EXPECT_EQ(kPictureId + 1, vp9_header.picture_id);
134 EXPECT_EQ(kTl0PicIdx, vp9_header.tl0_pic_idx);
135 EXPECT_EQ(vp9_header.temporal_idx, codec_info.codecSpecific.VP9.temporal_idx);
Niels Möllerd3b8c632018-08-27 15:33:42 +0200136 EXPECT_EQ(vp9_header.spatial_idx, encoded_image.SpatialIndex());
philipel29d88462018-08-08 14:26:00 +0200137 EXPECT_EQ(vp9_header.num_spatial_layers,
Stefan Holmerf7044682018-07-17 10:16:41 +0200138 codec_info.codecSpecific.VP9.num_spatial_layers);
philipel29d88462018-08-08 14:26:00 +0200139 EXPECT_EQ(vp9_header.end_of_picture,
Stefan Holmerf7044682018-07-17 10:16:41 +0200140 codec_info.codecSpecific.VP9.end_of_picture);
141}
142
143TEST(RtpPayloadParamsTest, InfoMappedToRtpVideoHeader_H264) {
Johnny Lee1a1c52b2019-02-08 14:25:40 -0500144 RtpPayloadState state;
145 state.picture_id = kPictureId;
146 state.tl0_pic_idx = kInitialTl0PicIdx1;
147 RtpPayloadParams params(kSsrc1, &state);
Stefan Holmerf7044682018-07-17 10:16:41 +0200148
149 EncodedImage encoded_image;
150 CodecSpecificInfo codec_info;
Johnny Lee1a1c52b2019-02-08 14:25:40 -0500151 CodecSpecificInfoH264 *h264info = &codec_info.codecSpecific.H264;
Stefan Holmerf7044682018-07-17 10:16:41 +0200152 codec_info.codecType = kVideoCodecH264;
Johnny Lee1a1c52b2019-02-08 14:25:40 -0500153 h264info->packetization_mode = H264PacketizationMode::SingleNalUnit;
154 h264info->temporal_idx = kNoTemporalIdx;
Stefan Holmerf7044682018-07-17 10:16:41 +0200155
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);
Johnny Lee1a1c52b2019-02-08 14:25:40 -0500163
164 // test temporal param 1
165 h264info->temporal_idx = 1;
166 h264info->base_layer_sync = true;
167 h264info->idr_frame = false;
168
169 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
170
171 EXPECT_EQ(kVideoCodecH264, header.codec);
172 EXPECT_EQ(header.frame_marking.tl0_pic_idx, kInitialTl0PicIdx1);
173 EXPECT_EQ(header.frame_marking.temporal_id, h264info->temporal_idx);
174 EXPECT_EQ(header.frame_marking.base_layer_sync, h264info->base_layer_sync);
175 EXPECT_EQ(header.frame_marking.independent_frame, h264info->idr_frame);
176
177 // test temporal param 2
178 h264info->temporal_idx = 0;
179 h264info->base_layer_sync = false;
180 h264info->idr_frame = true;
181
182 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
183
184 EXPECT_EQ(kVideoCodecH264, header.codec);
185 EXPECT_EQ(header.frame_marking.tl0_pic_idx, kInitialTl0PicIdx1 + 1);
186 EXPECT_EQ(header.frame_marking.temporal_id, h264info->temporal_idx);
187 EXPECT_EQ(header.frame_marking.base_layer_sync, h264info->base_layer_sync);
188 EXPECT_EQ(header.frame_marking.independent_frame, h264info->idr_frame);
Stefan Holmerf7044682018-07-17 10:16:41 +0200189}
190
191TEST(RtpPayloadParamsTest, PictureIdIsSetForVp8) {
192 RtpPayloadState state;
193 state.picture_id = kInitialPictureId1;
194 state.tl0_pic_idx = kInitialTl0PicIdx1;
195
196 EncodedImage encoded_image;
197 CodecSpecificInfo codec_info;
Stefan Holmerf7044682018-07-17 10:16:41 +0200198 codec_info.codecType = kVideoCodecVP8;
Stefan Holmerf7044682018-07-17 10:16:41 +0200199
200 RtpPayloadParams params(kSsrc1, &state);
philipelbf2b6202018-08-27 14:33:18 +0200201 RTPVideoHeader header =
202 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200203 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +0000204 EXPECT_EQ(kInitialPictureId1 + 1,
205 absl::get<RTPVideoHeaderVP8>(header.video_type_header).pictureId);
Stefan Holmerf7044682018-07-17 10:16:41 +0200206
207 // State should hold latest used picture id and tl0_pic_idx.
208 state = params.state();
209 EXPECT_EQ(kInitialPictureId1 + 1, state.picture_id);
210 EXPECT_EQ(kInitialTl0PicIdx1 + 1, state.tl0_pic_idx);
211}
212
213TEST(RtpPayloadParamsTest, PictureIdWraps) {
214 RtpPayloadState state;
215 state.picture_id = kMaxTwoBytePictureId;
216 state.tl0_pic_idx = kInitialTl0PicIdx1;
217
218 EncodedImage encoded_image;
219 CodecSpecificInfo codec_info;
Stefan Holmerf7044682018-07-17 10:16:41 +0200220 codec_info.codecType = kVideoCodecVP8;
221 codec_info.codecSpecific.VP8.temporalIdx = kNoTemporalIdx;
222
223 RtpPayloadParams params(kSsrc1, &state);
philipelbf2b6202018-08-27 14:33:18 +0200224 RTPVideoHeader header =
225 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200226 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +0000227 EXPECT_EQ(0,
228 absl::get<RTPVideoHeaderVP8>(header.video_type_header).pictureId);
Stefan Holmerf7044682018-07-17 10:16:41 +0200229
230 // State should hold latest used picture id and tl0_pic_idx.
231 EXPECT_EQ(0, params.state().picture_id); // Wrapped.
232 EXPECT_EQ(kInitialTl0PicIdx1, params.state().tl0_pic_idx);
233}
234
235TEST(RtpPayloadParamsTest, Tl0PicIdxUpdatedForVp8) {
236 RtpPayloadState state;
237 state.picture_id = kInitialPictureId1;
238 state.tl0_pic_idx = kInitialTl0PicIdx1;
239
240 EncodedImage encoded_image;
241 // Modules are sending for this test.
242 // OnEncodedImage, temporalIdx: 1.
243 CodecSpecificInfo codec_info;
Stefan Holmerf7044682018-07-17 10:16:41 +0200244 codec_info.codecType = kVideoCodecVP8;
245 codec_info.codecSpecific.VP8.temporalIdx = 1;
246
247 RtpPayloadParams params(kSsrc1, &state);
philipelbf2b6202018-08-27 14:33:18 +0200248 RTPVideoHeader header =
249 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200250
251 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +0000252 const auto& vp8_header =
253 absl::get<RTPVideoHeaderVP8>(header.video_type_header);
254 EXPECT_EQ(kInitialPictureId1 + 1, vp8_header.pictureId);
255 EXPECT_EQ(kInitialTl0PicIdx1, vp8_header.tl0PicIdx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200256
257 // OnEncodedImage, temporalIdx: 0.
258 codec_info.codecSpecific.VP8.temporalIdx = 0;
259
philipelbf2b6202018-08-27 14:33:18 +0200260 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200261 EXPECT_EQ(kVideoCodecVP8, header.codec);
Philip Eliassond52a1a62018-09-07 13:03:55 +0000262 EXPECT_EQ(kInitialPictureId1 + 2, vp8_header.pictureId);
263 EXPECT_EQ(kInitialTl0PicIdx1 + 1, vp8_header.tl0PicIdx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200264
265 // State should hold latest used picture id and tl0_pic_idx.
266 EXPECT_EQ(kInitialPictureId1 + 2, params.state().picture_id);
267 EXPECT_EQ(kInitialTl0PicIdx1 + 1, params.state().tl0_pic_idx);
268}
269
270TEST(RtpPayloadParamsTest, Tl0PicIdxUpdatedForVp9) {
271 RtpPayloadState state;
272 state.picture_id = kInitialPictureId1;
273 state.tl0_pic_idx = kInitialTl0PicIdx1;
274
275 EncodedImage encoded_image;
276 // Modules are sending for this test.
277 // OnEncodedImage, temporalIdx: 1.
278 CodecSpecificInfo codec_info;
Stefan Holmerf7044682018-07-17 10:16:41 +0200279 codec_info.codecType = kVideoCodecVP9;
280 codec_info.codecSpecific.VP9.temporal_idx = 1;
281 codec_info.codecSpecific.VP9.first_frame_in_picture = true;
282
283 RtpPayloadParams params(kSsrc1, &state);
philipelbf2b6202018-08-27 14:33:18 +0200284 RTPVideoHeader header =
285 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200286
287 EXPECT_EQ(kVideoCodecVP9, header.codec);
philipel29d88462018-08-08 14:26:00 +0200288 const auto& vp9_header =
289 absl::get<RTPVideoHeaderVP9>(header.video_type_header);
290 EXPECT_EQ(kInitialPictureId1 + 1, vp9_header.picture_id);
291 EXPECT_EQ(kInitialTl0PicIdx1, vp9_header.tl0_pic_idx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200292
293 // OnEncodedImage, temporalIdx: 0.
294 codec_info.codecSpecific.VP9.temporal_idx = 0;
295
philipelbf2b6202018-08-27 14:33:18 +0200296 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200297
298 EXPECT_EQ(kVideoCodecVP9, header.codec);
philipel29d88462018-08-08 14:26:00 +0200299 EXPECT_EQ(kInitialPictureId1 + 2, vp9_header.picture_id);
300 EXPECT_EQ(kInitialTl0PicIdx1 + 1, vp9_header.tl0_pic_idx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200301
302 // OnEncodedImage, first_frame_in_picture = false
303 codec_info.codecSpecific.VP9.first_frame_in_picture = false;
304
philipelbf2b6202018-08-27 14:33:18 +0200305 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
Stefan Holmerf7044682018-07-17 10:16:41 +0200306
307 EXPECT_EQ(kVideoCodecVP9, header.codec);
philipel29d88462018-08-08 14:26:00 +0200308 EXPECT_EQ(kInitialPictureId1 + 2, vp9_header.picture_id);
309 EXPECT_EQ(kInitialTl0PicIdx1 + 1, vp9_header.tl0_pic_idx);
Stefan Holmerf7044682018-07-17 10:16:41 +0200310
311 // State should hold latest used picture id and tl0_pic_idx.
312 EXPECT_EQ(kInitialPictureId1 + 2, params.state().picture_id);
313 EXPECT_EQ(kInitialTl0PicIdx1 + 1, params.state().tl0_pic_idx);
314}
philipelbf2b6202018-08-27 14:33:18 +0200315
316TEST(RtpPayloadParamsTest, PictureIdForOldGenericFormat) {
317 test::ScopedFieldTrials generic_picture_id(
318 "WebRTC-GenericPictureId/Enabled/");
319 RtpPayloadState state{};
320
321 EncodedImage encoded_image;
philipeld1d03592019-03-01 13:53:55 +0100322 CodecSpecificInfo codec_info;
philipelbf2b6202018-08-27 14:33:18 +0200323 codec_info.codecType = kVideoCodecGeneric;
324
325 RtpPayloadParams params(kSsrc1, &state);
326 RTPVideoHeader header =
327 params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
328
329 EXPECT_EQ(kVideoCodecGeneric, header.codec);
330 ASSERT_TRUE(header.generic);
331 EXPECT_EQ(0, header.generic->frame_id);
332
333 header = params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
334 ASSERT_TRUE(header.generic);
335 EXPECT_EQ(1, header.generic->frame_id);
336}
337
338class RtpPayloadParamsVp8ToGenericTest : public ::testing::Test {
339 public:
340 enum LayerSync { kNoSync, kSync };
341
philipel569397f2018-09-26 12:25:31 +0200342 RtpPayloadParamsVp8ToGenericTest()
343 : generic_descriptor_field_trial_("WebRTC-GenericDescriptor/Enabled/"),
344 state_(),
345 params_(123, &state_) {}
philipelbf2b6202018-08-27 14:33:18 +0200346
347 void ConvertAndCheck(int temporal_index,
348 int64_t shared_frame_id,
Niels Möller87e2d782019-03-07 10:18:23 +0100349 VideoFrameType frame_type,
philipelbf2b6202018-08-27 14:33:18 +0200350 LayerSync layer_sync,
philipelfab91292018-10-17 14:36:08 +0200351 const std::set<int64_t>& expected_deps,
352 uint16_t width = 0,
353 uint16_t height = 0) {
philipelbf2b6202018-08-27 14:33:18 +0200354 EncodedImage encoded_image;
355 encoded_image._frameType = frame_type;
philipelfab91292018-10-17 14:36:08 +0200356 encoded_image._encodedWidth = width;
357 encoded_image._encodedHeight = height;
philipelbf2b6202018-08-27 14:33:18 +0200358
philipeld1d03592019-03-01 13:53:55 +0100359 CodecSpecificInfo codec_info;
philipelbf2b6202018-08-27 14:33:18 +0200360 codec_info.codecType = kVideoCodecVP8;
361 codec_info.codecSpecific.VP8.temporalIdx = temporal_index;
362 codec_info.codecSpecific.VP8.layerSync = layer_sync == kSync;
363
364 RTPVideoHeader header =
365 params_.GetRtpVideoHeader(encoded_image, &codec_info, shared_frame_id);
366
367 ASSERT_TRUE(header.generic);
368 EXPECT_TRUE(header.generic->higher_spatial_layers.empty());
369 EXPECT_EQ(header.generic->spatial_index, 0);
370
371 EXPECT_EQ(header.generic->frame_id, shared_frame_id);
372 EXPECT_EQ(header.generic->temporal_index, temporal_index);
373 std::set<int64_t> actual_deps(header.generic->dependencies.begin(),
374 header.generic->dependencies.end());
375 EXPECT_EQ(expected_deps, actual_deps);
philipelfab91292018-10-17 14:36:08 +0200376
377 EXPECT_EQ(header.width, width);
378 EXPECT_EQ(header.height, height);
philipelbf2b6202018-08-27 14:33:18 +0200379 }
380
381 protected:
philipel569397f2018-09-26 12:25:31 +0200382 test::ScopedFieldTrials generic_descriptor_field_trial_;
philipelbf2b6202018-08-27 14:33:18 +0200383 RtpPayloadState state_;
384 RtpPayloadParams params_;
385};
386
387TEST_F(RtpPayloadParamsVp8ToGenericTest, Keyframe) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100388 ConvertAndCheck(0, 0, VideoFrameType::kVideoFrameKey, kNoSync, {}, 480, 360);
389 ConvertAndCheck(0, 1, VideoFrameType::kVideoFrameDelta, kNoSync, {0});
390 ConvertAndCheck(0, 2, VideoFrameType::kVideoFrameKey, kNoSync, {}, 480, 360);
philipelbf2b6202018-08-27 14:33:18 +0200391}
392
393TEST_F(RtpPayloadParamsVp8ToGenericTest, TooHighTemporalIndex) {
Niels Möller8f7ce222019-03-21 15:43:58 +0100394 ConvertAndCheck(0, 0, VideoFrameType::kVideoFrameKey, kNoSync, {}, 480, 360);
philipelbf2b6202018-08-27 14:33:18 +0200395
396 EncodedImage encoded_image;
Niels Möller8f7ce222019-03-21 15:43:58 +0100397 encoded_image._frameType = VideoFrameType::kVideoFrameDelta;
philipeld1d03592019-03-01 13:53:55 +0100398 CodecSpecificInfo codec_info;
philipelbf2b6202018-08-27 14:33:18 +0200399 codec_info.codecType = kVideoCodecVP8;
400 codec_info.codecSpecific.VP8.temporalIdx =
401 RtpGenericFrameDescriptor::kMaxTemporalLayers;
402 codec_info.codecSpecific.VP8.layerSync = false;
403
404 RTPVideoHeader header =
405 params_.GetRtpVideoHeader(encoded_image, &codec_info, 1);
406 EXPECT_FALSE(header.generic);
407}
408
409TEST_F(RtpPayloadParamsVp8ToGenericTest, LayerSync) {
410 // 02120212 pattern
Niels Möller8f7ce222019-03-21 15:43:58 +0100411 ConvertAndCheck(0, 0, VideoFrameType::kVideoFrameKey, kNoSync, {}, 480, 360);
412 ConvertAndCheck(2, 1, VideoFrameType::kVideoFrameDelta, kNoSync, {0});
413 ConvertAndCheck(1, 2, VideoFrameType::kVideoFrameDelta, kNoSync, {0});
414 ConvertAndCheck(2, 3, VideoFrameType::kVideoFrameDelta, kNoSync, {0, 1, 2});
philipelbf2b6202018-08-27 14:33:18 +0200415
Niels Möller8f7ce222019-03-21 15:43:58 +0100416 ConvertAndCheck(0, 4, VideoFrameType::kVideoFrameDelta, kNoSync, {0});
417 ConvertAndCheck(2, 5, VideoFrameType::kVideoFrameDelta, kNoSync, {2, 3, 4});
418 ConvertAndCheck(1, 6, VideoFrameType::kVideoFrameDelta, kSync,
419 {4}); // layer sync
420 ConvertAndCheck(2, 7, VideoFrameType::kVideoFrameDelta, kNoSync, {4, 5, 6});
philipelbf2b6202018-08-27 14:33:18 +0200421}
422
423TEST_F(RtpPayloadParamsVp8ToGenericTest, FrameIdGaps) {
424 // 0101 pattern
Niels Möller8f7ce222019-03-21 15:43:58 +0100425 ConvertAndCheck(0, 0, VideoFrameType::kVideoFrameKey, kNoSync, {}, 480, 360);
426 ConvertAndCheck(1, 1, VideoFrameType::kVideoFrameDelta, kNoSync, {0});
philipelbf2b6202018-08-27 14:33:18 +0200427
Niels Möller8f7ce222019-03-21 15:43:58 +0100428 ConvertAndCheck(0, 5, VideoFrameType::kVideoFrameDelta, kNoSync, {0});
429 ConvertAndCheck(1, 10, VideoFrameType::kVideoFrameDelta, kNoSync, {1, 5});
philipelbf2b6202018-08-27 14:33:18 +0200430
Niels Möller8f7ce222019-03-21 15:43:58 +0100431 ConvertAndCheck(0, 15, VideoFrameType::kVideoFrameDelta, kNoSync, {5});
432 ConvertAndCheck(1, 20, VideoFrameType::kVideoFrameDelta, kNoSync, {10, 15});
philipelbf2b6202018-08-27 14:33:18 +0200433}
434
Stefan Holmerf7044682018-07-17 10:16:41 +0200435} // namespace webrtc