• 沒有找到結果。

Video Chain 開啟流程

第三章 MPlayer 程式

3.5 Video Chain 開啟流程

當影音資料透過demuxer 分解成 video bitstream 和 audio bitstream,將 video bitstream 傳到影像解碼器。影像解碼器將資料解碼成 video frame,再透過影像濾波器做影像處 理,最後透過影像輸出模組顯示到螢幕上。而影像解碼器、影像濾波器和影像輸出模組 構成video chain,如圖 3-26 虛線框部分。MPlayer 支援同時開啟多個影像濾波器,而這 個多個影像濾波器構成video filter chain,如圖 3-27 虛線框部分。前面我們談論了影像 濾波器和影像輸出模組,但是這都是單獨的模組。這章節將說明MPlayer 如何將這些獨 立的模組串接起來。

圖3-26. Video chain 架構

圖3-27. Video Filter chain 架構

MPlayer 選定 demuxer 後,從檔案資料讀出標頭資訊。如果檔案有包含視訊標頭訊 息,將建立video chain,這將決定影像解碼器、影像濾波器和影像輸出模組,並且將它 們串接起來。圖3-28 為 video chain 建立流程,將分成四個階段說明。

圖3-28. Video chain 開啟流程

1.選擇影像輸出模組( init_best_video_out())

xover General X11 driver for overlay capable video output drivers gl X11 (OpenGL)

gl2 X11 (OpenGL) - multiple textures version dga DGA ( Direct Graphic Access V2.0 )

sdl SDL YUV/RGB/BGR renderer (SDL v1.1.7+ only!) fbdev Framebuffer Device

fbdev2 Framebuffer Device

開啟vo 影像濾波器,並且傳入

mpctx->video_out 指標變數 開啟影像輸出模組後,回傳vo_function_t 結構的指標 video_driver_list 存放使用者選定的影像輸出模組

xvidix X11 (VIDIX) cvidix console VIDIX null Null video output rdp rdesktop plugin output mpegpes Mpeg-PES to DVB card

yuv4mpeg yuv4mpeg output for mjpegtools png PNG file

jpeg JPEG file gif89a animated GIF output tga Targa output

pnm PPM/PGM/PGMYUV file md5sum md5sum of each frame

圖3-30. Video chain 階段 1

2.開啟vo影像濾波器(vf_open_filter())

vo影像濾波器是一個特殊的濾波器而且一定是filter chain的最後一個,它是影像濾 波器和影像輸出模組的媒介(vo影像濾波器在第3.4.1節有詳細解說)。圖3-29的第2部分,

傳 入 影 像 濾 波 器 的 名 稱(vo)和mpctx->video_out指標變數(存放x11影像輸出模組的 vo_function_t結構的指標)。vo影像濾波器開啟完成後,回傳vo影像濾波器的vf_instance_t 結構的指標,指定到sh_video->vfilter指標變數。

圖3-31為vo影像濾波器的open()函式,此開啟動作將會把vf_instance_t結構資料指定 完成。而vf->priv->vo也就是video_out,存放的是影像輸出模組(x11)的vo_function_t結 構,透過這個結構成員的函式指標可以操作影像輸出模組的(x11)的函式。

圖3-31. vo 影像濾波器的 open()函式

圖3-32為video chain階段2,目前MPlayer已經開啟了vo影像濾波器和x11影像輸出模 組。(假設選定x11影像輸出模組)

圖3-32. Video chain 階段 2

3.開啟並串接影像濾波器(append_filters())

這個函式是將使用者選定的影像濾波器一一開啟並且串接。圖3-33的第3部分,傳 入sh_video->vfilter的指標變數(目前是指到vo影像濾波器),最後回傳的是video filter chain的第一個濾波器的vf_instance_t結構指標。開啟和串接都是由後往前,所以是從vo 往前串接。

args 存放的是 x11 的 vo_function_t 的結構指標 vf->priv->vo 指定為 x11 的 vo_function_t 的結構指標

圖3-33. reinit_video_chain()階段 3 和階段 4 的程式碼

圖3-34為append_filters()的程式碼。vf_settings[]存放使用者選定的影像濾波器,這資 料是MPlayer解析指令的時候,將所有輸入的影像濾波器依序存放在這字串陣列。由於 filter chain是由後往前串接,所以會從vf_settings[]的最後一個影像濾波器往前開啟。串 接方式是用linked list,每個影像濾波器(除了vo影像濾波器)的操作結構都有存放指向下 一個影像濾波器結構的指標。假設選定順序為flip、rotate,則由rotate先開啟,最後再開 啟flip。

圖3-34. append_filters()的程式碼

圖3-35為video chain階段3,目前MPlayer已經開啟了flip、rotate、vo影像濾波器和x11 影像輸出模組。(假設選定flip和rotate影像濾波器)

傳入sh_video->vfilter,將選定的影像濾波器 串接後,取代sh_video->vfilter 的值

選擇最佳的影像解碼器

選擇影像濾波器表單的最後一個

由後往前開啟表單中的影像濾波器,並 且用linked list 串接在一起

圖3-35. Video chain 階段 3

4.選擇最佳影像解碼器(init_best_video_codec())

圖3-33的第4部分,傳入sh_video結構(存放視訊的標頭訊息)、video_codec_list(使用 者選定的影像解碼器)和video_fm_list(使用者選定的影像解碼器模組),如果使用者沒有 選定影像解碼器和影像解碼模組,該函式將從視訊的標頭訊息比對選擇最佳的影像解碼 器。圖3-36為video chain階段4,如此MPlayer已經將video chain整個建構完成。

圖3-36. Video chain 階段 4