网络数据流接收处理分析 1、在input.c(src\input)文件中的主线程循环 Thread in charge of processing the network packets and demultiplexing RunThread( input_thread_t *p_input ) { InitThread( p_input ) ; ……………………………………………………. input_SelectES( p_input, p_input->stream.p_newly_selected_es ); ……………………………………………………. /* Read and demultiplex some data. */ i_count = p_input->pf_demux( p_input ); } 2、在下列函数中:
static int InitThread( input_thread_t * p_input ) { msg_Dbg( p_input, "access `%s', demux `%s', name `%s'", p_input->psz_access, p_input->psz_demux, p_input->psz_name ); /* Find and open appropriate access module */ p_input->p_access = module_Need( p_input, "access", p_input->psz_access, VLC_TRUE ); ……………………………………………………. while( !input_FillBuffer( p_input ) ) ……………………………………………………. /* Find and open appropriate demux module */ p_input->p_demux = module_Need( p_input, "demux", (p_input->psz_demux && *p_input->psz_demux) ? p_input->psz_demux : "$demux", (p_input->psz_demux && *p_input->psz_demux) ? VLC_TRUE : VLC_FALSE ); ……………………………………………………. } 3、在ps.c (module\demux\mpeg)文件中 a.通过消息映射宏赋值启动函数Activate; b.通过函数Activate赋值p_input->pf_demux = Demux; c. 通过函数module_Need( p_input, "mpeg-system", NULL, 0 ) 激活p_input->p_demux_data->mpeg.pf_read_ps( p_input, &p_data )函数(pf_read_ps); d.在InitThread函数中激活; static int Activate( vlc_object_t * p_this ) { /* Set the demux function */ p_input->pf_demux = Demux; p_input->p_private = (void*)&p_demux->mpeg; p_demux->p_module = module_Need( p_input, "mpeg-system", NULL, 0 ); } 4、在system.c (module\demux\mpeg)文件中 赋值解码模块mpeg_demux_t的成员函数; static int Activate ( vlc_object_t *p_this ) return VLC_SUCCESS; } 并且申明函数static ssize_t ReadPS( input_thread_t * p_input, data_packet_t ** pp_data ); 5、在ps.c (module\demux\mpeg)文件中 Demux( input_thread_t * p_input ) { i_result = p_input->p_demux_data->mpeg.pf_read_ps( p_input, &p_data ); p_input->p_demux_data->mpeg.pf_demux_ps( p_input, p_data ); } 进行读取数据和分离工作; 6、在system.c (module\demux\mpeg)文件中 数据走向图如下 ReadPS-> PEEK-> input_Peek(src\input\input_ext-plugins.c)-> input_FillBuffert 通过 i_ret = p_input->pf_read( p_input, (byte_t *)p_buf + sizeof(data_buffer_t) p_input->i_bufsize ); input_thread_t结构的pf_read函数成员如果是为udp.c(modules\access)的RTPChoose函数 则在开启access(UDP 模块)时通过module_need 激活; 激活网络读数据模块 RTPChoose(modules\access\ udp.c)->Read->net_Read(src\misc\net.c); 7、在input_programs.c(src\input)文件中 运行解码器对ES流解码 int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es ) { p_es->p_dec = input_RunDecoder( p_input, p_es ); } input_SelectES(src\input\input_programs.c)->input_RunDecoder(src\input\input_dec.c)->DecoderThread->DecoderDecode ->vout_DisplayPicture (jsphuang) |