mplayer 源碼分析
《mplayer 源碼分析》由會員分享,可在線閱讀,更多相關(guān)《mplayer 源碼分析(9頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、一.Mplayer支持的格式 MPlayer是一個LINUX下的視頻播放器,它支持相當多的媒體格式,無論在音頻播放還是在視頻播放方面,可以說它支持的格式是相當全面的。 視頻格式支持:MPEG、AVI、ASF 與WMV、QuickTime 與 OGG/OGM、SDP、PVA、GIF。 音頻格式支持:MP3、WAV、OGG/OGM 文件(Vorbis)、WMA 與 ASF、MP4、CD音頻、XMMS。 二. Mplayer 中頭文件的功能分析 1. config.h//各種本地配置宏定義頭 2. version.h//版本定義頭#defineVERSION"1.0pre7try2-
2、3.4.2" 3. mp_msg.h//消息處理頭 4. help_mp.h//根據(jù)配置自動生成的幫助頭#include"help/help_mpen.h" 5. cfg-mplayer-def.h//Mplayer運行時的選項缺省值頭文件char* 6. default_config= 7. sub_reader.h//擁有格式自動發(fā)現(xiàn)功能的字幕(subtitle)閱讀器 8. libvo/video_out.h//該文件包含libvo視頻輸出的公共函數(shù)、變量 9. libvo/font_load.h//有關(guān)字體裝載的例程 10. libao2/audio_out.h//音頻
3、輸出驅(qū)動程序相關(guān)結(jié)構(gòu)定義和全局數(shù)據(jù) 11. libmpcodecs/dec_audio.h//音頻解碼 12. libmpcodecs/dec_video.h//視頻解碼 13. libmpdemux/matroska.h//多路解復(fù)用,媒體容器格式matroska處理頭 14. libmpdemux/stream.h//流處理 15. libmpdemux/demuxer.h//多路解復(fù)用頭文件 16. libmpdemux/stheader.h//媒體流頭處理 17. get_path.c//路徑獲取頭文件 18. spudec.h//SPU子畫面單元頭,DVD字幕流 1
4、9. edl.h//剪輯控制清單 20. m_option.h//選項類型處理頭 21. m_config.h//配置處理頭文件 三. MPlayer.main 主流程簡要說明 1. intmain(){ 2. 1)變量聲明,電影信息movieinfo: 3. 2)初始化,消息系統(tǒng)…… 4. play_next_file: 5. 3)播放文件filename的循環(huán)gotoplay_next_file開始 6. main: 7. 4)主處理main 8. 5)播放真正主循環(huán)2010~3541while(!eof) 9. while(!eof){ 10. 5.
5、1)播放音頻PLAYAUDIO2017~2064decode_audio(sh_audio,...); 11. 5.2)播放視頻PLAYVIDEO,2068~2300decode_video(sh_video,...); 12. 5.3)處理暫停PAUSE 13. 5.4)處理EDL 14. 5.5)鍵盤事件處理,搜索2400~3216while(!brk_cmd&& 15. (cmd=mp_input_get_cmd(0,0,0))!=NULL) 16. 5.6)時間尋道(秒)if(seek_to_sec) 17. 5.7)尋道3243~3306,if(rel_seek_sec
6、s||abs_seek_pos) 18. 5.8)處理GUI 19. 5.9)變更UpdateOSD 20. 5.10)找到字幕findsub 21. 5.11)處理X11窗口 22. 5.12)DVD字幕sub: 23. } 24. goto_next_file: 25. 6)播放結(jié)束,轉(zhuǎn)到下個文件goto_next_file: 26. } 四.Mplayer源碼分析 從Mplayer.c的main開始處理參數(shù) 1. mconfig=m_config_new(); 2. m_config_register_options(mconfig,mplayer_op
7、ts); 3. //TODO:addsomethingtoletmodulesregistertheiroptions 4. mp_input_register_options(mconfig); 5. parse_cfgfiles(mconfig); 初始化mpctx結(jié)構(gòu)體,mpctx應(yīng)該是mplayer context的意思,顧名思義是一個統(tǒng)籌全局的變量。 [cpp]view plaincopy 1. staticMPContext*mpctx=&mpctx_s; 2. //Notallfunctionsinmplayer.ctakethecontextasanargumen
8、tyet 3. staticMPContextmpctx_s={ 4. .osd_function=OSD_PLAY, 5. .begin_skip=MP_NOPTS_VALUE, 6. .play_tree_step=1, 7. .global_sub_pos=-1, 8. .set_of_sub_pos=-1, 9. .file_format=DEMUXER_TYPE_UNKNOWN, 10. .loop_times=-1, 11. #ifdefHAS_DVBIN_SUPPORT 12. .last_dvb_step=1, 13. #endif 14. }; 原型
9、 1. //真正統(tǒng)籌全局的結(jié)構(gòu) 2. typedefstructMPContext{ 3. intosd_show_percentage; 4. intosd_function; 5. constao_functions_t*audio_out; 6. play_tree_t*playtree; 7. play_tree_iter_t*playtree_iter; 8. inteof; 9. intplay_tree_step; 10. intloop_times; 11. 12. stream_t*stream; 13. demuxer_t*demuxer;
10、 14. sh_audio_t*sh_audio; 15. sh_video_t*sh_video; 16. demux_stream_t*d_audio; 17. demux_stream_t*d_video; 18. demux_stream_t*d_sub; 19. mixer_tmixer; 20. constvo_functions_t*video_out; 21. //Framesbufferedinthevoreadytoflip.Currentlyalways0or1. 22. //Thisisreallyavovariablebutcurrentlythere
11、snosuitablevo 23. //struct. 24. intnum_buffered_frames; 25. 26. //usedtoretrydecodingafterstartup/seekingtocompensateforcodecdelay 27. intstartup_decode_retry; 28. //howlonguntilweneedtodisplaythe"current"frame 29. floattime_frame; 30. 31. //AVsync:thenextframeshouldbeshownwhentheaudioout
12、hasthis
32. //much(inseconds)buffereddataleft.Increasedwhenmoredatais
33. //writtentotheao,decreasedwhenmovingtothenextframe.
34. //Intheaudio-onlycaseusedasatimersincethelastseek
35. //bytheaudioCPUusagemeter.
36. doubledelay;
37.
38. floatbegin_skip;/// 13、utmode
39. //audioismutedifeitherEDLoruseractivatesmute
40. shortedl_muted;/// 14、rces
45. intset_of_sub_pos;
46. intset_of_sub_size;
47. intsub_counts[SUB_SOURCES];
48. #ifdefCONFIG_ASS
49. //set_of_ass_tracks[i]containssubtitlesfromset_of_subtitles[i]
50. //parsedbylibassorNULLifformatunsupported
51. ASS_Track*set_of_ass_tracks[MAX_SUBTITLE_FILES];
52. #endif
53. sub_d 15、ata*set_of_subtitles[MAX_SUBTITLE_FILES];
54.
55. intfile_format;
56.
57. #ifdefCONFIG_DVBIN
58. intlast_dvb_step;
59. intdvbin_reopen;
60. #endif
61.
62. intwas_paused;
63.
64. #ifdefCONFIG_DVDNAV
65. structmp_image*nav_smpi;/// 16、er;/// 17、XER_TYPE_UNKNOWN
3. DEMUXER_TYPE_TV
4. current_module記錄狀態(tài)vobsubopen_streamhandle_playlistdumpstream
5. stream_reset(mpctx->stream);
6. stream_seek(mpctx->stream,mpctx->stream->start_pos);
7. f=fopen(stream_dump_name,”wb”);dump文件流
8. stream->type==STREAMTYPE_DVD
//============ Open DEMUXERS — 18、DETECT file type ======================
Demux。分離視頻流和音頻流
1. mpctx->demuxer=demux_open(mpctx->stream,mpctx-
2. >file_format,audio_id,video_id,dvdsub_id,filename);
3. Demux過程
4. demux_open
5. get_demuxer_type_from_name
6. ……
7. mpctx->d_audio=mpctx->demuxer->audio;
8. mpctx->d_video=mpctx->dem 19、uxer->video;
9. mpctx->d_sub=mpctx->demuxer->sub;
10. mpctx->sh_audio=mpctx->d_audio->sh;
11. mpctx->sh_video=mpctx->d_video->sh;
分離了之后就開始分別Play audio和video
這里只關(guān)心play video
1. /*========================PLAYVIDEO============================*/
2. vo_pts=mpctx->sh_video->timer*90000.0;
3. vo_ 20、fps=mpctx->sh_video->fps;
4. if(!mpctx->num_buffered_frames){
5. doubleframe_time=update_video(&blit_frame);
6. mp_dbg(MSGT_AVSYNC,MSGL_DBG2,”***ftime=%5.3f***\n”,frame_time);
7. if(mpctx->sh_video->vf_inited<0){
8. mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_NotInitializeVOPorVO);
9. mpctx->eof=1;go 21、togoto_next_file;
10. }
11. if(frame_time<0)
12. mpctx->eof=1;
13. else{
14. //mightreturnwith!eof&&!blit_frameif!correct_pts
15. mpctx->num_buffered_frames+=blit_frame;
16. time_frame+=frame_time/playback_speed;//fornosound
17. }
18. }
關(guān)鍵的函數(shù)是update_video根據(jù)pts是否正確調(diào)整一下同步并在必要的時候丟幀處理。最終調(diào)用 22、decode_video開始解碼(包括generate_video_frame里)。mpi = mpvdec->decode(sh_video, start, in_size, drop_frame);mpvdec是在main里通過reinit_video_chain的一系列調(diào)用動態(tài)選定的解碼程序。其實就一結(jié)構(gòu)體。它的原型是
1. typedefstructvd_functions_s
2. {
3. vd_info_t*info;
4. int(*init)(sh_video_t*sh);
5. void(*uninit)(sh_video_t*sh);
6. int(*co 23、ntrol)(sh_video_t*sh,intcmd,void*arg,…);
7. mp_image_t*(*decode)(sh_video_t*sh,void*data,intlen,intflags);
8. }vd_functions_t;
這是所有解碼器必須實現(xiàn)的接口。
int (*init)(sh_video_t *sh);是一個名為init的指針,指向一個接受sh_video_t *類型參數(shù),并返回int類型值的函數(shù)地址。那些vd_開頭的文件都是解碼相關(guān)的。隨便打開一個vd文件以上幾個函數(shù)和info變量肯定都包含了。mpi被mplayer用來存儲解碼后的圖像。在mp_ 24、image.h里定義。
1. typedefstructmp_image_s{
2. unsignedshortflags;
3. unsignedchartype;
4. unsignedcharbpp;//bits/pixel.NOTdepth!forRGBitwillben*8
5. unsignedintimgfmt;
6. intwidth,height;//storeddimensions
7. intx,y,w,h;//visibledimensions
8. unsignedchar*planes[MP_MAX_PLANES];
9. intstride[ 25、MP_MAX_PLANES];
10. char*qscale;
11. intqstride;
12. intpict_type;//0->unknown,1->I,2->P,3->B
13. intfields;
14. intqscale_type;//0->mpeg1/4/h263,1->mpeg2
15. intnum_planes;
16. /*theseareonlyusedbyplanarformatsY,U(Cb),V(Cr)*/
17. intchroma_width;
18. intchroma_height;
19. intchroma_x_shif 26、t;//horizontal
20. intchroma_y_shift;//vertical
21. /*forprivateusebyfilterorvodriver(tostorebufferidordmpi)*/
22. void*priv;
23. }mp_image_t;
圖像在解碼以后會輸出到顯示器,mplayer本來就是一個視頻播放器么。但也有可能作為輸入提供給編碼器進行二次編碼,MP附帶的mencoder.exe就是專門用來編碼的。在這之前可以定義filter對圖像進行處理,以實現(xiàn)各種效果。所有以vf_開頭的文件,都是這樣的filter。圖像的顯示是通過vo 27、,即video out來實現(xiàn)的。解碼器只負責把解碼完成的幀傳給vo,怎樣顯示就不用管了。這也是平臺相關(guān)性最大的部分,單獨分出來的好處是不言而喻的,像在Windows下有通過direcx實現(xiàn)的vo,Linux下有輸出到X的vo。vo_*文件是各種不同的vo實現(xiàn),只是他們不都是以顯示為目的,像vo_md5sum.c只是計算一下圖像的md5值。在解碼完成以后,即得到mpi以后,filter_video被調(diào)用,其結(jié)果是整個filter鏈上的所有filter都被調(diào)用了一遍,包括最后的VO,在vo的put_image里把圖像輸出到顯示器。這個時候需要考慮的是圖像存儲的方法即用哪種色彩空間。
附上兩張MPlayer結(jié)構(gòu)圖:
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學期初中歷史上冊教研組工作總結(jié)
- 2024年小學高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學期小學語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習整治報告
- 2025年學校元旦迎新盛典活動策劃方案
- 2024年學校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告