国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
stagefright + omx小結(jié)

看了將近1個多月的stagefright和OMX IL,感覺對框架有了一點感覺,趁感覺還在,記錄下來和大家分享,由于本人也是剛開始看多媒體框架,有認(rèn)識不當(dāng)?shù)牡胤竭€請務(wù)必指正.
由于stagefright和openmax運行在兩個不同的進(jìn)程上,所以他們之間的通訊要經(jīng)過openBinder進(jìn)行處理,對openBinder這一塊還沒有了解,所以恕stagefright和openmax之間的通信不能做分析,還有就是本小結(jié)不考慮音頻這一塊,假設(shè)視頻為MP4封裝的AVC編碼文件.

最早看的是opencore,但opencore兼顧了多平臺的移植性而過于復(fù)雜,后來就改看stagefright了,stagefright使用的OMX IL為opencore中的代碼........所以我蠻期待google什么時候能重寫一個OMX IL框架來全面替代opencore

 先簡單的看一下stagefright是怎么工作的, stagefright使用event來進(jìn)行驅(qū)動,event調(diào)度器和event運行在同一個線程中,播放器向隊列插入event來驅(qū)動整個解碼流程,event調(diào)度器的工作抽象流程如下:
1. 檢測隊列是否為空,為空則等待event的插入
2. 獲取隊列中的第一個event
3. 計算event所要求的delay time后進(jìn)行延時操作
4. 將event從隊列中剔除后執(zhí)行該event
event調(diào)度器通過不斷循環(huán)這樣的過程來進(jìn)行調(diào)度,在具體代碼中還會根據(jù)特殊情況進(jìn)而改變調(diào)度過程,目前event事件有如下幾種:
1. onVideoEvent
2. onStreamDone
3. onBufferingUpdate
4. onCheckAudioStatus
5. onPrepareAsyncEvent

stagefright的播放器類為AwesomePlayer,這個類主要有以下幾個成員(排除Audio部分):
1. mVideoSource(解碼視頻)
2. mVideoTrack(從多媒體文件中讀取視頻數(shù)據(jù))
3. mVideoRenderer(對解碼好的視頻進(jìn)行格式轉(zhuǎn)換,android使用的格式為RGB565)
4. mISurface(重繪圖層)
5. mQueue(event事件隊列)

stagefright運行時的抽象流程如下:

下面以一個mp4文件(avc編碼)來分析AwesomePlayer的抽象工作流程(排除Audio部分)
1) 設(shè)置mUri為xxxx.MP4的絕對路徑
2) 啟動mQueue,這會創(chuàng)建一個線程來運行threadEntry,并命名為TimedEventQueue,這個線程就是event調(diào)度器
3) 打開mUri所指定的文件,xxxx.MP4文件的頭部為(....ftypisom....),則會選擇MPEG4Extractor來作為分離器
4) 使用MPEG4Extractor對MP4進(jìn)行音視頻軌道的分離,并返回MPEG4Source類型的視頻軌道給mVideoTrack
5) 根據(jù)mVideoTrack中的編碼類型來選擇解碼器,avc的編碼類型會選擇AVCDecoder (假設(shè)不使用OMX),并返回給mVideoSource,并設(shè)置mVideoSource中的mSource為mVideoTrack
6) 插入onVideoEvent到Queue中,開始解碼播放
7) 通過mVideoSource對象來讀取解析好的視頻buffer
8) 如果解析好的buffer還沒到AV時間戳同步的時刻,則推遲到下一輪操作
9) mVideoRenderer為空,則進(jìn)行初始化,如果不使用OMX會將mVideoRenderer設(shè)置為AwesomeLocalRenderer
10) 通過mVideoRenderer對象將解析好的視頻buffer轉(zhuǎn)換成RGB565格式并發(fā)給display模塊進(jìn)行圖像繪制
11) 將onVideoEvent重新插入event調(diào)度器來循環(huán)

