網絡數據流接收處理過程分析

網絡數據流接收處理過程分析
版權所有 codesky.net 2003-2005

發表時間:2005-1-16    關鍵字:不詳

網絡數據流接收處理分析

1input.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 );

…………………………………………………….

}

3ps.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 );

}

4system.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 )

 

5ps.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 );

}

進行讀取數據和分離工作;

6system.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函數

則在開啓accessUDP 模塊)時通過module_need 激活;

 激活網絡讀數據模塊 RTPChoosemodules/access/ udp.c)->Read->net_Read(src/misc/net.c)

 

7input_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_SelectESsrc/input/input_programs.c->input_RunDecodersrc/input/input_dec.c->DecoderThread->DecoderDecode ->vout_DisplayPicture

 

 
發佈了47 篇原創文章 · 獲贊 2 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章