RtpFrameReferenceFinder作用
GOP
创建时机
拿到待解码的帧的调用栈
OnReceivedPayloadData
h:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\video\rtp_video_stream_receiver.cc
OnInsertPacket

打包该帧的所有包数据为EncodedImageBuffer
rtc::scoped_refptr
void RtpVideoStreamReceiver::OnInsertedPacket(video_coding::PacketBuffer::InsertResult result) {video_coding::PacketBuffer::Packet* first_packet = nullptr;int max_nack_count;int64_t min_recv_time;int64_t max_recv_time;std::vector<rtc::ArrayView<const uint8_t>> payloads;RtpPacketInfos::vector_type packet_infos;bool frame_boundary = true;for (auto& packet : result.packets) {// PacketBuffer promisses frame boundaries are correctly set on each// packet. Document that assumption with the DCHECKs.RTC_DCHECK_EQ(frame_boundary, packet->is_first_packet_in_frame());if (packet->is_first_packet_in_frame()) {first_packet = packet.get();max_nack_count = packet->times_nacked;min_recv_time = packet->packet_info.receive_time_ms();max_recv_time = packet->packet_info.receive_time_ms();payloads.clear();packet_infos.clear();} else {max_nack_count = std::max(max_nack_count, packet->times_nacked);min_recv_time =std::min(min_recv_time, packet->packet_info.receive_time_ms());max_recv_time =std::max(max_recv_time, packet->packet_info.receive_time_ms());}payloads.emplace_back(packet->video_payload);packet_infos.push_back(packet->packet_info);frame_boundary = packet->is_last_packet_in_frame();if (packet->is_last_packet_in_frame()) {auto depacketizer_it = payload_type_map_.find(first_packet->payload_type);RTC_CHECK(depacketizer_it != payload_type_map_.end());rtc::scoped_refptr<EncodedImageBuffer> bitstream =depacketizer_it->second->AssembleFrame(payloads);if (!bitstream) {// Failed to assemble a frame. Discard and continue.continue;}const video_coding::PacketBuffer::Packet& last_packet = *packet;OnAssembledFrame(std::make_unique<video_coding::RtpFrameObject>(first_packet->seq_num, //last_packet.seq_num, //last_packet.marker_bit, //max_nack_count, //min_recv_time, //max_recv_time, //first_packet->timestamp, //ntp_estimator_.Estimate(first_packet->timestamp), //last_packet.video_header.video_timing, //first_packet->payload_type, //first_packet->codec(), //last_packet.video_header.rotation, //last_packet.video_header.content_type, //first_packet->video_header, //last_packet.video_header.color_space, //RtpPacketInfos(std::move(packet_infos)), //std::move(bitstream)));}}RTC_DCHECK(frame_boundary);if (result.buffer_cleared) {RequestKeyFrame();}}
OnAssembleFrame


