| 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 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName, | 477 RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName, |
| 478 SpsValidEvent::kReceivedSpsParseFailure, | 478 SpsValidEvent::kReceivedSpsParseFailure, |
| 479 SpsValidEvent::kSpsRewrittenMax); | 479 SpsValidEvent::kSpsRewrittenMax); |
| 480 break; | 480 break; |
| 481 } | 481 } |
| 482 | 482 |
| 483 if (sps) { | 483 if (sps) { |
| 484 parsed_payload->type.Video.width = sps->width; | 484 parsed_payload->type.Video.width = sps->width; |
| 485 parsed_payload->type.Video.height = sps->height; | 485 parsed_payload->type.Video.height = sps->height; |
| 486 nalu.sps_id = sps->id; | 486 nalu.sps_id = sps->id; |
| 487 } else { |
| 488 LOG(LS_WARNING) << "Failed to parse SPS id from SPS slice."; |
| 487 } | 489 } |
| 488 parsed_payload->frame_type = kVideoFrameKey; | 490 parsed_payload->frame_type = kVideoFrameKey; |
| 489 break; | 491 break; |
| 490 } | 492 } |
| 491 case H264::NaluType::kPps: { | 493 case H264::NaluType::kPps: { |
| 492 uint32_t pps_id; | 494 uint32_t pps_id; |
| 493 uint32_t sps_id; | 495 uint32_t sps_id; |
| 494 if (PpsParser::ParsePpsIds(&payload_data[start_offset], | 496 if (PpsParser::ParsePpsIds(&payload_data[start_offset], |
| 495 end_offset - start_offset, &pps_id, | 497 end_offset - start_offset, &pps_id, |
| 496 &sps_id)) { | 498 &sps_id)) { |
| 497 nalu.pps_id = pps_id; | 499 nalu.pps_id = pps_id; |
| 498 nalu.sps_id = sps_id; | 500 nalu.sps_id = sps_id; |
| 499 } else { | 501 } else { |
| 500 LOG(LS_WARNING) | 502 LOG(LS_WARNING) |
| 501 << "Failed to parse PPS id and SPS id from PPS slice."; | 503 << "Failed to parse PPS id and SPS id from PPS slice."; |
| 502 } | 504 } |
| 503 break; | 505 break; |
| 504 } | 506 } |
| 505 case H264::NaluType::kSei: | |
| 506 FALLTHROUGH(); | |
| 507 case H264::NaluType::kIdr: | 507 case H264::NaluType::kIdr: |
| 508 parsed_payload->frame_type = kVideoFrameKey; | 508 parsed_payload->frame_type = kVideoFrameKey; |
| 509 FALLTHROUGH(); | 509 FALLTHROUGH(); |
| 510 default: { | 510 case H264::NaluType::kSlice: { |
| 511 rtc::Optional<uint32_t> pps_id = PpsParser::ParsePpsIdFromSlice( | 511 rtc::Optional<uint32_t> pps_id = PpsParser::ParsePpsIdFromSlice( |
| 512 &payload_data[start_offset], end_offset - start_offset); | 512 &payload_data[start_offset], end_offset - start_offset); |
| 513 if (pps_id) | 513 if (pps_id) { |
| 514 nalu.pps_id = *pps_id; | 514 nalu.pps_id = *pps_id; |
| 515 } else { |
| 516 LOG(LS_WARNING) << "Failed to parse PPS id from slice of type: " |
| 517 << static_cast<int>(nalu.type); |
| 518 } |
| 515 break; | 519 break; |
| 516 } | 520 } |
| 521 // Slices below don't contain SPS or PPS ids. |
| 522 case H264::NaluType::kAud: |
| 523 case H264::NaluType::kEndOfSequence: |
| 524 case H264::NaluType::kEndOfStream: |
| 525 case H264::NaluType::kFiller: |
| 526 break; |
| 527 case H264::NaluType::kSei: |
| 528 parsed_payload->frame_type = kVideoFrameKey; |
| 529 break; |
| 530 case H264::NaluType::kStapA: |
| 531 case H264::NaluType::kFuA: |
| 532 RTC_NOTREACHED(); |
| 517 } | 533 } |
| 518 RTPVideoHeaderH264* h264 = &parsed_payload->type.Video.codecHeader.H264; | 534 RTPVideoHeaderH264* h264 = &parsed_payload->type.Video.codecHeader.H264; |
| 519 if (h264->nalus_length == kMaxNalusPerPacket) { | 535 if (h264->nalus_length == kMaxNalusPerPacket) { |
| 520 LOG(LS_WARNING) | 536 LOG(LS_WARNING) |
| 521 << "Received packet containing more than " << kMaxNalusPerPacket | 537 << "Received packet containing more than " << kMaxNalusPerPacket |
| 522 << " NAL units. Will not keep track sps and pps ids for all of them."; | 538 << " NAL units. Will not keep track sps and pps ids for all of them."; |
| 523 } else { | 539 } else { |
| 524 h264->nalus[h264->nalus_length++] = nalu; | 540 h264->nalus[h264->nalus_length++] = nalu; |
| 525 } | 541 } |
| 526 } | 542 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 540 bool first_fragment = (payload_data[1] & kSBit) > 0; | 556 bool first_fragment = (payload_data[1] & kSBit) > 0; |
| 541 NaluInfo nalu; | 557 NaluInfo nalu; |
| 542 nalu.type = original_nal_type; | 558 nalu.type = original_nal_type; |
| 543 nalu.sps_id = -1; | 559 nalu.sps_id = -1; |
| 544 nalu.pps_id = -1; | 560 nalu.pps_id = -1; |
| 545 if (first_fragment) { | 561 if (first_fragment) { |
| 546 offset_ = 0; | 562 offset_ = 0; |
| 547 length_ -= kNalHeaderSize; | 563 length_ -= kNalHeaderSize; |
| 548 rtc::Optional<uint32_t> pps_id = PpsParser::ParsePpsIdFromSlice( | 564 rtc::Optional<uint32_t> pps_id = PpsParser::ParsePpsIdFromSlice( |
| 549 payload_data + 2 * kNalHeaderSize, length_ - kNalHeaderSize); | 565 payload_data + 2 * kNalHeaderSize, length_ - kNalHeaderSize); |
| 550 if (pps_id) | 566 if (pps_id) { |
| 551 nalu.pps_id = *pps_id; | 567 nalu.pps_id = *pps_id; |
| 568 } else { |
| 569 LOG(LS_WARNING) << "Failed to parse PPS from first fragment of FU-A NAL " |
| 570 "unit with original type: " |
| 571 << static_cast<int>(nalu.type); |
| 572 } |
| 552 uint8_t original_nal_header = fnri | original_nal_type; | 573 uint8_t original_nal_header = fnri | original_nal_type; |
| 553 modified_buffer_.reset(new rtc::Buffer()); | 574 modified_buffer_.reset(new rtc::Buffer()); |
| 554 modified_buffer_->AppendData(payload_data + kNalHeaderSize, length_); | 575 modified_buffer_->AppendData(payload_data + kNalHeaderSize, length_); |
| 555 (*modified_buffer_)[0] = original_nal_header; | 576 (*modified_buffer_)[0] = original_nal_header; |
| 556 } else { | 577 } else { |
| 557 offset_ = kFuAHeaderSize; | 578 offset_ = kFuAHeaderSize; |
| 558 length_ -= kFuAHeaderSize; | 579 length_ -= kFuAHeaderSize; |
| 559 } | 580 } |
| 560 | 581 |
| 561 if (original_nal_type == H264::NaluType::kIdr) { | 582 if (original_nal_type == H264::NaluType::kIdr) { |
| 562 parsed_payload->frame_type = kVideoFrameKey; | 583 parsed_payload->frame_type = kVideoFrameKey; |
| 563 } else { | 584 } else { |
| 564 parsed_payload->frame_type = kVideoFrameDelta; | 585 parsed_payload->frame_type = kVideoFrameDelta; |
| 565 } | 586 } |
| 566 parsed_payload->type.Video.width = 0; | 587 parsed_payload->type.Video.width = 0; |
| 567 parsed_payload->type.Video.height = 0; | 588 parsed_payload->type.Video.height = 0; |
| 568 parsed_payload->type.Video.codec = kRtpVideoH264; | 589 parsed_payload->type.Video.codec = kRtpVideoH264; |
| 569 parsed_payload->type.Video.isFirstPacket = first_fragment; | 590 parsed_payload->type.Video.isFirstPacket = first_fragment; |
| 570 RTPVideoHeaderH264* h264 = &parsed_payload->type.Video.codecHeader.H264; | 591 RTPVideoHeaderH264* h264 = &parsed_payload->type.Video.codecHeader.H264; |
| 571 h264->packetization_type = kH264FuA; | 592 h264->packetization_type = kH264FuA; |
| 572 h264->nalu_type = original_nal_type; | 593 h264->nalu_type = original_nal_type; |
| 573 h264->nalus[h264->nalus_length] = nalu; | 594 if (first_fragment) { |
| 574 h264->nalus_length = 1; | 595 h264->nalus[h264->nalus_length] = nalu; |
| 596 h264->nalus_length = 1; |
| 597 } |
| 575 return true; | 598 return true; |
| 576 } | 599 } |
| 577 | 600 |
| 578 } // namespace webrtc | 601 } // namespace webrtc |
| OLD | NEW |