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