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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 std::make_pair(std::make_pair(pid, sidx), std::move(frame))); | 76 std::make_pair(std::make_pair(pid, sidx), std::move(frame))); |
77 } | 77 } |
78 | 78 |
79 void InsertGeneric(uint16_t seq_num_start, | 79 void InsertGeneric(uint16_t seq_num_start, |
80 uint16_t seq_num_end, | 80 uint16_t seq_num_end, |
81 bool keyframe) { | 81 bool keyframe) { |
82 VCMPacket packet; | 82 VCMPacket packet; |
83 packet.codec = kVideoCodecGeneric; | 83 packet.codec = kVideoCodecGeneric; |
84 packet.seqNum = seq_num_start; | 84 packet.seqNum = seq_num_start; |
85 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 85 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
| 86 ref_packet_buffer_->InsertPacket(packet); |
86 | 87 |
| 88 packet.seqNum = seq_num_end; |
| 89 packet.markerBit = true; |
87 ref_packet_buffer_->InsertPacket(packet); | 90 ref_packet_buffer_->InsertPacket(packet); |
| 91 |
88 std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject( | 92 std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject( |
89 ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0)); | 93 ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0)); |
90 reference_finder_->ManageFrame(std::move(frame)); | 94 reference_finder_->ManageFrame(std::move(frame)); |
91 } | 95 } |
92 | 96 |
93 void InsertVp8(uint16_t seq_num_start, | 97 void InsertVp8(uint16_t seq_num_start, |
94 uint16_t seq_num_end, | 98 uint16_t seq_num_end, |
95 bool keyframe, | 99 bool keyframe, |
96 int32_t pid = kNoPictureId, | 100 int32_t pid = kNoPictureId, |
97 uint8_t tid = kNoTemporalIdx, | 101 uint8_t tid = kNoTemporalIdx, |
98 int32_t tl0 = kNoTl0PicIdx, | 102 int32_t tl0 = kNoTl0PicIdx, |
99 bool sync = false) { | 103 bool sync = false) { |
100 VCMPacket packet; | 104 VCMPacket packet; |
101 packet.codec = kVideoCodecVP8; | 105 packet.codec = kVideoCodecVP8; |
102 packet.seqNum = seq_num_start; | 106 packet.seqNum = seq_num_start; |
| 107 packet.markerBit = (seq_num_start == seq_num_end); |
103 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 108 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
104 packet.video_header.codecHeader.VP8.pictureId = pid % (1 << 15); | 109 packet.video_header.codecHeader.VP8.pictureId = pid % (1 << 15); |
105 packet.video_header.codecHeader.VP8.temporalIdx = tid; | 110 packet.video_header.codecHeader.VP8.temporalIdx = tid; |
106 packet.video_header.codecHeader.VP8.tl0PicIdx = tl0; | 111 packet.video_header.codecHeader.VP8.tl0PicIdx = tl0; |
107 packet.video_header.codecHeader.VP8.layerSync = sync; | 112 packet.video_header.codecHeader.VP8.layerSync = sync; |
| 113 ref_packet_buffer_->InsertPacket(packet); |
108 | 114 |
109 ref_packet_buffer_->InsertPacket(packet); | 115 if (seq_num_start != seq_num_end) { |
| 116 packet.seqNum = seq_num_end; |
| 117 packet.markerBit = true; |
| 118 ref_packet_buffer_->InsertPacket(packet); |
| 119 } |
| 120 |
110 std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject( | 121 std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject( |
111 ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0)); | 122 ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0)); |
112 reference_finder_->ManageFrame(std::move(frame)); | 123 reference_finder_->ManageFrame(std::move(frame)); |
113 } | 124 } |
114 | 125 |
115 void InsertVp9Gof(uint16_t seq_num_start, | 126 void InsertVp9Gof(uint16_t seq_num_start, |
116 uint16_t seq_num_end, | 127 uint16_t seq_num_end, |
117 bool keyframe, | 128 bool keyframe, |
118 int32_t pid = kNoPictureId, | 129 int32_t pid = kNoPictureId, |
119 uint8_t sid = kNoSpatialIdx, | 130 uint8_t sid = kNoSpatialIdx, |
120 uint8_t tid = kNoTemporalIdx, | 131 uint8_t tid = kNoTemporalIdx, |
121 int32_t tl0 = kNoTl0PicIdx, | 132 int32_t tl0 = kNoTl0PicIdx, |
122 bool up_switch = false, | 133 bool up_switch = false, |
123 GofInfoVP9* ss = nullptr) { | 134 GofInfoVP9* ss = nullptr) { |
124 VCMPacket packet; | 135 VCMPacket packet; |
125 packet.timestamp = pid; | 136 packet.timestamp = pid; |
126 packet.codec = kVideoCodecVP9; | 137 packet.codec = kVideoCodecVP9; |
127 packet.seqNum = seq_num_start; | 138 packet.seqNum = seq_num_start; |
| 139 packet.markerBit = (seq_num_start == seq_num_end); |
128 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 140 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
129 packet.video_header.codecHeader.VP9.flexible_mode = false; | 141 packet.video_header.codecHeader.VP9.flexible_mode = false; |
130 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); | 142 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); |
131 packet.video_header.codecHeader.VP9.temporal_idx = tid; | 143 packet.video_header.codecHeader.VP9.temporal_idx = tid; |
132 packet.video_header.codecHeader.VP9.spatial_idx = sid; | 144 packet.video_header.codecHeader.VP9.spatial_idx = sid; |
133 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; | 145 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; |
134 packet.video_header.codecHeader.VP9.temporal_up_switch = up_switch; | 146 packet.video_header.codecHeader.VP9.temporal_up_switch = up_switch; |
135 if (ss != nullptr) { | 147 if (ss != nullptr) { |
136 packet.video_header.codecHeader.VP9.ss_data_available = true; | 148 packet.video_header.codecHeader.VP9.ss_data_available = true; |
137 packet.video_header.codecHeader.VP9.gof = *ss; | 149 packet.video_header.codecHeader.VP9.gof = *ss; |
138 } | 150 } |
| 151 ref_packet_buffer_->InsertPacket(packet); |
139 | 152 |
140 ref_packet_buffer_->InsertPacket(packet); | 153 if (seq_num_start != seq_num_end) { |
| 154 packet.markerBit = true; |
| 155 packet.video_header.codecHeader.VP9.ss_data_available = false; |
| 156 packet.seqNum = seq_num_end; |
| 157 ref_packet_buffer_->InsertPacket(packet); |
| 158 } |
| 159 |
141 std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject( | 160 std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject( |
142 ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0)); | 161 ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0)); |
143 reference_finder_->ManageFrame(std::move(frame)); | 162 reference_finder_->ManageFrame(std::move(frame)); |
144 } | 163 } |
145 | 164 |
146 void InsertVp9Flex(uint16_t seq_num_start, | 165 void InsertVp9Flex(uint16_t seq_num_start, |
147 uint16_t seq_num_end, | 166 uint16_t seq_num_end, |
148 bool keyframe, | 167 bool keyframe, |
149 int32_t pid = kNoPictureId, | 168 int32_t pid = kNoPictureId, |
150 uint8_t sid = kNoSpatialIdx, | 169 uint8_t sid = kNoSpatialIdx, |
151 uint8_t tid = kNoTemporalIdx, | 170 uint8_t tid = kNoTemporalIdx, |
152 int32_t tl0 = kNoTl0PicIdx, | 171 int32_t tl0 = kNoTl0PicIdx, |
153 bool inter = false, | 172 bool inter = false, |
154 std::vector<uint8_t> refs = std::vector<uint8_t>()) { | 173 std::vector<uint8_t> refs = std::vector<uint8_t>()) { |
155 VCMPacket packet; | 174 VCMPacket packet; |
156 packet.timestamp = pid; | 175 packet.timestamp = pid; |
157 packet.codec = kVideoCodecVP9; | 176 packet.codec = kVideoCodecVP9; |
158 packet.seqNum = seq_num_start; | 177 packet.seqNum = seq_num_start; |
| 178 packet.markerBit = (seq_num_start == seq_num_end); |
159 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 179 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
160 packet.video_header.codecHeader.VP9.inter_layer_predicted = inter; | 180 packet.video_header.codecHeader.VP9.inter_layer_predicted = inter; |
161 packet.video_header.codecHeader.VP9.flexible_mode = true; | 181 packet.video_header.codecHeader.VP9.flexible_mode = true; |
162 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); | 182 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); |
163 packet.video_header.codecHeader.VP9.temporal_idx = tid; | 183 packet.video_header.codecHeader.VP9.temporal_idx = tid; |
164 packet.video_header.codecHeader.VP9.spatial_idx = sid; | 184 packet.video_header.codecHeader.VP9.spatial_idx = sid; |
165 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; | 185 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; |
166 packet.video_header.codecHeader.VP9.num_ref_pics = refs.size(); | 186 packet.video_header.codecHeader.VP9.num_ref_pics = refs.size(); |
167 for (size_t i = 0; i < refs.size(); ++i) | 187 for (size_t i = 0; i < refs.size(); ++i) |
168 packet.video_header.codecHeader.VP9.pid_diff[i] = refs[i]; | 188 packet.video_header.codecHeader.VP9.pid_diff[i] = refs[i]; |
| 189 ref_packet_buffer_->InsertPacket(packet); |
169 | 190 |
170 ref_packet_buffer_->InsertPacket(packet); | 191 if (seq_num_start != seq_num_end) { |
| 192 packet.seqNum = seq_num_end; |
| 193 packet.markerBit = true; |
| 194 ref_packet_buffer_->InsertPacket(packet); |
| 195 } |
| 196 |
171 std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject( | 197 std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject( |
172 ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0)); | 198 ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0)); |
173 reference_finder_->ManageFrame(std::move(frame)); | 199 reference_finder_->ManageFrame(std::move(frame)); |
174 } | 200 } |
175 | 201 |
176 // Check if a frame with picture id |pid| and spatial index |sidx| has been | 202 // Check if a frame with picture id |pid| and spatial index |sidx| has been |
177 // delivered from the packet buffer, and if so, if it has the references | 203 // delivered from the packet buffer, and if so, if it has the references |
178 // specified by |refs|. | 204 // specified by |refs|. |
179 template <typename... T> | 205 template <typename... T> |
180 void CheckReferences(uint16_t pid, uint16_t sidx, T... refs) const { | 206 void CheckReferences(uint16_t pid, uint16_t sidx, T... refs) const { |
(...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1226 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be | 1252 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be |
1227 // around M59). | 1253 // around M59). |
1228 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidJumpsBackwardThenForward) { | 1254 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidJumpsBackwardThenForward) { |
1229 GofInfoVP9 ss; | 1255 GofInfoVP9 ss; |
1230 ss.SetGofInfoVP9(kTemporalStructureMode1); | 1256 ss.SetGofInfoVP9(kTemporalStructureMode1); |
1231 | 1257 |
1232 VCMPacket packet; | 1258 VCMPacket packet; |
1233 packet.timestamp = 0; | 1259 packet.timestamp = 0; |
1234 packet.codec = kVideoCodecVP9; | 1260 packet.codec = kVideoCodecVP9; |
1235 packet.frameType = kVideoFrameKey; | 1261 packet.frameType = kVideoFrameKey; |
| 1262 packet.markerBit = true; |
1236 packet.video_header.codecHeader.VP9.flexible_mode = false; | 1263 packet.video_header.codecHeader.VP9.flexible_mode = false; |
1237 packet.video_header.codecHeader.VP9.picture_id = 1; | 1264 packet.video_header.codecHeader.VP9.picture_id = 1; |
1238 packet.video_header.codecHeader.VP9.temporal_idx = 0; | 1265 packet.video_header.codecHeader.VP9.temporal_idx = 0; |
1239 packet.video_header.codecHeader.VP9.spatial_idx = 0; | 1266 packet.video_header.codecHeader.VP9.spatial_idx = 0; |
1240 packet.video_header.codecHeader.VP9.tl0_pic_idx = 0; | 1267 packet.video_header.codecHeader.VP9.tl0_pic_idx = 0; |
1241 packet.video_header.codecHeader.VP9.temporal_up_switch = true; | 1268 packet.video_header.codecHeader.VP9.temporal_up_switch = true; |
1242 packet.video_header.codecHeader.VP9.ss_data_available = true; | 1269 packet.video_header.codecHeader.VP9.ss_data_available = true; |
1243 packet.video_header.codecHeader.VP9.gof = ss; | 1270 packet.video_header.codecHeader.VP9.gof = ss; |
1244 | 1271 |
1245 { | 1272 { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1279 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be | 1306 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be |
1280 // around M59). | 1307 // around M59). |
1281 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_Tl0JumpsBackwardThenForward) { | 1308 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_Tl0JumpsBackwardThenForward) { |
1282 GofInfoVP9 ss; | 1309 GofInfoVP9 ss; |
1283 ss.SetGofInfoVP9(kTemporalStructureMode1); | 1310 ss.SetGofInfoVP9(kTemporalStructureMode1); |
1284 | 1311 |
1285 VCMPacket packet; | 1312 VCMPacket packet; |
1286 packet.timestamp = 0; | 1313 packet.timestamp = 0; |
1287 packet.codec = kVideoCodecVP9; | 1314 packet.codec = kVideoCodecVP9; |
1288 packet.frameType = kVideoFrameKey; | 1315 packet.frameType = kVideoFrameKey; |
| 1316 packet.markerBit = true; |
1289 packet.video_header.codecHeader.VP9.flexible_mode = false; | 1317 packet.video_header.codecHeader.VP9.flexible_mode = false; |
1290 packet.video_header.codecHeader.VP9.picture_id = 0; | 1318 packet.video_header.codecHeader.VP9.picture_id = 0; |
1291 packet.video_header.codecHeader.VP9.temporal_idx = 0; | 1319 packet.video_header.codecHeader.VP9.temporal_idx = 0; |
1292 packet.video_header.codecHeader.VP9.spatial_idx = 0; | 1320 packet.video_header.codecHeader.VP9.spatial_idx = 0; |
1293 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; | 1321 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; |
1294 packet.video_header.codecHeader.VP9.temporal_up_switch = true; | 1322 packet.video_header.codecHeader.VP9.temporal_up_switch = true; |
1295 packet.video_header.codecHeader.VP9.ss_data_available = true; | 1323 packet.video_header.codecHeader.VP9.ss_data_available = true; |
1296 packet.video_header.codecHeader.VP9.gof = ss; | 1324 packet.video_header.codecHeader.VP9.gof = ss; |
1297 { | 1325 { |
1298 ref_packet_buffer_->InsertPacket(packet); | 1326 ref_packet_buffer_->InsertPacket(packet); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be | 1372 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be |
1345 // around M59). | 1373 // around M59). |
1346 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidSmallJumpForward) { | 1374 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_PidSmallJumpForward) { |
1347 GofInfoVP9 ss; | 1375 GofInfoVP9 ss; |
1348 ss.SetGofInfoVP9(kTemporalStructureMode1); | 1376 ss.SetGofInfoVP9(kTemporalStructureMode1); |
1349 | 1377 |
1350 VCMPacket packet; | 1378 VCMPacket packet; |
1351 packet.timestamp = 0; | 1379 packet.timestamp = 0; |
1352 packet.codec = kVideoCodecVP9; | 1380 packet.codec = kVideoCodecVP9; |
1353 packet.frameType = kVideoFrameKey; | 1381 packet.frameType = kVideoFrameKey; |
| 1382 packet.markerBit = true; |
1354 packet.video_header.codecHeader.VP9.flexible_mode = false; | 1383 packet.video_header.codecHeader.VP9.flexible_mode = false; |
1355 packet.video_header.codecHeader.VP9.picture_id = 1; | 1384 packet.video_header.codecHeader.VP9.picture_id = 1; |
1356 packet.video_header.codecHeader.VP9.temporal_idx = 0; | 1385 packet.video_header.codecHeader.VP9.temporal_idx = 0; |
1357 packet.video_header.codecHeader.VP9.spatial_idx = 0; | 1386 packet.video_header.codecHeader.VP9.spatial_idx = 0; |
1358 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; | 1387 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; |
1359 packet.video_header.codecHeader.VP9.temporal_up_switch = true; | 1388 packet.video_header.codecHeader.VP9.temporal_up_switch = true; |
1360 packet.video_header.codecHeader.VP9.ss_data_available = true; | 1389 packet.video_header.codecHeader.VP9.ss_data_available = true; |
1361 packet.video_header.codecHeader.VP9.gof = ss; | 1390 packet.video_header.codecHeader.VP9.gof = ss; |
1362 { | 1391 { |
1363 ref_packet_buffer_->InsertPacket(packet); | 1392 ref_packet_buffer_->InsertPacket(packet); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1406 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be | 1435 // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be |
1407 // around M59). | 1436 // around M59). |
1408 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_DropOldFrame) { | 1437 TEST_F(TestRtpFrameReferenceFinder, Vp9PidFix_DropOldFrame) { |
1409 GofInfoVP9 ss; | 1438 GofInfoVP9 ss; |
1410 ss.SetGofInfoVP9(kTemporalStructureMode1); | 1439 ss.SetGofInfoVP9(kTemporalStructureMode1); |
1411 | 1440 |
1412 VCMPacket packet; | 1441 VCMPacket packet; |
1413 packet.timestamp = 0; | 1442 packet.timestamp = 0; |
1414 packet.codec = kVideoCodecVP9; | 1443 packet.codec = kVideoCodecVP9; |
1415 packet.frameType = kVideoFrameKey; | 1444 packet.frameType = kVideoFrameKey; |
| 1445 packet.markerBit = true; |
1416 packet.video_header.codecHeader.VP9.flexible_mode = false; | 1446 packet.video_header.codecHeader.VP9.flexible_mode = false; |
1417 packet.video_header.codecHeader.VP9.picture_id = 1; | 1447 packet.video_header.codecHeader.VP9.picture_id = 1; |
1418 packet.video_header.codecHeader.VP9.temporal_idx = 0; | 1448 packet.video_header.codecHeader.VP9.temporal_idx = 0; |
1419 packet.video_header.codecHeader.VP9.spatial_idx = 0; | 1449 packet.video_header.codecHeader.VP9.spatial_idx = 0; |
1420 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; | 1450 packet.video_header.codecHeader.VP9.tl0_pic_idx = 1; |
1421 packet.video_header.codecHeader.VP9.temporal_up_switch = true; | 1451 packet.video_header.codecHeader.VP9.temporal_up_switch = true; |
1422 packet.video_header.codecHeader.VP9.ss_data_available = true; | 1452 packet.video_header.codecHeader.VP9.ss_data_available = true; |
1423 packet.video_header.codecHeader.VP9.gof = ss; | 1453 packet.video_header.codecHeader.VP9.gof = ss; |
1424 { | 1454 { |
1425 ref_packet_buffer_->InsertPacket(packet); | 1455 ref_packet_buffer_->InsertPacket(packet); |
(...skipping 22 matching lines...) Expand all Loading... |
1448 reference_finder_->ManageFrame(std::move(frame)); | 1478 reference_finder_->ManageFrame(std::move(frame)); |
1449 } | 1479 } |
1450 | 1480 |
1451 ASSERT_EQ(2UL, frames_from_callback_.size()); | 1481 ASSERT_EQ(2UL, frames_from_callback_.size()); |
1452 CheckReferencesVp9(1, 0); | 1482 CheckReferencesVp9(1, 0); |
1453 CheckReferencesVp9(129, 0); | 1483 CheckReferencesVp9(129, 0); |
1454 } | 1484 } |
1455 | 1485 |
1456 } // namespace video_coding | 1486 } // namespace video_coding |
1457 } // namespace webrtc | 1487 } // namespace webrtc |
OLD | NEW |