接受方收到数据并递交到消费者的过程
将回调函数 _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)
? 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()函数发送