Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 size_t length = 0; | 109 size_t length = 0; |
| 110 for (PacketIteratorConst it = packets_.begin(); it != packets_.end(); ++it) | 110 for (PacketIteratorConst it = packets_.begin(); it != packets_.end(); ++it) |
| 111 length += (*it).sizeBytes; | 111 length += (*it).sizeBytes; |
| 112 return length; | 112 return length; |
| 113 } | 113 } |
| 114 | 114 |
| 115 int VCMSessionInfo::NumPackets() const { | 115 int VCMSessionInfo::NumPackets() const { |
| 116 return packets_.size(); | 116 return packets_.size(); |
| 117 } | 117 } |
| 118 | 118 |
| 119 size_t VCMSessionInfo::InsertBuffer(uint8_t* frame_buffer, | 119 bool VCMSessionInfo::InsertBuffer(uint8_t* frame_buffer, |
| 120 PacketIterator packet_it) { | 120 size_t* inserted_length, |
| 121 VCMPacket& packet = *packet_it; | 121 PacketIterator packet_it) { |
| 122 VCMPacket* packet = &(*packet_it); | |
| 122 PacketIterator it; | 123 PacketIterator it; |
| 123 | 124 |
| 124 // Calculate the offset into the frame buffer for this packet. | 125 // Calculate the offset into the frame buffer for this packet. |
| 125 size_t offset = 0; | 126 size_t offset = 0; |
| 126 for (it = packets_.begin(); it != packet_it; ++it) | 127 for (it = packets_.begin(); it != packet_it; ++it) |
| 127 offset += (*it).sizeBytes; | 128 offset += (*it).sizeBytes; |
| 128 | 129 |
| 129 // Set the data pointer to pointing to the start of this packet in the | 130 // Set the data pointer to pointing to the start of this packet in the |
| 130 // frame buffer. | 131 // frame buffer. |
| 131 const uint8_t* packet_buffer = packet.dataPtr; | 132 const uint8_t* packet_buffer = packet->dataPtr; |
| 132 packet.dataPtr = frame_buffer + offset; | 133 packet->dataPtr = frame_buffer + offset; |
| 133 | 134 |
| 134 // We handle H.264 STAP-A packets in a special way as we need to remove the | 135 // We handle H.264 STAP-A packets in a special way as we need to remove the |
| 135 // two length bytes between each NAL unit, and potentially add start codes. | 136 // two length bytes between each NAL unit, and potentially add start codes. |
| 136 const size_t kH264NALHeaderLengthInBytes = 1; | 137 const size_t kH264NALHeaderLengthInBytes = 1; |
| 137 const size_t kLengthFieldLength = 2; | 138 const size_t kLengthFieldLength = 2; |
| 138 if (packet.codecSpecificHeader.codec == kRtpVideoH264 && | 139 if (packet->codecSpecificHeader.codec == kRtpVideoH264 && |
| 139 packet.codecSpecificHeader.codecHeader.H264.packetization_type == | 140 packet->codecSpecificHeader.codecHeader.H264.packetization_type == |
| 140 kH264StapA) { | 141 kH264StapA) { |
| 141 size_t required_length = 0; | 142 size_t required_length = kH264NALHeaderLengthInBytes; |
| 142 const uint8_t* nalu_ptr = packet_buffer + kH264NALHeaderLengthInBytes; | 143 const uint8_t* nalu_ptr = packet_buffer + kH264NALHeaderLengthInBytes; |
| 143 while (nalu_ptr < packet_buffer + packet.sizeBytes) { | 144 while (nalu_ptr < packet_buffer + packet->sizeBytes) { |
| 144 size_t length = BufferToUWord16(nalu_ptr); | 145 size_t length = BufferToUWord16(nalu_ptr); |
| 145 required_length += | 146 required_length += |
| 146 length + (packet.insertStartCode ? kH264StartCodeLengthBytes : 0); | 147 length + (packet->insertStartCode ? kH264StartCodeLengthBytes : 0); |
|
stefan-webrtc
2015/07/23 12:36:04
As discussed, the problem is that this start code
| |
| 147 nalu_ptr += kLengthFieldLength + length; | 148 nalu_ptr += kLengthFieldLength + length; |
| 148 } | 149 } |
| 149 ShiftSubsequentPackets(packet_it, required_length); | 150 if (required_length > packet->sizeBytes) |
| 151 return false; | |
| 152 ShiftSubsequentPackets(packet_it, | |
| 153 required_length - kH264NALHeaderLengthInBytes); | |
| 150 nalu_ptr = packet_buffer + kH264NALHeaderLengthInBytes; | 154 nalu_ptr = packet_buffer + kH264NALHeaderLengthInBytes; |
| 151 uint8_t* frame_buffer_ptr = frame_buffer + offset; | 155 uint8_t* frame_buffer_ptr = frame_buffer + offset; |
| 152 while (nalu_ptr < packet_buffer + packet.sizeBytes) { | 156 while (nalu_ptr < packet_buffer + packet->sizeBytes) { |
| 153 size_t length = BufferToUWord16(nalu_ptr); | 157 size_t length = BufferToUWord16(nalu_ptr); |
| 154 nalu_ptr += kLengthFieldLength; | 158 nalu_ptr += kLengthFieldLength; |
| 155 frame_buffer_ptr += Insert(nalu_ptr, | 159 frame_buffer_ptr += |
| 156 length, | 160 Insert(nalu_ptr, length, packet->insertStartCode, frame_buffer_ptr); |
| 157 packet.insertStartCode, | |
| 158 const_cast<uint8_t*>(frame_buffer_ptr)); | |
| 159 nalu_ptr += length; | 161 nalu_ptr += length; |
| 160 } | 162 } |
| 161 packet.sizeBytes = required_length; | 163 packet->sizeBytes = required_length - kH264NALHeaderLengthInBytes; |
|
pbos-webrtc
2015/07/17 14:08:53
Was this part (not including kH264NALHeaderLengthI
| |
| 162 return packet.sizeBytes; | 164 *inserted_length = packet->sizeBytes; |
| 165 return true; | |
| 163 } | 166 } |
| 164 ShiftSubsequentPackets( | 167 ShiftSubsequentPackets( |
| 165 packet_it, | 168 packet_it, |
| 166 packet.sizeBytes + | 169 packet->sizeBytes + |
| 167 (packet.insertStartCode ? kH264StartCodeLengthBytes : 0)); | 170 (packet->insertStartCode ? kH264StartCodeLengthBytes : 0)); |
| 168 | 171 |
| 169 packet.sizeBytes = Insert(packet_buffer, | 172 packet->sizeBytes = Insert(packet_buffer, |
| 170 packet.sizeBytes, | 173 packet->sizeBytes, |
| 171 packet.insertStartCode, | 174 packet->insertStartCode, |
| 172 const_cast<uint8_t*>(packet.dataPtr)); | 175 const_cast<uint8_t*>(packet->dataPtr)); |
| 173 return packet.sizeBytes; | 176 *inserted_length = packet->sizeBytes; |
| 177 return true; | |
| 174 } | 178 } |
| 175 | 179 |
| 176 size_t VCMSessionInfo::Insert(const uint8_t* buffer, | 180 size_t VCMSessionInfo::Insert(const uint8_t* buffer, |
| 177 size_t length, | 181 size_t length, |
| 178 bool insert_start_code, | 182 bool insert_start_code, |
| 179 uint8_t* frame_buffer) { | 183 uint8_t* frame_buffer) { |
| 180 if (insert_start_code) { | 184 if (insert_start_code) { |
| 181 const unsigned char startCode[] = {0, 0, 0, 1}; | 185 const unsigned char startCode[] = {0, 0, 0, 1}; |
| 182 memcpy(frame_buffer, startCode, kH264StartCodeLengthBytes); | 186 memcpy(frame_buffer, startCode, kH264StartCodeLengthBytes); |
| 183 } | 187 } |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 506 IsNewerSequenceNumber(packet.seqNum, last_packet_seq_num_)) { | 510 IsNewerSequenceNumber(packet.seqNum, last_packet_seq_num_)) { |
| 507 LOG(LS_WARNING) << "Received packet with a sequence number which is out " | 511 LOG(LS_WARNING) << "Received packet with a sequence number which is out " |
| 508 "of frame boundaries"; | 512 "of frame boundaries"; |
| 509 return -3; | 513 return -3; |
| 510 } | 514 } |
| 511 } | 515 } |
| 512 | 516 |
| 513 // The insert operation invalidates the iterator |rit|. | 517 // The insert operation invalidates the iterator |rit|. |
| 514 PacketIterator packet_list_it = packets_.insert(rit.base(), packet); | 518 PacketIterator packet_list_it = packets_.insert(rit.base(), packet); |
| 515 | 519 |
| 516 size_t returnLength = InsertBuffer(frame_buffer, packet_list_it); | 520 size_t returnLength; |
| 521 if (!InsertBuffer(frame_buffer, &returnLength, packet_list_it)) | |
| 522 return kSizeError; | |
| 517 UpdateCompleteSession(); | 523 UpdateCompleteSession(); |
| 518 if (decode_error_mode == kWithErrors) | 524 if (decode_error_mode == kWithErrors) { |
| 519 decodable_ = true; | 525 decodable_ = true; |
| 520 else if (decode_error_mode == kSelectiveErrors) | 526 } else if (decode_error_mode == kSelectiveErrors) { |
| 521 UpdateDecodableSession(frame_data); | 527 UpdateDecodableSession(frame_data); |
| 528 } | |
| 522 return static_cast<int>(returnLength); | 529 return static_cast<int>(returnLength); |
| 523 } | 530 } |
| 524 | 531 |
| 525 void VCMSessionInfo::InformOfEmptyPacket(uint16_t seq_num) { | 532 void VCMSessionInfo::InformOfEmptyPacket(uint16_t seq_num) { |
| 526 // Empty packets may be FEC or filler packets. They are sequential and | 533 // Empty packets may be FEC or filler packets. They are sequential and |
| 527 // follow the data packets, therefore, we should only keep track of the high | 534 // follow the data packets, therefore, we should only keep track of the high |
| 528 // and low sequence numbers and may assume that the packets in between are | 535 // and low sequence numbers and may assume that the packets in between are |
| 529 // empty packets belonging to the same frame (timestamp). | 536 // empty packets belonging to the same frame (timestamp). |
| 530 if (empty_seq_num_high_ == -1) | 537 if (empty_seq_num_high_ == -1) |
| 531 empty_seq_num_high_ = seq_num; | 538 empty_seq_num_high_ = seq_num; |
| 532 else | 539 else |
| 533 empty_seq_num_high_ = LatestSequenceNumber(seq_num, empty_seq_num_high_); | 540 empty_seq_num_high_ = LatestSequenceNumber(seq_num, empty_seq_num_high_); |
| 534 if (empty_seq_num_low_ == -1 || IsNewerSequenceNumber(empty_seq_num_low_, | 541 if (empty_seq_num_low_ == -1 || IsNewerSequenceNumber(empty_seq_num_low_, |
| 535 seq_num)) | 542 seq_num)) |
| 536 empty_seq_num_low_ = seq_num; | 543 empty_seq_num_low_ = seq_num; |
| 537 } | 544 } |
| 538 | 545 |
| 539 } // namespace webrtc | 546 } // namespace webrtc |
| OLD | NEW |