网络数据流接收处理过程分析

网络数据流接收处理分析:在 input.c(src/input) 文件中的主线程循环 Thread in charge of processing the network packets and demultiplexing

网络数据流接收处理分析

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、在下列函数中:

  1. 分离出access  , demux  , name字符串 ;
  2. 根据分离出的access  字符串通过module_Need函数找到acess 指针模块;
  3. 根据分离出的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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值