| 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 |