RtpFrameReferenceFinder作用

image.png

GOP

image.png

创建时机

image.png
RtpVideoStreamReceiver

拿到待解码的帧的调用栈

image.png

OnReceivedPayloadData

h:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\video\rtp_video_stream_receiver.cc
image.png

OnInsertPacket

image.png
打包该帧的所有包数据为EncodedImageBuffer
rtc::scoped_refptr bitstream = depacketizer_it->second->AssembleFrame(payloads);

  1. void RtpVideoStreamReceiver::OnInsertedPacket(
  2. video_coding::PacketBuffer::InsertResult result) {
  3. video_coding::PacketBuffer::Packet* first_packet = nullptr;
  4. int max_nack_count;
  5. int64_t min_recv_time;
  6. int64_t max_recv_time;
  7. std::vector<rtc::ArrayView<const uint8_t>> payloads;
  8. RtpPacketInfos::vector_type packet_infos;
  9. bool frame_boundary = true;
  10. for (auto& packet : result.packets) {
  11. // PacketBuffer promisses frame boundaries are correctly set on each
  12. // packet. Document that assumption with the DCHECKs.
  13. RTC_DCHECK_EQ(frame_boundary, packet->is_first_packet_in_frame());
  14. if (packet->is_first_packet_in_frame()) {
  15. first_packet = packet.get();
  16. max_nack_count = packet->times_nacked;
  17. min_recv_time = packet->packet_info.receive_time_ms();
  18. max_recv_time = packet->packet_info.receive_time_ms();
  19. payloads.clear();
  20. packet_infos.clear();
  21. } else {
  22. max_nack_count = std::max(max_nack_count, packet->times_nacked);
  23. min_recv_time =
  24. std::min(min_recv_time, packet->packet_info.receive_time_ms());
  25. max_recv_time =
  26. std::max(max_recv_time, packet->packet_info.receive_time_ms());
  27. }
  28. payloads.emplace_back(packet->video_payload);
  29. packet_infos.push_back(packet->packet_info);
  30. frame_boundary = packet->is_last_packet_in_frame();
  31. if (packet->is_last_packet_in_frame()) {
  32. auto depacketizer_it = payload_type_map_.find(first_packet->payload_type);
  33. RTC_CHECK(depacketizer_it != payload_type_map_.end());
  34. rtc::scoped_refptr<EncodedImageBuffer> bitstream =
  35. depacketizer_it->second->AssembleFrame(payloads);
  36. if (!bitstream) {
  37. // Failed to assemble a frame. Discard and continue.
  38. continue;
  39. }
  40. const video_coding::PacketBuffer::Packet& last_packet = *packet;
  41. OnAssembledFrame(std::make_unique<video_coding::RtpFrameObject>(
  42. first_packet->seq_num, //
  43. last_packet.seq_num, //
  44. last_packet.marker_bit, //
  45. max_nack_count, //
  46. min_recv_time, //
  47. max_recv_time, //
  48. first_packet->timestamp, //
  49. ntp_estimator_.Estimate(first_packet->timestamp), //
  50. last_packet.video_header.video_timing, //
  51. first_packet->payload_type, //
  52. first_packet->codec(), //
  53. last_packet.video_header.rotation, //
  54. last_packet.video_header.content_type, //
  55. first_packet->video_header, //
  56. last_packet.video_header.color_space, //
  57. RtpPacketInfos(std::move(packet_infos)), //
  58. std::move(bitstream)));
  59. }
  60. }
  61. RTC_DCHECK(frame_boundary);
  62. if (result.buffer_cleared) {
  63. RequestKeyFrame();
  64. }
  65. }

OnAssembleFrame

image.png