#ifndef _RTP_VIDEO_RECEIVER_H_ #define _RTP_VIDEO_RECEIVER_H_ #include #include #include #include #include "fec_decoder.h" #include "frame.h" #include "ringbuffer.h" #include "rtcp_receiver_report.h" #include "rtp_codec.h" #include "rtp_statistics.h" #include "thread_base.h" class RtpVideoReceiver : public ThreadBase { public: RtpVideoReceiver(); ~RtpVideoReceiver(); public: void InsertRtpPacket(RtpPacket& rtp_packet); void SetSendDataFunc(std::function data_send_func); void SetOnReceiveCompleteFrame( std::function on_receive_complete_frame) { on_receive_complete_frame_ = on_receive_complete_frame; } private: bool CheckIsFrameCompleted(RtpPacket& rtp_packet); bool CheckIsTimeSendRR(); int SendRtcpRR(RtcpReceiverReport& rtcp_rr); private: bool Process() override; private: std::map incomplete_frame_list_; uint8_t* nv12_data_ = nullptr; std::function on_receive_complete_frame_ = nullptr; uint32_t last_complete_frame_ts_ = 0; RingBuffer compelete_video_frame_queue_; private: std::unique_ptr rtp_statistics_ = nullptr; uint32_t last_send_rtcp_rr_packet_ts_ = 0; std::function data_send_func_ = nullptr; private: bool fec_enable_ = true; FecDecoder fec_decoder_; uint32_t last_packet_ts_ = 0; // std::map incomplete_fec_frame_list_; // std::map> fec_source_symbol_list_; // std::map> fec_repair_symbol_list_; std::set incomplete_fec_frame_list_; std::map> incomplete_fec_packet_list_; }; #endif