现在的位置: 首页 > 综合 > 正文

vlc学习计划(5)–网络数据流接收处理过程分析

2013年09月03日 ⁄ 综合 ⁄ 共 3096字 ⁄ 字号 评论关闭

版权信息:

本文来自internet,转载这里供流媒体爱好者学习和研究使用,请尊重作者的劳动成果。未经授权而在商业上使用原作者的文章属侵权行为,后果由使用者自负,本人不承担任何法律责任。

网络数据流接收处理分析:在 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_RunDecodersrc/input/input_dec.c->DecoderThread->DecoderDecode ->vout_DisplayPicture

抱歉!评论已关闭.