OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 } | 396 } |
397 h264_header->nalu_type = nal_type; | 397 h264_header->nalu_type = nal_type; |
398 parsed_payload->frame_type = kVideoFrameDelta; | 398 parsed_payload->frame_type = kVideoFrameDelta; |
399 | 399 |
400 nalu_start_offsets.push_back(length_ + kLengthFieldSize); // End offset. | 400 nalu_start_offsets.push_back(length_ + kLengthFieldSize); // End offset. |
401 for (size_t i = 0; i < nalu_start_offsets.size() - 1; ++i) { | 401 for (size_t i = 0; i < nalu_start_offsets.size() - 1; ++i) { |
402 size_t start_offset = nalu_start_offsets[i]; | 402 size_t start_offset = nalu_start_offsets[i]; |
403 // End offset is actually start offset for next unit, excluding length field | 403 // End offset is actually start offset for next unit, excluding length field |
404 // so remove that from this units length. | 404 // so remove that from this units length. |
405 size_t end_offset = nalu_start_offsets[i + 1] - kLengthFieldSize; | 405 size_t end_offset = nalu_start_offsets[i + 1] - kLengthFieldSize; |
| 406 if (end_offset - start_offset < H264::kNaluTypeSize) { |
| 407 LOG(LS_ERROR) << "STAP-A packet too short"; |
| 408 return false; |
| 409 } |
| 410 |
406 nal_type = payload_data[start_offset] & kTypeMask; | 411 nal_type = payload_data[start_offset] & kTypeMask; |
407 start_offset += H264::kNaluTypeSize; | 412 start_offset += H264::kNaluTypeSize; |
408 | 413 |
409 if (nal_type == H264::NaluType::kSps) { | 414 if (nal_type == H264::NaluType::kSps) { |
410 // Check if VUI is present in SPS and if it needs to be modified to avoid | 415 // Check if VUI is present in SPS and if it needs to be modified to avoid |
411 // excessive decoder latency. | 416 // excessive decoder latency. |
412 | 417 |
413 // Copy any previous data first (likely just the first header). | 418 // Copy any previous data first (likely just the first header). |
414 std::unique_ptr<rtc::Buffer> output_buffer(new rtc::Buffer()); | 419 std::unique_ptr<rtc::Buffer> output_buffer(new rtc::Buffer()); |
415 if (start_offset) | 420 if (start_offset) |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 parsed_payload->type.Video.codec = kRtpVideoH264; | 522 parsed_payload->type.Video.codec = kRtpVideoH264; |
518 parsed_payload->type.Video.isFirstPacket = first_fragment; | 523 parsed_payload->type.Video.isFirstPacket = first_fragment; |
519 RTPVideoHeaderH264* h264_header = | 524 RTPVideoHeaderH264* h264_header = |
520 &parsed_payload->type.Video.codecHeader.H264; | 525 &parsed_payload->type.Video.codecHeader.H264; |
521 h264_header->packetization_type = kH264FuA; | 526 h264_header->packetization_type = kH264FuA; |
522 h264_header->nalu_type = original_nal_type; | 527 h264_header->nalu_type = original_nal_type; |
523 return true; | 528 return true; |
524 } | 529 } |
525 | 530 |
526 } // namespace webrtc | 531 } // namespace webrtc |
OLD | NEW |