mplayer 源碼分析
《mplayer 源碼分析》由會員分享,可在線閱讀,更多相關(guān)《mplayer 源碼分析(9頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、一.Mplayer支持的格式 MPlayer是一個LINUX下的視頻播放器,它支持相當(dāng)多的媒體格式,無論在音頻播放還是在視頻播放方面,可以說它支持的格式是相當(dāng)全面的。 視頻格式支持: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運(yùn)行時的選項缺省值頭文件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)定義和全局?jǐn)?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本來就是一個視頻播放器么。但也有可能作為輸入提供給編碼器進(jìn)行二次編碼,MP附帶的mencoder.exe就是專門用來編碼的。在這之前可以定義filter對圖像進(jìn)行處理,以實現(xiàn)各種效果。所有以vf_開頭的文件,都是這樣的filter。圖像的顯示是通過vo 27、,即video out來實現(xiàn)的。解碼器只負(fù)責(zé)把解碼完成的幀傳給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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊教研組工作總結(jié)
- 2024年小學(xué)高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學(xué)期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報告
- 2025年學(xué)校元旦迎新盛典活動策劃方案
- 2024年學(xué)校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告