亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于V4L2 框架的Media Request架構(gòu)研究

        2021-04-07 00:23:58張倩敏吳其林
        蚌埠學(xué)院學(xué)報 2021年2期
        關(guān)鍵詞:設(shè)置

        張倩敏,劉 擁,吳其林,劉 運(yùn)

        (巢湖學(xué)院 信息工程學(xué)院,安徽 巢湖 238000)

        隨著互聯(lián)網(wǎng)通信的快速發(fā)展和5G技術(shù)的普及,各種直播和短視頻平臺開始快速涌現(xiàn),視頻已經(jīng)成為我們獲取外界信息最快速的方式之一[1]。隨著多媒體技術(shù)的不斷發(fā)展,視頻編解碼的應(yīng)用場景也越來越復(fù)雜,衍生出多種不同的使用領(lǐng)域,如stateless codecs、region of interest(ROI)、High-Dynamic Range (HDR10+)[2-3]、Complex Camera、Codec V2等。V4L2[4-5]的框架已經(jīng)不能滿足這些復(fù)雜應(yīng)用場景的性能需求,為了解決部分場景的應(yīng)用問題,kernel 4.20后在圖像輸入端添加了Request api新架構(gòu)。

        在視頻編碼時,需要對每一張輸入圖像設(shè)置不同的參數(shù)(metadata),再讓硬件去編碼。如果不借助Request api,直接調(diào)用V4L2的接口送一張圖像數(shù)據(jù)和編碼需要的參數(shù)給硬件進(jìn)行處理,等硬件處理完這張圖像后才能送下一張圖像的數(shù)據(jù)和參數(shù)。在引入Request api架構(gòu)后,V4L2可以調(diào)用media request的相關(guān)接口把每一張圖像數(shù)據(jù)和對應(yīng)的參數(shù)進(jìn)行綁定,用戶只需要調(diào)用V4L2的接口把數(shù)據(jù)連續(xù)不斷地送給硬件處理,不用擔(dān)心圖像數(shù)據(jù)和參數(shù)匹配錯誤的問題,可以有效地提高數(shù)據(jù)并行處理的能力,尤其在user space等需要大量數(shù)據(jù)計算的場景中效率提高得非常顯著。

        1 V4L2視頻多媒體框架

        鑒于Linux開源、穩(wěn)定且具有良好的移植性、完善的參考文獻(xiàn)和龐大的用戶群體,Linux系統(tǒng)的使用越來越廣泛。尤其是隨著嵌入式系統(tǒng)的快速發(fā)展,Linux已經(jīng)滲透到我們生活中的方方面面。智能電視、安防監(jiān)控、智能手機(jī),甚至在汽車多媒體中都可以看到Linux系統(tǒng)的身影。

        傳統(tǒng)視頻多媒體服務(wù)層的架構(gòu)如圖1所示,每一種多媒體框架都有一個服務(wù)層來驅(qū)動硬件進(jìn)行工作,如Android 系統(tǒng)的OMX和Codec V2,用于汽車電子的Gstreamer[6-8],用于嵌入式領(lǐng)域的QT,google新開發(fā)的stateless codecs等。若有多個框架,則需要有多套驅(qū)動程序進(jìn)行適配,移植性很差且給開發(fā)者帶來很大的工作量。

        圖1 傳統(tǒng)多媒體架構(gòu)

        隨著技術(shù)的發(fā)展,還會有越來越多的新架構(gòu)產(chǎn)生。若對每一種架構(gòu)都寫一個服務(wù)層驅(qū)動視頻編解碼硬件進(jìn)行工作,需要消耗大量的時間和成本。

        為了方便用戶的開發(fā)和接口的統(tǒng)一,Linux系統(tǒng)提供了一整套標(biāo)準(zhǔn)的接口供使用。如圖2所示,用戶只需要調(diào)用這些接口開發(fā)一個公共的服務(wù)層,就可以讓所有的多媒體框架共用同一套驅(qū)動程序,有效地節(jié)省了開發(fā)時間,提高了工作效率。

        圖2 V4L2多媒體框架結(jié)構(gòu)

        2 Request api架構(gòu)

        視頻應(yīng)用的多元化和多樣性在不同領(lǐng)域發(fā)生著較大的變化。比如:為了發(fā)揮出硬件的最大性能,google開發(fā)了新的架構(gòu)stateless codecs;在android 多媒體架構(gòu)中為了支持更多的功能,添加了新框架Codec V2取代原有的OMX;在使用手機(jī)時,希望拍出色彩更加飽和的圖片和視頻,提出了Complex Camera;在汽車電子中,為了防止剮蹭,希望可以看到周圍360度的全景影像,全景影像系統(tǒng)Around View Monitor(AVM)由此誕生。這些復(fù)雜的架構(gòu)對軟件的性能要求也越來越高,Request api設(shè)計的思想就是用來解決在這些復(fù)雜的應(yīng)用領(lǐng)域中現(xiàn)階段V4L2框架無法工作或性能較差的問題。

        Request api對media controller api進(jìn)行擴(kuò)展,把media controller device和video device鏈接在一起,借助media controller device讓每一張輸入圖像都可以攜帶自己的私有參數(shù),視頻編解碼硬件可以根據(jù)不同的參數(shù)對輸入圖像進(jìn)行不同的特殊處理。

        非Request api的工作方式如圖3所示。硬件在處理每一張圖像時,需要把輸入圖像數(shù)據(jù)和參數(shù)(metadata)一起送給視頻編解碼硬件,待硬件處理完這張圖像數(shù)據(jù)后,User space才能送下一張圖像數(shù)據(jù)和參數(shù)給視頻編解碼硬件進(jìn)行處理,所有的圖像只能按照串行的方式進(jìn)行工作,否則就會出現(xiàn)數(shù)據(jù)覆蓋的問題,對于性能要求較高的使用場景,無法滿足需求。

        圖4是引入Request api后的工作方式,圖像數(shù)據(jù)和參數(shù)(metadata)通過media controller device綁定在一起,在硬件需要處理某一張圖像時,調(diào)用media controller device的接口獲取當(dāng)前這張圖像攜帶的參數(shù)(metadata)。User space 不斷地向視頻編解碼硬件送數(shù)據(jù)和參數(shù),而不用擔(dān)心數(shù)據(jù)覆蓋的問題,硬件則連續(xù)地從隊(duì)列中獲取數(shù)據(jù)進(jìn)行編解碼,這樣硬件就可以一直處于高速的工作狀態(tài),最大性能地發(fā)揮出硬件的處理能力,高效地達(dá)到并行處理數(shù)據(jù)的目的,也給后面更加復(fù)雜的應(yīng)用場景提供可行性的依據(jù)。

        圖4 Request api編解碼架構(gòu)

        3 Request api在kernel中的實(shí)現(xiàn)

        為了讓V4L2架構(gòu)支持Request api,需要在kernel中設(shè)置一些參數(shù)讓V4L2架構(gòu)[9]的Request api可以正常工作,可以按照圖5的流程進(jìn)行設(shè)置,主要包括以下幾個部分:

        圖5 Request api參數(shù)設(shè)置流程圖

        (1)注冊media device和video device

        Request api使用了media controller device framework的功能,需要在probe函數(shù)中調(diào)用函數(shù)v4l2_m2m_register_media_controller()和media_device_register()注冊media device,調(diào)用函數(shù)video_device_register()和v4l2_m2m_init()注冊video device。

        (2)實(shí)現(xiàn)media device operations

        Media device 的callback函數(shù)比較多,需要實(shí)現(xiàn)其中的兩個req_validate和req_queue。實(shí)現(xiàn)的callback函數(shù)如下:

        struct media_device_ops media_ops = {

        .req_validate = v4l2_m2m_req_validate,

        .req_queue = v4l2_m2m_req_queue};

        (3)初始化videobuf2 queue list

        struct vb2_queue結(jié)構(gòu)體變量中有兩個重要的參數(shù)supports_requests和requires_requests,需要把這兩個變量的值設(shè)置為true。support_requests表示隊(duì)列支持Request api,requires_requests表示當(dāng)前隊(duì)列需要Request api的支持,如果support_requests的值為true,requires_requests的值也必須設(shè)置為true。

        (4)初始化videobuf2 operations

        Videobuf2的callback函數(shù)也比較多,buf_out_validate 和buf_request_complete是Request api特有的,如果支持Request api必須要實(shí)現(xiàn),否則就會出錯。其余的callback函數(shù)是Request api和非Request api共用的,根據(jù)需要進(jìn)行實(shí)現(xiàn)。

        (5) 初始化CID controls

        需要按照設(shè)置CID的標(biāo)準(zhǔn)方式對支持的不同CID controls[10]進(jìn)行設(shè)置,保證user space設(shè)置當(dāng)前圖像的參數(shù)(metadata)能夠按照指定的格式正確地設(shè)置到kernel中給硬件使用,設(shè)置CID controls調(diào)用的函數(shù)如下:

        struct v4l2_ctrl_handler *output_hdl;

        struct v4l2_ctrl * request_ctrl;

        v4l2_ctrl_handler_init(output_hdl, count);

        request_ctrl = v4l2_ctrl_new_custom (output_hdl, &request_ctrls[i].cfg, NULL);

        v4l2_ctrl_handler_setup(output _hdl);

        按照以上的步驟設(shè)置完成后,就可以把kernel的Request api功能打開,在output queue(輸入圖像隊(duì)列)上使用這個功能。

        4 Request api在capture queue中的實(shí)現(xiàn)

        由于capture queue(輸出圖像隊(duì)列)上無法使用Request api,對于需要把解碼過程中的一些狀態(tài)信息帶給user space的使用場景,現(xiàn)有的框架無法實(shí)現(xiàn)。比如:在智能電視和高清機(jī)頂盒的使用過程中,由于屏幕較大,用戶希望輸出圖像的色彩更加鮮艷,需要把HDR信息和輸出圖像數(shù)據(jù)一起丟給后級進(jìn)行顯示;在安防監(jiān)控領(lǐng)域,希望根據(jù)不同的場景標(biāo)記出感興趣的事物:行人軌跡、車輛信息等,把ROI[11-12]的信息和輸出圖像進(jìn)行配對供檢索;獲取視頻編解碼硬件在實(shí)際使用過程中的一些狀態(tài)信息判斷當(dāng)前硬件的工作狀態(tài)等場景。本文對Request api架構(gòu)做了較大的擴(kuò)充和改進(jìn),提出一種可行性的方案可以讓Request api支持capture queue,實(shí)現(xiàn)的具體過程如圖6所示。

        圖6 Request api在capture queue中的實(shí)現(xiàn)過程

        (1)添加支持capture queue CID controls的control hanlder。在struct v4l2_fh 結(jié)構(gòu)體中添加變量:struct v4l2_ctrl_handler *cap_handler,所有capture queue用到的CID controls(用來存放每張圖對應(yīng)的數(shù)據(jù)信息)都會指向這個handler,用來和output queue的handler作區(qū)分。

        (2)設(shè)置capture queue的capability屬性。在函數(shù)fill_buf_caps()中添加capture queue的capability屬性:

        if (q->supports_ro_requests)

        *caps |= V4L2_BUF_CAP_SUPPORTS_NEW_REQUESTS;

        (3)在函數(shù)v4l2_m2m_qbuf中把判斷當(dāng)前隊(duì)列是capture queue時就會報錯的條件移除,并且在函數(shù)v4l2_m2m_request_queue中添加對capture queue的支持, m2m_ctx_obj=container_of(vb-> vb2_queue, struct v4l2_m2m_ctx, cap_q_ctx.q)。

        (4)在函數(shù)v4l2_ctrl_request_hdl_find()中添加判斷條件,如果當(dāng)前capture buffer沒有申請新的內(nèi)存空間去存放當(dāng)前這張圖對應(yīng)的數(shù)據(jù):HDR或ROI,則申請一塊新的內(nèi)存空間,同時根據(jù)ref fd返回當(dāng)前capture buffer對應(yīng)的參數(shù)指針。

        (5)在set/get ext controls時,移除判斷當(dāng)前CID control是capture queue就返回錯誤的條件。添加接口,根據(jù)CID controls判斷屬于output queue還是capture queue,并調(diào)用output queue或capture queue的CID controls handler把參數(shù)填到對應(yīng)的內(nèi)存中。

        (6)因?yàn)閏apture queue和output queue的狀態(tài)在數(shù)據(jù)處理過程中是不一樣的。Output queue在使用時先set CID controls再get CID controls,而capture queue只需要get CID controls,因此狀態(tài)變化和output queue有點(diǎn)差異,需要在函數(shù)media_request_object_bind()中對capture queue的狀態(tài)做判斷,對不同的queue做不同的處理。

        在V4L2架構(gòu)中需要按照以上的過程添加對capture queue的支持,讓每一個capture buffer都有自己獨(dú)立的參數(shù)信息而不會被覆蓋,使HDR、ROI等需要把capture buffer和參數(shù)信息做綁定的場景得以實(shí)現(xiàn),達(dá)到并行處理數(shù)據(jù)的目的。

        5 Request api在user space 中的實(shí)現(xiàn)

        output queue(輸入圖像)和capture queue(輸出圖像)在user space中的使用方法一樣,只是在kernel中會有不同的邏輯,Request api在user space 中的使用分成兩部分:

        5.1 user space設(shè)置參數(shù)和視頻編解碼數(shù)據(jù)給硬件

        設(shè)置的具體過程如圖7所示。需要特別注意media fd、codec fd和req fd這3個file handle的區(qū)別,否則會使用錯誤的device,導(dǎo)致整個功能不能正常工作。media fd是打開media controller device的file handle(/dev/mediaX);codec fd是打開 video device的file handle(/dev/videoX);req fd 是通過調(diào)用media controller device的接口 MEDIA_IOC_REQUEST_ALLOC獲取的media request file handle。

        (1)調(diào)用media controller device的接口MEDIA_IOC_REQUEST_ALLOC設(shè)置圖像參數(shù)(metadata)的file handle(req fd);

        (2)調(diào)用VIDIOC_S_EXT_CTRLS將當(dāng)前圖像的參數(shù)輸送給視頻編解碼硬件;

        (3) 調(diào)用VIDIOC_QBUF將當(dāng)前圖像的數(shù)據(jù)輸送給視頻編解碼硬件;

        (4)調(diào)用MEDIA_REQUEST_IOC_QUEUE[13-14]把當(dāng)前圖像的參數(shù)和圖像數(shù)據(jù)在kernel中進(jìn)行綁定,在kernel中就可以根據(jù)圖像數(shù)據(jù)獲取對應(yīng)的參數(shù)信息,視頻編解碼硬件就可以正常工作。

        圖7 user space中使用Request api的方法

        5.2 圖像數(shù)據(jù)緩沖區(qū)的循環(huán)利用

        視頻編解碼硬件處理完圖像數(shù)據(jù)后,會通知kernel發(fā)送處理完成的event事件給user space。user space有一個單獨(dú)的線程一直polling是否有來自kernel處理完成的event事件,當(dāng)polling到信息后,調(diào)用MEDIA_REQUEST_IOC_REINIT通知kernel當(dāng)前這張圖像對應(yīng)的緩沖區(qū)已經(jīng)處理完成,這個緩沖區(qū)現(xiàn)在處于空閑狀態(tài),user space便可把下一張待處理的圖像數(shù)據(jù)填充到這個緩沖區(qū)中并且把當(dāng)前這張圖像攜帶的參數(shù)信息調(diào)用VIDIOC_S_EXT_CTRLS送到kernel中。如此循環(huán)往復(fù),就可以把所有的視頻編解碼數(shù)據(jù)處理完成。需要注意的是如果不調(diào)用MEDIA_REQUEST_IOC_REINIT[15]就直接設(shè)置下一張圖像的數(shù)據(jù)給視頻編解碼硬件,因?yàn)閗ernel此時還以為當(dāng)前數(shù)據(jù)緩沖區(qū)還在使用,就會發(fā)送錯誤的返回值到user space,整個處理流程就會被阻塞。

        對于HDR、ROI需要在capture queue上使用的場景,在硬件編解碼結(jié)束后把數(shù)據(jù)寫到對應(yīng)的內(nèi)存空間中,user space在polling到event事件后就可以拿到對應(yīng)的信息。User space polling event事件和REINIT的具體調(diào)用過程如圖8所示:

        圖8 Request api buffer回收過程

        6 實(shí)驗(yàn)結(jié)果與結(jié)論

        本研究在嵌入式平臺上對Request api和非Request api兩種架構(gòu)的性能做了詳細(xì)的測試,測試結(jié)果如下。

        讓Request api和非Request api都設(shè)置相同的參數(shù)到kernel給硬件進(jìn)行處理。處理的原始數(shù)據(jù)都是一樣的,以處理1000張圖的數(shù)據(jù)進(jìn)行對比,1路和10路的測試數(shù)據(jù)如表1所示:

        表1 兩種架構(gòu)處理時間的對比結(jié)果 ms

        從上面的測試結(jié)果看出,因?yàn)镽equest api是讓軟件的處理流程達(dá)到并行,所以Request api和非Request api的硬件處理時間是固定的。但在軟件的處理時間上,Request api要比非Request api好很多。對于1路播放,1000張圖就快了88 ms,對應(yīng)硬件的時間可以多處理44張圖;而對于10路播放,因?yàn)橄到y(tǒng)的loading變大,相應(yīng)的軟件處理時間變長,Request api的優(yōu)勢更加明顯。

        Request api在capture queue上的使用以ROI為例進(jìn)行測試。假設(shè)每張圖對應(yīng)的感興趣區(qū)域?yàn)?個不同的矩形框,每張圖矩形框的坐標(biāo)都會變大一個像素,達(dá)到寬和高的最大值后再重新計算。測試結(jié)果如圖9所示,與實(shí)際使用過程中的原理類似,只需要把對應(yīng)的CID controls的參數(shù)填好,無論需要什么數(shù)據(jù)都是可以通過ref fd獲取的。

        圖9 Request api在capture queue上的測試結(jié)果

        綜上,隨著信息技術(shù)和嵌入式系統(tǒng)的快速發(fā)展,新產(chǎn)品的更新?lián)Q代也越來越快,同時用戶對視頻畫質(zhì)的要求也越來越高,從原來的480 P到現(xiàn)在2 K的普及,給傳統(tǒng)的視頻編解碼架構(gòu)帶來很大的挑戰(zhàn),也不利于驅(qū)動程序的維護(hù)和使用。若能夠按照V4L2的標(biāo)準(zhǔn)接口讓每個產(chǎn)品線在user space service層的對下接口都能夠統(tǒng)一,勢必會給視頻編解碼工程師帶來巨大的收益和效率的提升。本文對Request api的架構(gòu)做了詳細(xì)的研究,并對capture queue上使用Request api做了擴(kuò)展和改進(jìn)。

        同時Linux社區(qū)也在不斷地更新V4L2框架,讓V4L2的功能變得越來越強(qiáng)大,以應(yīng)對現(xiàn)階段或以后能想到的各種復(fù)雜的應(yīng)用和需求,Linux社區(qū)也會給使用者提供非常詳細(xì)的參考文檔,以便讓更多的使用者和開發(fā)者參與其中。

        猜你喜歡
        設(shè)置
        中隊(duì)崗位該如何設(shè)置
        船舶防火結(jié)構(gòu)及設(shè)置的缺陷與整改
        水上消防(2020年5期)2020-12-14 07:16:18
        中外醫(yī)學(xué)專業(yè)與??圃O(shè)置對比分析及啟示
        特殊場景下列控等級轉(zhuǎn)換的設(shè)置方案
        7招教你手動設(shè)置參數(shù)
        動車段(所)股道有效長設(shè)置研究
        我國中小學(xué)將設(shè)置人工智能相關(guān)課程
        玩具世界(2017年9期)2017-11-24 05:17:29
        吃紙的妖怪
        本刊欄目設(shè)置說明
        中俄臨床醫(yī)學(xué)專業(yè)課程設(shè)置的比較與思考
        精品精品国产三级av在线| 亚洲视频一区二区免费看| 国产成人自拍高清在线| 国产乱了真实在线观看| 国产乱子伦精品无码码专区| 中文字幕大乳少妇| 熟女高潮av一区二区| 最新国产精品拍自在线观看| 久久www色情成人免费观看| 日韩在线免费| 日本一区二区视频免费观看| 女人一级特黄大片国产精品| 亚洲一区二区三区毛片| 国产精品久久久三级18| 亚洲youwu永久无码精品| 精品国产一区二区三区免费| 亚洲天堂资源网| 在线偷窥制服另类| 黑丝美腿国产在线观看| 色一情一乱一伦麻豆| 色翁荡息又大又硬又粗又视频图片| 亚洲熟妇大图综合色区| 国产亚洲一区二区精品| 五月av综合av国产av| 一本大道东京热无码| 成年女人免费v片| av资源吧首页在线观看| 亚洲国产av自拍一区| 好日子在线观看视频大全免费动漫| 精品无码久久久久久久久粉色| 国产精品一区二区三区成人| 日本欧美大码a在线观看| 97精品人妻一区二区三区香蕉| 国产精品无码专区视频| 久久久亚洲精品午夜福利| 日本一区二区三区综合视频| 日韩日韩日韩日韩日韩| 无码吃奶揉捏奶头高潮视频| 无码精品色午夜| 国产精品亚洲一区二区三区久久| 国产综合色在线视频区|