webrtc代码走读二(视频数据处理流程)

本文详细解析了音视频从采集到编码再到网络传输的全过程,包括视频采集、编码、RTP封装、网络发送等核心步骤,并介绍了视频接收端的解码及渲染过程。

一、概述

 二:源码分解

2.1 视频采集

视频采集

CaptureInputPin::Receive(IMediaSample* media_sample)

filter->ProcessCapturedFrame(sample_props.pbBuffer, sample_props.lActual,resulting_capability_);

capture_observer_->IncomingFrame(buffer, length, frame_info);

DeliverCapturedFrame(captureFrame);

_dataCallBack->OnFrame(captureFrame);

void VideoStreamEncoder::OnFrame(const VideoFrame& video_frame) {

2.2创建编码线程:

2.3 创建编码器:

视频编码

void PacedSender::EnqueuePackets(

    std::vector<std::unique_ptr<RtpPacketToSend>> packets)

pacing_controller_.EnqueuePacket(std::move(packet));

RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet)

RTPSenderVideo::SendVideo(

    int payload_type,

    absl::optional<VideoCodecType> codec_type,

    uint32_t rtp_timestamp,

    int64_t capture_time_ms,

    rtc::ArrayView<const uint8_t> payload,

    RTPVideoHeader video_header,

    absl::optional<int64_t> expected_retransmission_time_ms,

    absl::optional<int64_t> estimated_capture_clock_offset_ms)

void RTPSenderVideo::LogAndSendToNetwork

rtp_sender_->EnqueuePackets

VideoSendStreamImpl::OnEncodedImage(

    const EncodedImage& encoded_image,

    const CodecSpecificInfo* codec_specific_info)

webrtc::EncodedImage& EncodedImage()

void VideoStreamEncoder::EncodeVideoFrame(const VideoFrame& video_frame,int64_t time_when_posted_us)

àmain_queue_->PostTask(ToQueuedTask(task_safety_, [this]()

MultithreadedFakeH264Encoder::EncodeTask::run

void StartThreads(std::vector<std::unique_ptr<Thread>>* threads,

                  MessageHandler* handler)

2.4 创建RTP发送视频流

视频发包

void StartThreads(std::vector<std::unique_ptr<Thread>>* threads,

                  MessageHandler* handler)

PacedSender::Process()

pacing_controller_.ProcessPackets

PacingController::EnqueuePacket

PacingController::EnqueuePacketInternal(

    std::unique_ptr<RtpPacketToSend> packet,

    int priority)

packet_queue_.Push

WebRtcVideoChannel::SendRtp

MediaChannel::SendRtp

BaseChannel::SendPacket

BaseChannel::SendPacket(bool rtcp,

                             rtc::CopyOnWriteBuffer* packet,

                             const rtc::PacketOptions& options)

ediaChannel::SendRtp(const uint8_t* data,

                           size_t len,

                           const webrtc::PacketOptions& options)

network_thread_->PostTask(ToQueuedTask(network_safety_, std::move(send)))

创建平滑线程: 

设置PacedSender::Process 调用时间: 

 

 PacedSender::Process 调用: 

 

 

三、视频接收到渲染

3.1 视频解码

视频解包

Thread::Start()

Thread::PreRun()

Thread::Run(RunLoop* run_loop)

bool PhysicalSocketServer::Wait(int cmsWait, bool process_io)

void SocketDispatcher::OnEvent(uint32_t ff, int err)

AsyncUDPSocket::OnReadEvent(AsyncSocket* socket)

AllocationSequence::OnReadPacket(rtc::AsyncPacketSocket* socket,

                                      const char* data,

                                      size_t size,

                                      const rtc::SocketAddress& remote_addr,const int64_t& packet_time_us)

UDPPort::HandleIncomingPacket(rtc::AsyncPacketSocket* socket,

                                   const char* data,

                                   size_t size,

const rtc::SocketAddress& remote_addr,int64_t packet_time_us)

UDPPort::OnReadPacket(rtc::AsyncPacketSocket* socket,

                           const char* data,size_t size,

                           const rtc::SocketAddress& remote_addr, const int64_t& packet_time_us)

Connection::OnReadPacket(const char* data, size_t size, int64_t packet_time_us)

P2PTransportChannel::OnReadPacket(Connection* connection,

const char* data,size_t len,int64_t packet_time_us)

DtlsTransport::OnReadPacket(rtc::PacketTransportInternal* transport, const char* data,size_t size,const int64_t& packet_time_us,

                                 int flags)

RtpTransport::OnReadPacket(rtc::PacketTransportInternal* transport,

                                const char* data,

                                size_t len,  const int64_t& packet_time_us, int flags)

SrtpTransport::OnRtpPacketReceived(rtc::CopyOnWriteBuffer packet, int64_t packet_time_us)

WebRtcVideoChannel::OnPacketReceived(rtc::CopyOnWriteBuffer packet,int64_t packet_time_us)

PacketReceiver::DeliveryStatus Call::DeliverPacket

DeliverRtp(media_type, std::move(packet), packet_time_us)

RtpStreamReceiverController::OnRtpPacket(const RtpPacketReceived& packet)

RtpDemuxer::OnRtpPacket(const RtpPacketReceived& packet)

RtpVideoStreamReceiver::OnRtpPacket(const RtpPacketReceived& packet)

RtpVideoStreamReceiver::ReceivePacket(const RtpPacketReceived& packet)

OnReceivedPayloadData(std::move(parsed_payload->video_payload), packet,

                        parsed_payload->video_header)

PacketBuffer::InsertPacket(Packet&& packet, StatisticsCalculator* stats, size_t last_decoded_length,size_t sample_rateint target_level_ms,

                               const DecoderDatabase& decoder_database)

 3.2 视频解码

视频解码

IncomingVideoStream::OnFrame(const VideoFrame& video_frame)

VideoStreamDecoder::FrameToRender(VideoFrame& video_frame,

                                          absl::optional<uint8_t> qp,  int32_t decode_time_ms,

                                          VideoContentType content_type)

VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage,absl::optional<int32_t> decode_time_ms,

                                      absl::optional<uint8_t> qp)

H264DecoderImpl::Decode(const EncodedImage& input_image,

                                bool /*missing_frames*/,

                                int64_t /*render_time_ms*/

VCMGenericDecoder::Decode(const VCMEncodedFrame& frame, Timestamp now)

VideoReceiver::Decode(uint16_t maxWaitTimeMs)

VideoReceiveStream::OnFrame(const VideoFrame& video_frame)

StartThread(ThreadMainInfo* info)

解码线程 decoingthread

 3.3 视频渲染

视频渲染

StartThreads(std::vector<std::unique_ptr<Thread>>& threads,

                  MessageHandler* handler)

function run()

Thread::ThreadMain()

TaskQueueWin::RunThreadMain()

TaskQueueWin::RunPendingTasks()

IncomingVideoStream::OnFrame()

IncomingVideoStream::Dequeue()

WebRtcVideoReceiveStream::onFrame()

VideoBroadcaster::onFrame()

VideoRenderer::onFrame()

InvalidateRect(wnd_, NULL, TRUE);

MainWnd::OnPaint()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值