mplayer 源碼分析

上傳人:無*** 文檔編號:20558400 上傳時間:2021-03-29 格式:DOC 頁數(shù):9 大?。?73KB
收藏 版權(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下的視頻播放器,它支持相當多的媒體格式,無論在音頻播放還是在視頻播放方面,可以說它支持的格式是相當全面的。 視頻格式支持: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;///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本來就是一個視頻播放器么。但也有可能作為輸入提供給編碼器進行二次編碼,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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(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)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!