OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2017 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2017 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 | 112 |
113 WebRtcRTPHeader GetDefaultPacket() { | 113 WebRtcRTPHeader GetDefaultPacket() { |
114 WebRtcRTPHeader packet; | 114 WebRtcRTPHeader packet; |
115 memset(&packet, 0, sizeof(packet)); | 115 memset(&packet, 0, sizeof(packet)); |
116 packet.type.Video.codec = kRtpVideoH264; | 116 packet.type.Video.codec = kRtpVideoH264; |
117 return packet; | 117 return packet; |
118 } | 118 } |
119 | 119 |
120 // TODO(Johan): refactor h264_sps_pps_tracker_unittests.cc to avoid duplicate | 120 // TODO(Johan): refactor h264_sps_pps_tracker_unittests.cc to avoid duplicate |
121 // code. | 121 // code. |
122 void AddSps(WebRtcRTPHeader* packet, int sps_id, std::vector<uint8_t>* data) { | 122 void AddSps(WebRtcRTPHeader* packet, |
| 123 uint8_t sps_id, |
| 124 std::vector<uint8_t>* data) { |
123 NaluInfo info; | 125 NaluInfo info; |
124 info.type = H264::NaluType::kSps; | 126 info.type = H264::NaluType::kSps; |
125 info.sps_id = sps_id; | 127 info.sps_id = sps_id; |
126 info.pps_id = -1; | 128 info.pps_id = -1; |
127 info.offset = data->size(); | |
128 info.size = 2; | |
129 data->push_back(H264::NaluType::kSps); | 129 data->push_back(H264::NaluType::kSps); |
130 data->push_back(sps_id); | 130 data->push_back(sps_id); |
131 packet->type.Video.codecHeader.H264 | 131 packet->type.Video.codecHeader.H264 |
132 .nalus[packet->type.Video.codecHeader.H264.nalus_length++] = info; | 132 .nalus[packet->type.Video.codecHeader.H264.nalus_length++] = info; |
133 } | 133 } |
134 | 134 |
135 void AddPps(WebRtcRTPHeader* packet, | 135 void AddPps(WebRtcRTPHeader* packet, |
136 int sps_id, | 136 uint8_t sps_id, |
137 int pps_id, | 137 uint8_t pps_id, |
138 std::vector<uint8_t>* data) { | 138 std::vector<uint8_t>* data) { |
139 NaluInfo info; | 139 NaluInfo info; |
140 info.type = H264::NaluType::kPps; | 140 info.type = H264::NaluType::kPps; |
141 info.sps_id = sps_id; | 141 info.sps_id = sps_id; |
142 info.pps_id = pps_id; | 142 info.pps_id = pps_id; |
143 info.offset = data->size(); | |
144 info.size = 2; | |
145 data->push_back(H264::NaluType::kPps); | 143 data->push_back(H264::NaluType::kPps); |
146 data->push_back(pps_id); | 144 data->push_back(pps_id); |
147 packet->type.Video.codecHeader.H264 | 145 packet->type.Video.codecHeader.H264 |
148 .nalus[packet->type.Video.codecHeader.H264.nalus_length++] = info; | 146 .nalus[packet->type.Video.codecHeader.H264.nalus_length++] = info; |
149 } | 147 } |
150 | 148 |
151 void AddIdr(WebRtcRTPHeader* packet, int pps_id) { | 149 void AddIdr(WebRtcRTPHeader* packet, int pps_id) { |
152 NaluInfo info; | 150 NaluInfo info; |
153 info.type = H264::NaluType::kIdr; | 151 info.type = H264::NaluType::kIdr; |
154 info.sps_id = -1; | 152 info.sps_id = -1; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 DoOnCompleteFrameFailBitstream(_)); | 208 DoOnCompleteFrameFailBitstream(_)); |
211 rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(), | 209 rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(), |
212 &rtp_header); | 210 &rtp_header); |
213 } | 211 } |
214 | 212 |
215 TEST_F(RtpVideoStreamReceiverTest, InBandSpsPps) { | 213 TEST_F(RtpVideoStreamReceiverTest, InBandSpsPps) { |
216 std::vector<uint8_t> sps_data; | 214 std::vector<uint8_t> sps_data; |
217 WebRtcRTPHeader sps_packet = GetDefaultPacket(); | 215 WebRtcRTPHeader sps_packet = GetDefaultPacket(); |
218 AddSps(&sps_packet, 0, &sps_data); | 216 AddSps(&sps_packet, 0, &sps_data); |
219 sps_packet.header.sequenceNumber = 0; | 217 sps_packet.header.sequenceNumber = 0; |
| 218 sps_packet.type.Video.is_first_packet_in_frame = true; |
220 mock_on_complete_frame_callback_.AppendExpectedBitstream( | 219 mock_on_complete_frame_callback_.AppendExpectedBitstream( |
221 kH264StartCode, sizeof(kH264StartCode)); | 220 kH264StartCode, sizeof(kH264StartCode)); |
222 mock_on_complete_frame_callback_.AppendExpectedBitstream(sps_data.data(), | 221 mock_on_complete_frame_callback_.AppendExpectedBitstream(sps_data.data(), |
223 sps_data.size()); | 222 sps_data.size()); |
224 rtp_video_stream_receiver_->OnReceivedPayloadData( | 223 rtp_video_stream_receiver_->OnReceivedPayloadData( |
225 sps_data.data(), sps_data.size(), &sps_packet); | 224 sps_data.data(), sps_data.size(), &sps_packet); |
226 | 225 |
227 std::vector<uint8_t> pps_data; | 226 std::vector<uint8_t> pps_data; |
228 WebRtcRTPHeader pps_packet = GetDefaultPacket(); | 227 WebRtcRTPHeader pps_packet = GetDefaultPacket(); |
229 AddPps(&pps_packet, 0, 1, &pps_data); | 228 AddPps(&pps_packet, 0, 1, &pps_data); |
230 pps_packet.header.sequenceNumber = 1; | 229 pps_packet.header.sequenceNumber = 1; |
| 230 pps_packet.type.Video.is_first_packet_in_frame = true; |
231 mock_on_complete_frame_callback_.AppendExpectedBitstream( | 231 mock_on_complete_frame_callback_.AppendExpectedBitstream( |
232 kH264StartCode, sizeof(kH264StartCode)); | 232 kH264StartCode, sizeof(kH264StartCode)); |
233 mock_on_complete_frame_callback_.AppendExpectedBitstream(pps_data.data(), | 233 mock_on_complete_frame_callback_.AppendExpectedBitstream(pps_data.data(), |
234 pps_data.size()); | 234 pps_data.size()); |
235 rtp_video_stream_receiver_->OnReceivedPayloadData( | 235 rtp_video_stream_receiver_->OnReceivedPayloadData( |
236 pps_data.data(), pps_data.size(), &pps_packet); | 236 pps_data.data(), pps_data.size(), &pps_packet); |
237 | 237 |
238 std::vector<uint8_t> idr_data; | 238 std::vector<uint8_t> idr_data; |
239 WebRtcRTPHeader idr_packet = GetDefaultPacket(); | 239 WebRtcRTPHeader idr_packet = GetDefaultPacket(); |
240 AddIdr(&idr_packet, 1); | 240 AddIdr(&idr_packet, 1); |
241 idr_packet.type.Video.is_first_packet_in_frame = true; | 241 idr_packet.type.Video.is_first_packet_in_frame = true; |
242 idr_packet.header.sequenceNumber = 2; | 242 idr_packet.header.sequenceNumber = 2; |
243 idr_packet.header.markerBit = 1; | 243 idr_packet.header.markerBit = 1; |
244 idr_packet.type.Video.is_first_packet_in_frame = true; | |
245 idr_packet.frameType = kVideoFrameKey; | 244 idr_packet.frameType = kVideoFrameKey; |
246 idr_packet.type.Video.codec = kRtpVideoH264; | |
247 idr_data.insert(idr_data.end(), {0x65, 1, 2, 3}); | 245 idr_data.insert(idr_data.end(), {0x65, 1, 2, 3}); |
248 mock_on_complete_frame_callback_.AppendExpectedBitstream( | 246 mock_on_complete_frame_callback_.AppendExpectedBitstream( |
249 kH264StartCode, sizeof(kH264StartCode)); | 247 kH264StartCode, sizeof(kH264StartCode)); |
250 mock_on_complete_frame_callback_.AppendExpectedBitstream(idr_data.data(), | 248 mock_on_complete_frame_callback_.AppendExpectedBitstream(idr_data.data(), |
251 idr_data.size()); | 249 idr_data.size()); |
252 EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_)); | 250 EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_)); |
253 rtp_video_stream_receiver_->OnReceivedPayloadData( | 251 rtp_video_stream_receiver_->OnReceivedPayloadData( |
254 idr_data.data(), idr_data.size(), &idr_packet); | 252 idr_data.data(), idr_data.size(), &idr_packet); |
255 } | 253 } |
256 | 254 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 rtp_header.type.Video.is_first_packet_in_frame = true; | 338 rtp_header.type.Video.is_first_packet_in_frame = true; |
341 rtp_header.frameType = kVideoFrameDelta; | 339 rtp_header.frameType = kVideoFrameDelta; |
342 rtp_header.type.Video.codec = kRtpVideoGeneric; | 340 rtp_header.type.Video.codec = kRtpVideoGeneric; |
343 | 341 |
344 EXPECT_CALL(mock_key_frame_request_sender_, RequestKeyFrame()); | 342 EXPECT_CALL(mock_key_frame_request_sender_, RequestKeyFrame()); |
345 rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(), | 343 rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(), |
346 &rtp_header); | 344 &rtp_header); |
347 } | 345 } |
348 | 346 |
349 } // namespace webrtc | 347 } // namespace webrtc |
OLD | NEW |