OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 void InsertVp9Gof(uint16_t seq_num_start, | 115 void InsertVp9Gof(uint16_t seq_num_start, |
116 uint16_t seq_num_end, | 116 uint16_t seq_num_end, |
117 bool keyframe, | 117 bool keyframe, |
118 int32_t pid = kNoPictureId, | 118 int32_t pid = kNoPictureId, |
119 uint8_t sid = kNoSpatialIdx, | 119 uint8_t sid = kNoSpatialIdx, |
120 uint8_t tid = kNoTemporalIdx, | 120 uint8_t tid = kNoTemporalIdx, |
121 int32_t tl0 = kNoTl0PicIdx, | 121 int32_t tl0 = kNoTl0PicIdx, |
122 bool up_switch = false, | 122 bool up_switch = false, |
123 GofInfoVP9* ss = nullptr) { | 123 GofInfoVP9* ss = nullptr) { |
124 VCMPacket packet; | 124 VCMPacket packet; |
| 125 packet.timestamp = pid; |
125 packet.codec = kVideoCodecVP9; | 126 packet.codec = kVideoCodecVP9; |
126 packet.seqNum = seq_num_start; | 127 packet.seqNum = seq_num_start; |
127 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 128 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
128 packet.video_header.codecHeader.VP9.flexible_mode = false; | 129 packet.video_header.codecHeader.VP9.flexible_mode = false; |
129 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); | 130 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); |
130 packet.video_header.codecHeader.VP9.temporal_idx = tid; | 131 packet.video_header.codecHeader.VP9.temporal_idx = tid; |
131 packet.video_header.codecHeader.VP9.spatial_idx = sid; | 132 packet.video_header.codecHeader.VP9.spatial_idx = sid; |
132 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; | 133 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; |
133 packet.video_header.codecHeader.VP9.temporal_up_switch = up_switch; | 134 packet.video_header.codecHeader.VP9.temporal_up_switch = up_switch; |
134 if (ss != nullptr) { | 135 if (ss != nullptr) { |
(...skipping 10 matching lines...) Expand all Loading... |
145 void InsertVp9Flex(uint16_t seq_num_start, | 146 void InsertVp9Flex(uint16_t seq_num_start, |
146 uint16_t seq_num_end, | 147 uint16_t seq_num_end, |
147 bool keyframe, | 148 bool keyframe, |
148 int32_t pid = kNoPictureId, | 149 int32_t pid = kNoPictureId, |
149 uint8_t sid = kNoSpatialIdx, | 150 uint8_t sid = kNoSpatialIdx, |
150 uint8_t tid = kNoTemporalIdx, | 151 uint8_t tid = kNoTemporalIdx, |
151 int32_t tl0 = kNoTl0PicIdx, | 152 int32_t tl0 = kNoTl0PicIdx, |
152 bool inter = false, | 153 bool inter = false, |
153 std::vector<uint8_t> refs = std::vector<uint8_t>()) { | 154 std::vector<uint8_t> refs = std::vector<uint8_t>()) { |
154 VCMPacket packet; | 155 VCMPacket packet; |
| 156 packet.timestamp = pid; |
155 packet.codec = kVideoCodecVP9; | 157 packet.codec = kVideoCodecVP9; |
156 packet.seqNum = seq_num_start; | 158 packet.seqNum = seq_num_start; |
157 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 159 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
158 packet.video_header.codecHeader.VP9.inter_layer_predicted = inter; | 160 packet.video_header.codecHeader.VP9.inter_layer_predicted = inter; |
159 packet.video_header.codecHeader.VP9.flexible_mode = true; | 161 packet.video_header.codecHeader.VP9.flexible_mode = true; |
160 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); | 162 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); |
161 packet.video_header.codecHeader.VP9.temporal_idx = tid; | 163 packet.video_header.codecHeader.VP9.temporal_idx = tid; |
162 packet.video_header.codecHeader.VP9.spatial_idx = sid; | 164 packet.video_header.codecHeader.VP9.spatial_idx = sid; |
163 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; | 165 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; |
164 packet.video_header.codecHeader.VP9.num_ref_pics = refs.size(); | 166 packet.video_header.codecHeader.VP9.num_ref_pics = refs.size(); |
(...skipping 1049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1214 CheckReferencesVp9(pid + 4, 0, pid + 2); | 1216 CheckReferencesVp9(pid + 4, 0, pid + 2); |
1215 CheckReferencesVp9(pid + 4, 1, pid + 3); | 1217 CheckReferencesVp9(pid + 4, 1, pid + 3); |
1216 CheckReferencesVp9(pid + 5, 1, pid + 4); | 1218 CheckReferencesVp9(pid + 5, 1, pid + 4); |
1217 CheckReferencesVp9(pid + 6, 0, pid + 4); | 1219 CheckReferencesVp9(pid + 6, 0, pid + 4); |
1218 CheckReferencesVp9(pid + 6, 1, pid + 5); | 1220 CheckReferencesVp9(pid + 6, 1, pid + 5); |
1219 CheckReferencesVp9(pid + 7, 1, pid + 6); | 1221 CheckReferencesVp9(pid + 7, 1, pid + 6); |
1220 CheckReferencesVp9(pid + 8, 0, pid + 6); | 1222 CheckReferencesVp9(pid + 8, 0, pid + 6); |
1221 CheckReferencesVp9(pid + 8, 1, pid + 7); | 1223 CheckReferencesVp9(pid + 8, 1, pid + 7); |
1222 } | 1224 } |
1223 | 1225 |
| 1226 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be |
| 1227 // around M59). |
| 1228 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidJumpsBackwardThenForward) { |
| 1229 GofInfoVP9 ss; |
| 1230 ss.SetGofInfoVP9(kTemporalStructureMode1); |
| 1231 |
| 1232 VCMPacket packet; |
| 1233 packet.timestamp = 0; |
| 1234 packet.codec = kVideoCodecVP9; |
| 1235 packet.frameType = kVideoFrameKey; |
| 1236 packet.video_header.codecHeader.VP9.flexible_mode = false; |
| 1237 packet.video_header.codecHeader.VP9.picture_id = 1; |
| 1238 packet.video_header.codecHeader.VP9.temporal_idx = 0; |
| 1239 packet.video_header.codecHeader.VP9.spatial_idx = 0; |
| 1240 packet.video_header.codecHeader.VP9.tl0_pic_idx = 0; |
| 1241 packet.video_header.codecHeader.VP9.temporal_up_switch = true; |
| 1242 packet.video_header.codecHeader.VP9.ss_data_available = true; |
| 1243 packet.video_header.codecHeader.VP9.gof = ss; |
| 1244 |
| 1245 { |
| 1246 ref_packet_buffer_->InsertPacket(packet); |
| 1247 std::unique_ptr<RtpFrameObject> frame( |
| 1248 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1249 reference_finder_->ManageFrame(std::move(frame)); |
| 1250 } |
| 1251 |
| 1252 // Timestamp goes forward but pid goes backwards. |
| 1253 packet.timestamp = 1; |
| 1254 packet.video_header.codecHeader.VP9.picture_id = 0; |
| 1255 |
| 1256 { |
| 1257 ref_packet_buffer_->InsertPacket(packet); |
| 1258 std::unique_ptr<RtpFrameObject> frame( |
| 1259 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1260 reference_finder_->ManageFrame(std::move(frame)); |
| 1261 } |
| 1262 |
| 1263 packet.timestamp = 2; |
| 1264 packet.video_header.codecHeader.VP9.picture_id = 5000; |
| 1265 |
| 1266 { |
| 1267 ref_packet_buffer_->InsertPacket(packet); |
| 1268 std::unique_ptr<RtpFrameObject> frame( |
| 1269 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1270 reference_finder_->ManageFrame(std::move(frame)); |
| 1271 } |
| 1272 |
| 1273 ASSERT_EQ(3UL, frames_from_callback_.size()); |
| 1274 CheckReferencesVp9(1, 0); |
| 1275 CheckReferencesVp9(129, 0); |
| 1276 CheckReferencesVp9(257, 0); |
| 1277 } |
| 1278 |
| 1279 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be |
| 1280 // around M59). |
| 1281 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_Tl0JumpsBackwardThenForward) { |
| 1282 GofInfoVP9 ss; |
| 1283 ss.SetGofInfoVP9(kTemporalStructureMode1); |
| 1284 |
| 1285 VCMPacket packet; |
| 1286 packet.timestamp = 0; |
| 1287 packet.codec = kVideoCodecVP9; |
| 1288 packet.frameType = kVideoFrameKey; |
| 1289 packet.video_header.codecHeader.VP9.flexible_mode = false; |
| 1290 packet.video_header.codecHeader.VP9.picture_id = 0; |
| 1291 packet.video_header.codecHeader.VP9.temporal_idx = 0; |
| 1292 packet.video_header.codecHeader.VP9.spatial_idx = 0; |
| 1293 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; |
| 1294 packet.video_header.codecHeader.VP9.temporal_up_switch = true; |
| 1295 packet.video_header.codecHeader.VP9.ss_data_available = true; |
| 1296 packet.video_header.codecHeader.VP9.gof = ss; |
| 1297 { |
| 1298 ref_packet_buffer_->InsertPacket(packet); |
| 1299 std::unique_ptr<RtpFrameObject> frame( |
| 1300 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1301 reference_finder_->ManageFrame(std::move(frame)); |
| 1302 } |
| 1303 |
| 1304 packet.timestamp = 1; |
| 1305 packet.video_header.codecHeader.VP9.picture_id = 1; |
| 1306 packet.video_header.codecHeader.VP9.tl0_pic_idx = 0; |
| 1307 { |
| 1308 ref_packet_buffer_->InsertPacket(packet); |
| 1309 std::unique_ptr<RtpFrameObject> frame( |
| 1310 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1311 reference_finder_->ManageFrame(std::move(frame)); |
| 1312 } |
| 1313 |
| 1314 packet.timestamp = 2; |
| 1315 packet.frameType = kVideoFrameDelta; |
| 1316 packet.video_header.codecHeader.VP9.picture_id = 2; |
| 1317 packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; |
| 1318 { |
| 1319 ref_packet_buffer_->InsertPacket(packet); |
| 1320 std::unique_ptr<RtpFrameObject> frame( |
| 1321 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1322 reference_finder_->ManageFrame(std::move(frame)); |
| 1323 } |
| 1324 |
| 1325 packet.timestamp = 3; |
| 1326 packet.frameType = kVideoFrameKey; |
| 1327 packet.video_header.codecHeader.VP9.ss_data_available = true; |
| 1328 packet.video_header.codecHeader.VP9.picture_id = 3; |
| 1329 packet.video_header.codecHeader.VP9.tl0_pic_idx = 129; |
| 1330 { |
| 1331 ref_packet_buffer_->InsertPacket(packet); |
| 1332 std::unique_ptr<RtpFrameObject> frame( |
| 1333 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1334 reference_finder_->ManageFrame(std::move(frame)); |
| 1335 } |
| 1336 |
| 1337 ASSERT_EQ(4UL, frames_from_callback_.size()); |
| 1338 CheckReferencesVp9(0, 0); |
| 1339 CheckReferencesVp9(128, 0); |
| 1340 CheckReferencesVp9(129, 0, 128); |
| 1341 CheckReferencesVp9(257, 0); |
| 1342 } |
| 1343 |
| 1344 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be |
| 1345 // around M59). |
| 1346 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidSmallJumpForward) { |
| 1347 GofInfoVP9 ss; |
| 1348 ss.SetGofInfoVP9(kTemporalStructureMode1); |
| 1349 |
| 1350 VCMPacket packet; |
| 1351 packet.timestamp = 0; |
| 1352 packet.codec = kVideoCodecVP9; |
| 1353 packet.frameType = kVideoFrameKey; |
| 1354 packet.video_header.codecHeader.VP9.flexible_mode = false; |
| 1355 packet.video_header.codecHeader.VP9.picture_id = 1; |
| 1356 packet.video_header.codecHeader.VP9.temporal_idx = 0; |
| 1357 packet.video_header.codecHeader.VP9.spatial_idx = 0; |
| 1358 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; |
| 1359 packet.video_header.codecHeader.VP9.temporal_up_switch = true; |
| 1360 packet.video_header.codecHeader.VP9.ss_data_available = true; |
| 1361 packet.video_header.codecHeader.VP9.gof = ss; |
| 1362 { |
| 1363 ref_packet_buffer_->InsertPacket(packet); |
| 1364 std::unique_ptr<RtpFrameObject> frame( |
| 1365 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1366 reference_finder_->ManageFrame(std::move(frame)); |
| 1367 } |
| 1368 |
| 1369 packet.timestamp = 1; |
| 1370 packet.video_header.codecHeader.VP9.picture_id = 2; |
| 1371 packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; |
| 1372 { |
| 1373 ref_packet_buffer_->InsertPacket(packet); |
| 1374 std::unique_ptr<RtpFrameObject> frame( |
| 1375 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1376 reference_finder_->ManageFrame(std::move(frame)); |
| 1377 } |
| 1378 |
| 1379 packet.timestamp = 2; |
| 1380 packet.video_header.codecHeader.VP9.picture_id = 3; |
| 1381 packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; |
| 1382 { |
| 1383 ref_packet_buffer_->InsertPacket(packet); |
| 1384 std::unique_ptr<RtpFrameObject> frame( |
| 1385 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1386 reference_finder_->ManageFrame(std::move(frame)); |
| 1387 } |
| 1388 |
| 1389 packet.timestamp = 2; |
| 1390 packet.video_header.codecHeader.VP9.picture_id = 4; |
| 1391 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; |
| 1392 { |
| 1393 ref_packet_buffer_->InsertPacket(packet); |
| 1394 std::unique_ptr<RtpFrameObject> frame( |
| 1395 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1396 reference_finder_->ManageFrame(std::move(frame)); |
| 1397 } |
| 1398 |
| 1399 ASSERT_EQ(4UL, frames_from_callback_.size()); |
| 1400 CheckReferencesVp9(1, 0); |
| 1401 CheckReferencesVp9(2, 0); |
| 1402 CheckReferencesVp9(3, 0); |
| 1403 CheckReferencesVp9(131, 0); |
| 1404 } |
| 1405 |
| 1406 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be |
| 1407 // around M59). |
| 1408 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_DropOldFrame) { |
| 1409 GofInfoVP9 ss; |
| 1410 ss.SetGofInfoVP9(kTemporalStructureMode1); |
| 1411 |
| 1412 VCMPacket packet; |
| 1413 packet.timestamp = 0; |
| 1414 packet.codec = kVideoCodecVP9; |
| 1415 packet.frameType = kVideoFrameKey; |
| 1416 packet.video_header.codecHeader.VP9.flexible_mode = false; |
| 1417 packet.video_header.codecHeader.VP9.picture_id = 1; |
| 1418 packet.video_header.codecHeader.VP9.temporal_idx = 0; |
| 1419 packet.video_header.codecHeader.VP9.spatial_idx = 0; |
| 1420 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; |
| 1421 packet.video_header.codecHeader.VP9.temporal_up_switch = true; |
| 1422 packet.video_header.codecHeader.VP9.ss_data_available = true; |
| 1423 packet.video_header.codecHeader.VP9.gof = ss; |
| 1424 { |
| 1425 ref_packet_buffer_->InsertPacket(packet); |
| 1426 std::unique_ptr<RtpFrameObject> frame( |
| 1427 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1428 reference_finder_->ManageFrame(std::move(frame)); |
| 1429 } |
| 1430 |
| 1431 packet.timestamp = 1; |
| 1432 packet.video_header.codecHeader.VP9.picture_id = 0; |
| 1433 packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; |
| 1434 { |
| 1435 ref_packet_buffer_->InsertPacket(packet); |
| 1436 std::unique_ptr<RtpFrameObject> frame( |
| 1437 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1438 reference_finder_->ManageFrame(std::move(frame)); |
| 1439 } |
| 1440 |
| 1441 packet.timestamp = 0; |
| 1442 packet.video_header.codecHeader.VP9.picture_id = 3; |
| 1443 packet.video_header.codecHeader.VP9.tl0_pic_idx = 2; |
| 1444 { |
| 1445 ref_packet_buffer_->InsertPacket(packet); |
| 1446 std::unique_ptr<RtpFrameObject> frame( |
| 1447 new RtpFrameObject(ref_packet_buffer_, 0, 0, 0, 0, 0)); |
| 1448 reference_finder_->ManageFrame(std::move(frame)); |
| 1449 } |
| 1450 |
| 1451 ASSERT_EQ(2UL, frames_from_callback_.size()); |
| 1452 CheckReferencesVp9(1, 0); |
| 1453 CheckReferencesVp9(129, 0); |
| 1454 } |
| 1455 |
1224 } // namespace video_coding | 1456 } // namespace video_coding |
1225 } // namespace webrtc | 1457 } // namespace webrtc |
OLD | NEW |