vlc学习计划(5)--VLC程序宏及线程分析
生活随笔
收集整理的這篇文章主要介紹了
vlc学习计划(5)--VLC程序宏及线程分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第一部分?????????????變量及宏定義
1.消息映射宏
???????????????????????vlc_module_begin();
???????????????????????????…………………..
vlc_module_end();
2.結構中包含函數
???????struct?input_thread_t
{
????VLC_COMMON_MEMBERS
????/*?Thread?properties?*/
????vlc_bool_t??????????????b_eof;
????vlc_bool_t??????????????b_out_pace_control;
????/*?Access?module?*/
????module_t?*???????p_access;
????ssize_t???????(*?pf_read?)?(?input_thread_t?*,?byte_t?*,?size_t?);
????int???????????(*?pf_set_program?)(?input_thread_t?*,?pgrm_descriptor_t?*?);
????int???????????(*?pf_set_area?)(?input_thread_t?*,?input_area_t?*?);
????void??????????(*?pf_seek?)?(?input_thread_t?*,?off_t?);
}
3.宏與換行符妙用
#define?VLC_COMMON_MEMBERS??????????????????????????????????????????????????\
/**?\name?VLC_COMMON_MEMBERS????????????????????????????????????????????????\
?*?these?members?are?common?for?all?vlc?objects?????????????????????????????\
?*/?????????????????????????????????????????????????????????????????????????\
/**@{*/?????????????????????????????????????????????????????????????????????\
????int???i_object_id;??????????????????????????????????????????????????????\
????int???i_object_type;????????????????????????????????????????????????????\
????char?*psz_object_type;??????????????????????????????????????????????????\
????char?*psz_object_name;??????????????????????????????????????????????????\
???????????????????????????????????????????????????????????????????????????????????????????????\
?/**?Just?a?reminder?so?that?people?don't?cast?garbage?*/????????????????\
????int?be_sure_to_add_VLC_COMMON_MEMBERS_to_struct;????????????????????????\
/**@}*/????????????????????
#define?VLC_OBJECT(?x?)?\?
((vlc_object_t?*)(x))+
0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct
struct?vlc_object_t
{
????VLC_COMMON_MEMBERS
};//定義一個結構來使用宏定義的公共成員
4.定義導出函數
#ifndef?__PLUGIN__
#???define?VLC_EXPORT(?type,?name,?args?)?type?name?args
#else
#???define?VLC_EXPORT(?type,?name,?args?)?struct?_u_n_u_s_e_d_
????extern?module_symbols_t*?p_symbols;
#endif
5.定義回調函數
typedef?int?(?*?vlc_callback_t?)?(?vlc_object_t?*,??????/*?variable's?object?*/
???????????????????????????????????char?const?*,????????????/*?variable?name?*/
???????????????????????????????????vlc_value_t,?????????????????/*?old?value?*/
???????????????????????????????????vlc_value_t,?????????????????/*?new?value?*/
???????????????????????????????????void?*?);????????????????/*?callback?data?*/?????????????????????????????????????????????????
6.函數作為參數的定義方式
?????Int?Fun(int?n,int?(*pf)(int?,int),char?*pstr)
{???int?j?=10;
pf(n,j);
}
7.回調函數的聲明
必須聲明為global,或者static
Int???vlc_callback_t?(int?,int)
{。。。。。。。。。。。}
???????
8.回調函數的使用
???????Fun(0,?vlc_callback_t,"test");
9.函數表達式
#define?input_BuffersInit(a)?__input_BuffersInit(VLC_OBJECT(a))
void?*?__input_BuffersInit(?vlc_object_t?*?);
#define?module_Need(a,b,c,d)?__module_Need(VLC_OBJECT(a),b,c,d)
VLC_EXPORT(?module_t?*,?__module_Need,?(?vlc_object_t?*,?const?char?*,?const?char?*,?vlc_bool_t?)?);
10.定義函數
???/*?Dynamic?array?handling:?realloc?array,?move?data,?increment?position?*/
#define?INSERT_ELEM(?p_ar,?i_oldsize,?i_pos,?elem?)???????????????????????????\
????do????????????????????????????????????????????????????????????????????????\
????{?????????????????????????????????????????????????????????????????????????\
????????if(?i_oldsize?)???????????????????????????????????????????????????????\
????????{?????????????????????????????????????????????????????????????????????\
????????????(p_ar)?=?realloc(?p_ar,?((i_oldsize)?+?1)?*?sizeof(?*(p_ar)?)?);??\
????????}?????????????????????????????????????????????????????????????????????\
????????else??????????????????????????????????????????????????????????????????\
????????{?????????????????????????????????????????????????????????????????????\
????????????(p_ar)?=?malloc(?((i_oldsize)?+?1)?*?sizeof(?*(p_ar)?)?);?????????\
????????}?????????????????????????????????????????????????????????????????????\
????????if(?(i_oldsize)?-?(i_pos)?)???????????????????????????????????????????\
????????{?????????????????????????????????????????????????????????????????????\
????????????memmove(?(p_ar)?+?(i_pos)?+?1,????????????????????????????????????\
?????????????????????(p_ar)?+?(i_pos),????????????????????????????????????????\
?????????????????????((i_oldsize)?-?(i_pos))?*?sizeof(?*(p_ar)?)?);???????????\
????????}?????????????????????????????????????????????????????????????????????\
????????(p_ar)[i_pos]?=?elem;?????????????????????????????????????????????????\
????????(i_oldsize)++;????????????????????????????????????????????????????????\
????}?????????????????????????????????????????????????????????????????????????\
????while(?0?)
應用為:
?????INSERT_ELEM(?p_new->p_libvlc->pp_objects,
?????????????????????p_new->p_libvlc->i_objects,
?????????????????????p_new->p_libvlc->i_objects,
?????????????????????p_new?);
11.改變地址的方式傳遞其值
stream_t?*input_StreamNew(?input_thread_t?*p_input?)
{????stream_t?*s?=?vlc_object_create(?p_input,?sizeof(?stream_t?)?);
????input_stream_sys_t?*p_sys;
????if(?s?)
????{
????????s->p_sys?=?malloc(?sizeof(?input_stream_sys_t?)?);
????????p_sys?=?(input_stream_sys_t*)s->p_sys;
????????p_sys->p_input?=?p_input;
????}
return?s;//注解:s->p_sys改變了
}
????????????????????????????第二部分??程序框架實現
1.?播放列表文件src/playlist/playlist.c的線程
playlist_t?*?__playlist_Create?(?vlc_object_t?*p_parent?)函數中創建的線程,線程函數為
static?void?RunThread?(?playlist_t?*p_playlist?)
???線程思路分析:
?????在RunThread里面執行循環,如果沒有任務執行,則適當的延遲,如果接到p_playlist->i_status?!=?PLAYLIST_STOPPED的條件,則調用PlayItem(?p_playlist?)函數,在PlayItem(?p_playlist?)函數中從新創建輸入線程。
通過void?playlist_Command(?playlist_t?*?p_playlist,?playlist_command_t?i_command,int?i_arg?)接收來自GUI界面的各種命令,然后設置p_playlist->i_status的狀態,由該狀態改變該播放列表文件主循環線程的執行。
2.?輸入文件SRC/INPUT/INPUT.C的輸入線程
????input_thread_t?*__input_CreateThread(?vlc_object_t?*p_parent,
??????????????????????????????????????input_item_t?*p_item?)函數中創建的線程,線程函數為
static?int?RunThread(?input_thread_t?*p_input?)
???線程思路分析:
由?input_thread_t結構的成員分析是接收文件流還是網絡流,如果是文件流,則調用file?module?的讀函數(pf_read)和打開函數(--).如果是network?則打開network???module?的打開函數和讀函數(pf_read)。
????在?RunThread線程函數中接收數據和調用demux?或者decode?etc處理。
一旦產生新的輸入,則在播放列表線程中會首先結束該輸入線程,然后從新創建新的輸入線程。
3.?視頻輸出文件src/video_output/?video_output.c的線程
vout_thread_t?*?__vout_Create(?vlc_object_t?*p_parent,
???????????????????????????????unsigned?int?i_width,?unsigned?int?i_height,
???????????????????????????????vlc_fourcc_t?i_chroma,?unsigned?int?i_aspect?)函數中創建的線程,線程函數為
static?void?RunThread(?vout_thread_t?*p_vout)
線程思路分析:
?????在RunThread里面執行循環,任務是顯示視頻。
4.?在modules\gui\wxwindows\wxwindows.cpp中的GUI線程
?static?void?Run(?intf_thread_t?*p_intf?)?函數中創建的線程,線程函數為
?????????????static?void?Init(?intf_thread_t?*p_intf?)
線程思路分析:
?????在Init(?intf_thread_t?*p_intf?)里面執行循環,創建新的GUI實例。Instance-》OnInit()(CreateDialogsProvider)-》DialogsProvider為運行的對話框。
?
?????接收網絡文件的步驟
OnOpenNet(?wxCommandEvent&?event?)打開網絡文件的步驟。打開OpenDialog對話框,點擊Ok后調用OpenDialog::OnOk(?wxCommandEvent&?WXUNUSED(event)?)函數,調用playlist_Command函數改變播放列表線程的狀態。
??激活線程分析:
?????????在wxwindow.cpp中的消息映射中?set_callbacks(?OpenDialogs,?Close?);?則設置了module_t->pf_activate=?OpenDialogs函數,
????????在module.c?的__module_Need(?vlc_object_t?*p_this,?const?char?*psz_capability,
??????????????????????????const?char?*psz_name,?vlc_bool_t?b_strict?)
函數中用到了pf_activate激活GUI對話框;
????在video_output.c?的static?void?RunThread(?vout_thread_t?*p_vout)線程中,也用到了pf_activate激活GUI對話框;
5.?開始所有module?的精髓
?????????消息映射宏
???????????????????????vlc_module_begin();
??????????????????????????set_callbacks(?NetOpen,?NULL?);
vlc_module_end();
然后設置模塊結構的成員函數為:
#define?set_callbacks(?activate,?deactivate?)?????????????????????????????????\
???????????????p_submodule->pf_activate?=?activate;??????????????????????????????????????\
?????????????????p_submodule->pf_deactivate?=?deactivate
在__module_Need函數中啟動pf_activate??激活相應的module。
?
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jsphuang/archive/2005/01/27/271133.aspx
1.消息映射宏
???????????????????????vlc_module_begin();
???????????????????????????…………………..
vlc_module_end();
2.結構中包含函數
???????struct?input_thread_t
{
????VLC_COMMON_MEMBERS
????/*?Thread?properties?*/
????vlc_bool_t??????????????b_eof;
????vlc_bool_t??????????????b_out_pace_control;
????/*?Access?module?*/
????module_t?*???????p_access;
????ssize_t???????(*?pf_read?)?(?input_thread_t?*,?byte_t?*,?size_t?);
????int???????????(*?pf_set_program?)(?input_thread_t?*,?pgrm_descriptor_t?*?);
????int???????????(*?pf_set_area?)(?input_thread_t?*,?input_area_t?*?);
????void??????????(*?pf_seek?)?(?input_thread_t?*,?off_t?);
}
3.宏與換行符妙用
#define?VLC_COMMON_MEMBERS??????????????????????????????????????????????????\
/**?\name?VLC_COMMON_MEMBERS????????????????????????????????????????????????\
?*?these?members?are?common?for?all?vlc?objects?????????????????????????????\
?*/?????????????????????????????????????????????????????????????????????????\
/**@{*/?????????????????????????????????????????????????????????????????????\
????int???i_object_id;??????????????????????????????????????????????????????\
????int???i_object_type;????????????????????????????????????????????????????\
????char?*psz_object_type;??????????????????????????????????????????????????\
????char?*psz_object_name;??????????????????????????????????????????????????\
???????????????????????????????????????????????????????????????????????????????????????????????\
?/**?Just?a?reminder?so?that?people?don't?cast?garbage?*/????????????????\
????int?be_sure_to_add_VLC_COMMON_MEMBERS_to_struct;????????????????????????\
/**@}*/????????????????????
#define?VLC_OBJECT(?x?)?\?
((vlc_object_t?*)(x))+
0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct
struct?vlc_object_t
{
????VLC_COMMON_MEMBERS
};//定義一個結構來使用宏定義的公共成員
4.定義導出函數
#ifndef?__PLUGIN__
#???define?VLC_EXPORT(?type,?name,?args?)?type?name?args
#else
#???define?VLC_EXPORT(?type,?name,?args?)?struct?_u_n_u_s_e_d_
????extern?module_symbols_t*?p_symbols;
#endif
5.定義回調函數
typedef?int?(?*?vlc_callback_t?)?(?vlc_object_t?*,??????/*?variable's?object?*/
???????????????????????????????????char?const?*,????????????/*?variable?name?*/
???????????????????????????????????vlc_value_t,?????????????????/*?old?value?*/
???????????????????????????????????vlc_value_t,?????????????????/*?new?value?*/
???????????????????????????????????void?*?);????????????????/*?callback?data?*/?????????????????????????????????????????????????
6.函數作為參數的定義方式
?????Int?Fun(int?n,int?(*pf)(int?,int),char?*pstr)
{???int?j?=10;
pf(n,j);
}
7.回調函數的聲明
必須聲明為global,或者static
Int???vlc_callback_t?(int?,int)
{。。。。。。。。。。。}
???????
8.回調函數的使用
???????Fun(0,?vlc_callback_t,"test");
9.函數表達式
#define?input_BuffersInit(a)?__input_BuffersInit(VLC_OBJECT(a))
void?*?__input_BuffersInit(?vlc_object_t?*?);
#define?module_Need(a,b,c,d)?__module_Need(VLC_OBJECT(a),b,c,d)
VLC_EXPORT(?module_t?*,?__module_Need,?(?vlc_object_t?*,?const?char?*,?const?char?*,?vlc_bool_t?)?);
10.定義函數
???/*?Dynamic?array?handling:?realloc?array,?move?data,?increment?position?*/
#define?INSERT_ELEM(?p_ar,?i_oldsize,?i_pos,?elem?)???????????????????????????\
????do????????????????????????????????????????????????????????????????????????\
????{?????????????????????????????????????????????????????????????????????????\
????????if(?i_oldsize?)???????????????????????????????????????????????????????\
????????{?????????????????????????????????????????????????????????????????????\
????????????(p_ar)?=?realloc(?p_ar,?((i_oldsize)?+?1)?*?sizeof(?*(p_ar)?)?);??\
????????}?????????????????????????????????????????????????????????????????????\
????????else??????????????????????????????????????????????????????????????????\
????????{?????????????????????????????????????????????????????????????????????\
????????????(p_ar)?=?malloc(?((i_oldsize)?+?1)?*?sizeof(?*(p_ar)?)?);?????????\
????????}?????????????????????????????????????????????????????????????????????\
????????if(?(i_oldsize)?-?(i_pos)?)???????????????????????????????????????????\
????????{?????????????????????????????????????????????????????????????????????\
????????????memmove(?(p_ar)?+?(i_pos)?+?1,????????????????????????????????????\
?????????????????????(p_ar)?+?(i_pos),????????????????????????????????????????\
?????????????????????((i_oldsize)?-?(i_pos))?*?sizeof(?*(p_ar)?)?);???????????\
????????}?????????????????????????????????????????????????????????????????????\
????????(p_ar)[i_pos]?=?elem;?????????????????????????????????????????????????\
????????(i_oldsize)++;????????????????????????????????????????????????????????\
????}?????????????????????????????????????????????????????????????????????????\
????while(?0?)
應用為:
?????INSERT_ELEM(?p_new->p_libvlc->pp_objects,
?????????????????????p_new->p_libvlc->i_objects,
?????????????????????p_new->p_libvlc->i_objects,
?????????????????????p_new?);
11.改變地址的方式傳遞其值
stream_t?*input_StreamNew(?input_thread_t?*p_input?)
{????stream_t?*s?=?vlc_object_create(?p_input,?sizeof(?stream_t?)?);
????input_stream_sys_t?*p_sys;
????if(?s?)
????{
????????s->p_sys?=?malloc(?sizeof(?input_stream_sys_t?)?);
????????p_sys?=?(input_stream_sys_t*)s->p_sys;
????????p_sys->p_input?=?p_input;
????}
return?s;//注解:s->p_sys改變了
}
????????????????????????????第二部分??程序框架實現
1.?播放列表文件src/playlist/playlist.c的線程
playlist_t?*?__playlist_Create?(?vlc_object_t?*p_parent?)函數中創建的線程,線程函數為
static?void?RunThread?(?playlist_t?*p_playlist?)
???線程思路分析:
?????在RunThread里面執行循環,如果沒有任務執行,則適當的延遲,如果接到p_playlist->i_status?!=?PLAYLIST_STOPPED的條件,則調用PlayItem(?p_playlist?)函數,在PlayItem(?p_playlist?)函數中從新創建輸入線程。
通過void?playlist_Command(?playlist_t?*?p_playlist,?playlist_command_t?i_command,int?i_arg?)接收來自GUI界面的各種命令,然后設置p_playlist->i_status的狀態,由該狀態改變該播放列表文件主循環線程的執行。
2.?輸入文件SRC/INPUT/INPUT.C的輸入線程
????input_thread_t?*__input_CreateThread(?vlc_object_t?*p_parent,
??????????????????????????????????????input_item_t?*p_item?)函數中創建的線程,線程函數為
static?int?RunThread(?input_thread_t?*p_input?)
???線程思路分析:
由?input_thread_t結構的成員分析是接收文件流還是網絡流,如果是文件流,則調用file?module?的讀函數(pf_read)和打開函數(--).如果是network?則打開network???module?的打開函數和讀函數(pf_read)。
????在?RunThread線程函數中接收數據和調用demux?或者decode?etc處理。
一旦產生新的輸入,則在播放列表線程中會首先結束該輸入線程,然后從新創建新的輸入線程。
3.?視頻輸出文件src/video_output/?video_output.c的線程
vout_thread_t?*?__vout_Create(?vlc_object_t?*p_parent,
???????????????????????????????unsigned?int?i_width,?unsigned?int?i_height,
???????????????????????????????vlc_fourcc_t?i_chroma,?unsigned?int?i_aspect?)函數中創建的線程,線程函數為
static?void?RunThread(?vout_thread_t?*p_vout)
線程思路分析:
?????在RunThread里面執行循環,任務是顯示視頻。
4.?在modules\gui\wxwindows\wxwindows.cpp中的GUI線程
?static?void?Run(?intf_thread_t?*p_intf?)?函數中創建的線程,線程函數為
?????????????static?void?Init(?intf_thread_t?*p_intf?)
線程思路分析:
?????在Init(?intf_thread_t?*p_intf?)里面執行循環,創建新的GUI實例。Instance-》OnInit()(CreateDialogsProvider)-》DialogsProvider為運行的對話框。
?
?????接收網絡文件的步驟
OnOpenNet(?wxCommandEvent&?event?)打開網絡文件的步驟。打開OpenDialog對話框,點擊Ok后調用OpenDialog::OnOk(?wxCommandEvent&?WXUNUSED(event)?)函數,調用playlist_Command函數改變播放列表線程的狀態。
??激活線程分析:
?????????在wxwindow.cpp中的消息映射中?set_callbacks(?OpenDialogs,?Close?);?則設置了module_t->pf_activate=?OpenDialogs函數,
????????在module.c?的__module_Need(?vlc_object_t?*p_this,?const?char?*psz_capability,
??????????????????????????const?char?*psz_name,?vlc_bool_t?b_strict?)
函數中用到了pf_activate激活GUI對話框;
????在video_output.c?的static?void?RunThread(?vout_thread_t?*p_vout)線程中,也用到了pf_activate激活GUI對話框;
5.?開始所有module?的精髓
?????????消息映射宏
???????????????????????vlc_module_begin();
??????????????????????????set_callbacks(?NetOpen,?NULL?);
vlc_module_end();
然后設置模塊結構的成員函數為:
#define?set_callbacks(?activate,?deactivate?)?????????????????????????????????\
???????????????p_submodule->pf_activate?=?activate;??????????????????????????????????????\
?????????????????p_submodule->pf_deactivate?=?deactivate
在__module_Need函數中啟動pf_activate??激活相應的module。
?
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jsphuang/archive/2005/01/27/271133.aspx
總結
以上是生活随笔為你收集整理的vlc学习计划(5)--VLC程序宏及线程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GVRP:GARP VLAN 注册协议
- 下一篇: Windows Azure 真实案例:C