doubang中tinyRTP传输逻辑

接受方收到数据并递交到消费者的过程

1 在RTP层设置 trtp_manager.c->trtp_manager_prepare->tnet_transport_set_callback(self->transport, _trtp_transport_layer_cb, self);
将回调函数 _trtp_transport_layer_cb 抛出,在该函数中实现_trtp_manager_recv_data
2 在传输层具体定义了 tnet_transport.c->tnet_transport_set_callback(const tnet_transport_handle_t *handle, tnet_transport_cb_f callback, const void* callback_data)

并且定义了个run函数 接收数据,把事件传递给callback

总结起来:传输层开启一个线程,一直运行run()方法,当数据到达,就把数据给callback,回调RTP的回调函数_trtp_transport_layer_cb。

注意:callback 函数 和_trtp_transport_layer_cb 其实是同一个函数,因为在tnet_transport_set_callback(self->transport, _trtp_transport_layer_cb, self)中通过transport->callback = callback;将_trtp_transport_layer_cb 赋给 callback。

tdav_session_vedio设置RTP层回调
1 在tdav_session_vedio.c->tdav_session_video_prepare(tmedia_session_t* self)->ret = trtp_manager_set_rtp_callback(base->rtp_manager,tdav_session_video_rtp_cb, base);将回调函数tdav_session_video_rtp_cb 抛出,tdav_session_video_rtp_cb函数具体的功能是解码,递交给消费者,即进行播放
2 在rtp层具体定义了trtp_manager.c->trtp_manager_set_rtp_callback(trtp_manager_t* self, trtp_rtp_cb_f fun, const void* usrdata)  并通过self->rtp.cb.fun = fun将tdav_session_video_rtp_cb 传递给self->rtp.cb.fun

在trtp_manager.c->_trtp_manager_recv_data 解析RTP 包  packet_rtp = trtp_rtp_packet_deserialize(data_ptr, data_size)

关键理解下 return video->jb
            ? tdav_video_jb_put(video->jb, (trtp_rtp_packet_t*)packet)
            : _tdav_session_video_decode(video, packet);
static int _tdav_session_video_decode(tdav_session_video_t* self, const trtp_rtp_packet_t* packet)该函数进行了关键的解码工作


生产者产生数据的过程:

会话建立的时候tmedia_session_create(tmedia_type_t type)根据plugin->objdef建立一个会话对象session = tsk_object_new(plugin->objdef)   tsk_object_new(const tsk_object_def_t *objdef, ...)会调用构造函数newobj = objdef->constructor(newobj, &ap);

1 在tdav_session_video.c->_tdav_session_video_init(init是在ctor中调用的)中设置回调 tmedia_producer_set_enc_callback(p_base->producer, tdav_session_video_producer_enc_cb, p_self);
tmedia_producer_set_enc_callback中进行编码out_size = video->encoder.codec->plugin->encode(video->encoder.codec, video->encoder.conv_buffer, yuv420p_size, &video->encoder.buffer, &video->encoder.buffer_size);并且发送trtp_manager_send_rtp
2 在ProxyProducer.cxx中调用了回调函数enc_cb.callback(TMEDIA_PRODUCER(m_pWrappedPlugin)->enc_cb.callback_data, pBuffer, nSize);也就是调用了tdav_session_video_producer_enc_cb进行编码和发送工作。
对比 tdav_session_video_producer_enc_cb(const void* callback_data, const void* buffer, tsk_size_t size)


在tdav_session_video.c->tdav_session_video_producer_enc_cb中
trtp_manager_ send_rtp(base->rtp_manager, video->encoder.buffer, out_size, 6006, tsk_true, tsk_true);

 trtp_manager_send_rtp-> trtp_manager_send_rtp_packet-> trtp_manager_send_rtp_raw->tnet_sockfd_sendto->sendto 经过RTP打包,解析序列化,调用传输层sendto()函数发送



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值