網絡數據流接收處理過程分析
版權所有 codesky.net 2003-2005
發表時間:2005-1-16 關鍵字:不詳
網絡數據流接收處理分析
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、在下列函數中:
A. 分離出access , demux , name字符串 ;
B. 根據分離出的access 字符串通過module_Need函數找到acess 指針模塊;
C. 根據分離出的demux 字符串通過module_Need函數找到demux 指針模塊;
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 )
{
static mpeg_demux_t mpeg_demux =
{ NULL, ReadPS, ParsePS, DemuxPS, ReadTS, DemuxTS };
mpeg_demux.cur_scr_time = -1;
memcpy( p_this->p_private, &mpeg_demux, sizeof( mpeg_demux ) );
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)
+ i_remains,
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