织梦CMS - 轻松建站从此开始!

罗索

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

落鹤生 发布于 2010-06-28 22:41 点击:次 
网络数据流接收处理分析:在 input.c(src\input) 文件中的主线程循环 Thread in charge of processing the network packets and demultiplexing
TAG:

网络数据流接收处理分析

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

(jsphuang)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201006/9745.html]
本文出处:CSDN博客 作者:jsphuang
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容