mplayer 源碼分析

上傳人:無*** 文檔編號:20558400 上傳時間:2021-03-29 格式:DOC 頁數(shù):9 大小:373KB
收藏 版權(quán)申訴 舉報 下載
mplayer 源碼分析_第1頁
第1頁 / 共9頁
mplayer 源碼分析_第2頁
第2頁 / 共9頁
mplayer 源碼分析_第3頁
第3頁 / 共9頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《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;///stream=open_stream(filename,0,&mpctx->file_format); 2. fileformat文件還是TV流DEMUXER_TYPE_PLAYLIST或DEMU

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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!