OMX IL作為底層解碼部件的集合層,為上層多媒體框架提供了統(tǒng)一的接口,在Android2.2的stagefright中, stagefright使用的是opencore中的OMX IL實現(xiàn),使用該OMX IL框架需要將mVideoSource設(shè)置為OMXCodec類,OMX IL層的對外接口主要有以下幾種:
1) stagefright使用OMX_MasterInit初始化OMX框架,加載component
2) stagefright使用OMX_MasterGetHandle匹配OMX中的component,匹配成功則返回OMX_HANDLETYPE用于OMXCodec與component之間進(jìn)行通信
3) OMXCodec使用OMX_SendCommand來設(shè)置component的狀態(tài),操作component的port
4) OMXCodec使用EventHandler通知OMXCodec的Command執(zhí)行結(jié)果
5) OMXCodec使用OMX_GetParameter和OMX_SetParameter來獲取和設(shè)置component的屬性參數(shù)
6) OMXCodec使用OMX_UseBuffer設(shè)置compoment使用的buffer為OMXCodec分配的buffer
7) OMXCodec使用OMX_EmptyThisBuffer傳遞未解碼的buffer給component,用于解碼
8) OMXCodec使用OMX_FillThisBuffer傳遞空的bffer給component用于存儲解碼后的幀
9) compoment使用EmptyBufferDone通知OMXCodec已完成inputport buffer的讀取
10) compoment使用FillBufferDone通知OMXCodec已完成outputport buffer的填充
初始化流程如下:

 
OMX component的數(shù)據(jù)主要通過port來進(jìn)行交互,port分為input和output , port通過和OMXCodec共享buffer來進(jìn)行編解碼,如下圖:
 
 
buffer的處理主要由以下4個命令來進(jìn)行驅(qū)動:
 OMXCodec使用OMX_EmptyThisBuffer傳遞未解碼的buffer給component,component收到該命令后會讀取input port buffer中的數(shù)據(jù),將其組裝成幀進(jìn)行解碼,讀取buffer中的數(shù)據(jù)完成后會調(diào)用EmptyBufferDone通知OMXCodec
 compoment使用EmptyBufferDone通知OMXCodec已完成inputport buffer的讀取, OMXCodec收到該命令后會通過mVideoTrack讀取新的視頻buffer到input port的buffer中,并調(diào)用OMX_EmptyThisBuffer通知component
 OMXCodec使用OMX_FillThisBuffer傳遞空的bffer給component用于存儲解碼后的幀,component收到該命令后將解碼好的幀數(shù)據(jù)復(fù)制到該buffer上,然后調(diào)用FillBufferDone通知OMXCodec
 compoment使用FillBufferDone通知OMXCodec已完成outputport buffer的填充, OMXCodec收到該命令后將解碼好的幀傳遞給mISurface進(jìn)行圖像繪制,繪制完畢后使用OMX_FillThisBuffer通知component有空的buffer可填充
抽象圖如下:
OMX IL中的解碼分成了兩個部分,以AVC的解碼為例:
1) 使用AssemblePartialFrames將input port的buffer組裝成幀
2) 將幀傳遞給AvcDecoder_OMX進(jìn)行解碼后輸出到output port的buffer中
如下圖:
 
假設(shè)input port buffer中有2個buffer,分別為buffer_1和buffer_2,并且這兩個buffer所攜帶的數(shù)據(jù)可構(gòu)成1幀,則AssemblePartialFrames首先申請一塊內(nèi)存區(qū)域tmp_buffer_1,將buffer_1的有效數(shù)據(jù)拷貝到tmp_buffer_1上,然后再申請一塊內(nèi)存區(qū)域tmp_buffer_2,申請完后第一步將tmp_buffer_1的數(shù)據(jù)拷貝到自身的前半部,第二步將buffer_2的有效數(shù)據(jù)拷貝到后半部來組合成為1幀.
組合完成后將tmp_buffer_2和output port的buffer交給AvcDecoder_OMX進(jìn)行解碼, AvcDecoder_OMX將解碼后的幀數(shù)據(jù)拷貝到output port buffer中.
-----------------------------------------
轉(zhuǎn)摘請注明轉(zhuǎn)自:http://blog.chinaunix.net/u1/57901/
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
OpenMax在Android上的實現(xiàn)
stagefright框架
Android-StageFright之decode
[整理]Stagefright框架中視頻播放流程
opencore and stagefright
Android播放器框架分析 1
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服