freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于嵌入式linux的視頻采集編碼發(fā)送模塊的設(shè)計(jì)與實(shí)現(xiàn)碩士學(xué)位論文-資料下載頁

2025-06-27 20:28本頁面
  

【正文】 鏈路,創(chuàng)建socket,把RTP數(shù)據(jù)包通過MF210 無線模塊發(fā)送到 WCDMA網(wǎng)絡(luò)當(dāng)中。 視頻采集模塊的設(shè)計(jì) 視頻采集程序程序設(shè)計(jì)V4L2 是 Linux 操作系統(tǒng)提供的一個(gè)視頻處理編程接口,整體架構(gòu)如圖 。V4l2通過I2C總線對(duì)TVP5158進(jìn)行控制,所以作為從屬設(shè)備的TVP5158需要將自己注冊到VPIF采集驅(qū)動(dòng)中,應(yīng)用程序通過調(diào)用VPIF驅(qū)動(dòng)中的ioctl以及mmap()等命令來控制TVP5158完成視頻采集。VPIF驅(qū)動(dòng)則通過調(diào)用TVP5158驅(qū)動(dòng)中的相關(guān)函數(shù)來實(shí)現(xiàn)對(duì)V4L2 API的支持,使得應(yīng)用程序可以根據(jù)自己的需要對(duì)底層硬件進(jìn)行設(shè)置。采集應(yīng)用程序通過調(diào)用V4L2 的IOCTL命令, 按照打開視頻采集設(shè)備(dev/video0,dev/video1等節(jié)點(diǎn))、查詢設(shè)備功能、設(shè)置圖像格式、制式、屬性、開始視頻采集等步驟實(shí)現(xiàn)視頻循環(huán)采集。 V4L2編程接口Video4Linux2(簡稱V4L2)是為針對(duì)視頻設(shè)備的應(yīng)用程序編程提供一系列接口函數(shù),通過這些函數(shù),可以執(zhí)行讀寫、打開、關(guān)閉等操作[2123]。Linux 下操作 V4L2 進(jìn)行視頻采集時(shí),通常涉及到ioctl()和mmap()兩個(gè)系統(tǒng)調(diào)用,其中 ioctl()系統(tǒng)調(diào)用負(fù)責(zé)控制設(shè)備的I/O通道,mmap()系統(tǒng)調(diào)用通過映射同一個(gè)普通文件來實(shí)現(xiàn)進(jìn)程之間共享內(nèi)存。V4L2 編程中,通過調(diào)用 ioctl 函數(shù)來實(shí)現(xiàn)與圖像設(shè)備的交互,常用的ioctl 。 ioctl()函數(shù)命令標(biāo)示符由于應(yīng)用程序不能直接訪問內(nèi)核數(shù)據(jù)空間,所以應(yīng)用程序要訪問內(nèi)核空間緩存buffer中的數(shù)據(jù)就需要通過系統(tǒng)調(diào)用read()、write()等操作,數(shù)據(jù)訪問速度慢。但是通過mmap()映射后,內(nèi)核中的緩存數(shù)據(jù)被映射到用戶空間,應(yīng)用程序可以像訪問普通文件一樣對(duì)采集數(shù)據(jù)進(jìn)行訪問,大大的提高了數(shù)據(jù)處理效率。與之對(duì)應(yīng)的釋放映射內(nèi)核內(nèi)存函數(shù)mummap()。mmap()函數(shù)的原型是:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);mummap()函數(shù)原型是int munmap(void *start, size_t length);在本系統(tǒng)的實(shí)際研發(fā)過程中,前端模擬攝像頭將采集的PAL制式的模擬視頻信號(hào)輸入TVP5158模塊,通過TVP5158編碼轉(zhuǎn)化為數(shù)字信號(hào),DM6467的視頻端口(VPIF)把數(shù)字化后的視頻信號(hào)采集到緩存中,進(jìn)行相關(guān)的處理。具體流程如下:打開采集端口在V4L2中,視頻設(shè)備被看做一個(gè)文件,使用open函數(shù)打開這個(gè)設(shè)備。應(yīng)用程序可以在阻塞模式或非阻塞模式下打開采集端口,如果使用非阻塞模式調(diào)用視頻設(shè)備,即使尚未捕獲到信息,驅(qū)動(dòng)依舊會(huì)把緩存(DQBUFF)里的東西返回給應(yīng)用程序,否則將一直阻塞直到有數(shù)據(jù)[24]。,分別對(duì)應(yīng)驅(qū)動(dòng)中的設(shè)備節(jié)點(diǎn)為dev/video0和dev/video1,本設(shè)計(jì)采用阻塞模式打開采集端口:sprintf(devname,”/dev/video%d”,portnum)。capture_fd = open((const char *)devname, mode)。檢測視頻通道是否連接攝像頭此功能在V4L2標(biāo)準(zhǔn)中是沒有的,本系統(tǒng)根據(jù)需要對(duì)其進(jìn)行的擴(kuò)展。下面代碼中”x”表示視頻通道號(hào)。ioctl(capture_fd, VIDIOC_G_CHx_STATUS,amp。status[x])。if(status[x]) printf(Channel%d no camera is connected\n,x)。設(shè)置視頻捕獲格式std = TVP5158_STD_PAL。ioctl(capture_fd, VIDIOC_S_STD, amp。std)。申請(qǐng)緩沖區(qū)接下來,要為視頻捕獲分配內(nèi)存空間。在V4L2驅(qū)動(dòng)程序中維持著兩個(gè)隊(duì)列:一個(gè)是輸入隊(duì)列,另一個(gè)是輸出隊(duì)列。隊(duì)列被組織成FIFO結(jié)構(gòu),內(nèi)存片段將按順序入隊(duì)到輸入隊(duì)列,并按照順序從輸出隊(duì)列中出隊(duì)。開始采集前,所有被映射的內(nèi)存片段都處于出隊(duì)狀態(tài),驅(qū)動(dòng)程序此時(shí)不可以訪問。應(yīng)用程序通過相關(guān)ioctl命令將映射好的內(nèi)存片段入隊(duì),然后開始捕獲視頻并進(jìn)入read循環(huán),此時(shí)應(yīng)用程序會(huì)一直等待輸出隊(duì)列被填滿到可以有內(nèi)存片段出隊(duì)。當(dāng)出隊(duì)的內(nèi)存片段使用完后就會(huì)重新入隊(duì)到輸入隊(duì)列。內(nèi)存片段循環(huán)入隊(duì)出隊(duì),就可以進(jìn)行循環(huán)采集。申請(qǐng)緩沖區(qū)的關(guān)鍵代碼如下:define MAX_BUFFER 3 = MAX_BUFFER。 = V4L2_BUF_TYPE_VIDEO_CAPTURE。 = V4L2_MEMORY_MMAP。ioctl(*capture_fd, VIDIOC_REQBUFS, amp。reqbuf)。,緩存數(shù)量一般不多于5個(gè),本設(shè)計(jì)定為3個(gè);,捕獲視頻緩存類型是V4L2_BUF_TYPE_VIDEO_CAPTURE;(I/O)方法,此處選擇V4L2_MEMORY_MMAP即內(nèi)存映射方式,具體原因?qū)⒃谙挛闹性斒?。?shù)據(jù)I/O方式—內(nèi)存映射操作系統(tǒng)一般把系統(tǒng)使用的內(nèi)存空間劃分為用戶空間和內(nèi)核空間。用戶空間是用戶進(jìn)程可以直接訪問的內(nèi)存地址;而內(nèi)核空間只有內(nèi)核可以訪問,用戶進(jìn)程不能訪問。上面申請(qǐng)的緩存區(qū)處于內(nèi)核狀態(tài),用戶程序無法直接訪問,因此需要進(jìn)行內(nèi)存映射到用戶空間實(shí)現(xiàn)數(shù)據(jù)交互。在V4L2的接口標(biāo)準(zhǔn)中,定義了3中I/O方式:讀/寫方式、內(nèi)存映射方式和用戶指針方式。應(yīng)用程序要想與驅(qū)動(dòng)程序進(jìn)行數(shù)據(jù)交換,必須至少實(shí)現(xiàn)其中一種方式。讀/寫方式需要不斷在用戶空間和內(nèi)核空間拷貝數(shù)據(jù),效率較低。 讀/寫方式示意圖 內(nèi)存映射方式示意圖內(nèi)存映射方式就是把驅(qū)動(dòng)內(nèi)存映射到用戶空間,應(yīng)用程序與驅(qū)動(dòng)程序之間只是數(shù)據(jù)緩沖區(qū)的地址變換,而不需要拷貝數(shù)據(jù),這是一種高效的數(shù)據(jù)I/O方式。用戶指針方式是介于讀/寫方式與內(nèi)存映射方式之間的一種I/O方式,此方式需要利用較多的用戶空間內(nèi)存,并且驅(qū)動(dòng)實(shí)現(xiàn)起來較為復(fù)雜。本系統(tǒng)的設(shè)計(jì)采用內(nèi)存映射方式:ioctl(*capture_fd, VIDIOC_QUERYBUF, amp。buf)。capture_buff_info[port][index].start = mmap(NULL, , PROT_READ | PROT_WRITE, MAP_SHARED, capture_fd, )。在映射前,先要通過VIDIOC_QUERYBUF命令獲取申請(qǐng)緩沖區(qū)的物理地址。mmap()函數(shù)的第一個(gè)參數(shù)是驅(qū)動(dòng)內(nèi)存片段映射到用戶空間的起始地址,一般設(shè)為NULL,表示由系統(tǒng)分配;第二個(gè)參數(shù)表示要映射內(nèi)存的字節(jié)數(shù);第三個(gè)參數(shù)設(shè)置映射內(nèi)存的屬性為可讀寫;第四個(gè)參數(shù)指定要映射對(duì)象的類型,指定為MAP_SHARED表示允許其他進(jìn)程也可映射此內(nèi)存;第五個(gè)參數(shù)是open()函數(shù)返回的文件描述符;最后一個(gè)參數(shù)是驅(qū)動(dòng)中內(nèi)存起始地址與要映射文件地址的偏移量,若為0表示從文件開頭開始映射,其中第2個(gè)和第6個(gè)參數(shù)由VIDIOC_QUERYBUF命令返回值確定[25]。開始視頻采集應(yīng)用程序通過VIDIOC_QBUF命令將映射好的緩沖區(qū)送入驅(qū)動(dòng)的輸入隊(duì)列,然后調(diào)用VIDIOC_STREAMON命令開始視頻采集,再將采集到的數(shù)據(jù)幀緩沖區(qū)送入到輸出隊(duì)列,應(yīng)用程序從輸出隊(duì)列中讀取一幀數(shù)據(jù)進(jìn)行處理后,再把空緩沖區(qū)放回輸入隊(duì)列中,如此循環(huán),就實(shí)現(xiàn)了視頻流的采集。ioctl(capture_fd, VIDIOC_QBUF, amp。buf)。int a = V4L2_BUF_TYPE_VIDEO_CAPTURE。ioctl(capture_fd, VIDIOC_STREAMON, amp。a)。ioctl(capture_fd, VIDIOC_QBUF, amp。buf)。停止視頻采集終止視頻采集是通過調(diào)用VIDIOC_STREAMOFF命令實(shí)現(xiàn)的,視頻采集停止后,要通過munmap()函數(shù)釋放映射的內(nèi)存空間,關(guān)閉open()函數(shù)返回的文件描述符。int a = V4L2_BUF_TYPE_VIDEO_CAPTURE。ioctl(*capture_fd, VIDIOC_STREAMOFF, amp。a)。munmap(capture_buff_info[port][index].start, capture_buff_info[port][index].length)。close(capture_fd)。,、優(yōu)化工作已經(jīng)由項(xiàng)目中其他工作人員完成,所以本節(jié)的主要工作就是實(shí)現(xiàn)算法的xDM標(biāo)準(zhǔn)封裝、Codec Server生成、Codec Engine配置和編碼應(yīng)用程序的開發(fā)。 視頻編碼模塊的設(shè)計(jì)在視頻采集線程中,攝像頭采集模擬數(shù)據(jù)之后,經(jīng)過TVP5158芯片進(jìn)行AD轉(zhuǎn)換,亮、色度分離,降噪濾波等處理后轉(zhuǎn)換為符合DM6467的VPIF接口傳輸?shù)臄?shù)字信號(hào),經(jīng)過解復(fù)用處理后,得到的YUV格式的數(shù)據(jù),放入待編碼數(shù)據(jù)buffer中。待數(shù)據(jù)寫入后,觸發(fā)視頻編碼線程,由ARM端編碼應(yīng)用程序遠(yuǎn)程調(diào)用VISA API,控制遠(yuǎn)端DSP進(jìn)行壓縮編碼處理,得到NALU為單元的幀組。 . 一.算法接口定義達(dá)芬奇平臺(tái)上的應(yīng)用程序開發(fā)流程要求算法開發(fā)需要遵循一定的標(biāo)準(zhǔn)規(guī)范,亦即TI提出的DSP算法標(biāo)準(zhǔn)xDAIS。xDAIS算法標(biāo)準(zhǔn)定義了一系列編程準(zhǔn)則和建議[26][27],標(biāo)準(zhǔn)化了系統(tǒng)軟件和算法的接口,降低了算法使用者的系統(tǒng)集成任務(wù),從而縮短了產(chǎn)品開發(fā)周期。對(duì)于每個(gè)xDAIS,給定的算法標(biāo)準(zhǔn)的IALG界面擴(kuò)展到算法的IMOD界面。IMOD界面提供算法的基本功能,IALG界面則關(guān)注存儲(chǔ)器的管理。xDAIS本身并不定義IMOD界面,需要使用某種算法,就必須基于其要求,自己來定義。: 應(yīng)用程序和xDAIS標(biāo)準(zhǔn)間的關(guān)系其中,所有算法都必須實(shí)現(xiàn)IALG接口。IALG接口主要工作是定義算法中所需要使用的內(nèi)存,提高系統(tǒng)內(nèi)存使用效率。由于xDAIS中的API是基于C的,是面向過程,無法實(shí)現(xiàn)對(duì)象的封裝、繼承、重構(gòu)等特性,因此xDAIS設(shè)計(jì)了一個(gè)名為IALG_Fxns的v_table,實(shí)現(xiàn)應(yīng)用程序調(diào)用接口。: 算法封裝接口xDM算法標(biāo)準(zhǔn)是TI在xDAIS標(biāo)準(zhǔn)上的一個(gè)擴(kuò)展,用來為數(shù)字信號(hào)處理提供一個(gè)輕量級(jí)的框架,總體上說,就是在XDAIS的基礎(chǔ)上擴(kuò)展了一個(gè)名為Digital Media的接口(xDM),然后根據(jù)數(shù)字圖像處理的要求,提供了一個(gè)名為VISA的API集合。這樣下來,: 應(yīng)用程序和xDAIS標(biāo)準(zhǔn)間的關(guān)系簡單起見,()進(jìn)行xDM標(biāo)準(zhǔn)算法庫的開發(fā),也就是說IMOD接口等同與xDM接口。首先我們對(duì)算法實(shí)例的數(shù)據(jù)類型進(jìn)行定義然后對(duì)算法實(shí)例的接口進(jìn)行定義,在分別對(duì)接口函數(shù)進(jìn)行定義,這種分層次的定義過程就形成了算法xDM標(biāo)準(zhǔn)的封轉(zhuǎn)。//算法實(shí)例數(shù)據(jù)類型的定義//Typedef struct X264ENC_Obj{IVIDENC_Obj alg。 /*Must be first field of all xDAIS algs*/X264_t *h。X264_picture pic。}X264ENC_Obj。算法實(shí)例的接口類型定義如下所示://算法模塊接口類型的定義//define IALGFXNS \ amp。X264ENC_IALG, \ X264ENC_activate, \ X264ENC_alloc, \ NULL, \ X264ENC_deactivate, \ X264ENC_free, \ X264ENC_initObj, \ NULL, \ NULL IVIDENC_Fxns X264ENC_X264ENC = { {IALGFXNS}, X264ENC_process, X264ENC_control, }。根據(jù)IVIDENC1接口進(jìn)行算法接口定義之后,實(shí)現(xiàn)對(duì)應(yīng)的接口回調(diào)函數(shù)即可實(shí)現(xiàn)自定義算法的xDM封裝。 算法接口的實(shí)現(xiàn)主要是algAlloc()、algInit()、algFree()回調(diào)函數(shù)與上層應(yīng)用程序的交互來實(shí)現(xiàn),此外還使用algActivate()和algDeactivate()回調(diào)函數(shù)來調(diào)度算法之間的內(nèi)存,使用algControl()和algProcess()來控制算法。二.算法接口實(shí)現(xiàn)算法實(shí)例接口(IALG)是xDM算法標(biāo)準(zhǔn)的核心接口,它定義了算法是如何實(shí)施的以及算法實(shí)施所需要的變量類型、常量以及IALG_Fxns等,負(fù)責(zé)管理應(yīng)用程序及其所執(zhí)行的算法對(duì)內(nèi)存資源的使用,包括片內(nèi)數(shù)據(jù)的調(diào)度等。它主要是通過IALG_Fxns結(jié)構(gòu)體中的接口函數(shù),algActivate() algAlloc(),algControl(),algDeactivate(),algFree(),algInit(),algMoved(),algNumAlloc()來封裝實(shí)現(xiàn)的,該結(jié)構(gòu)體還包含了一個(gè)用于表示算法具體實(shí)例的指針類型的參數(shù),它給出了算法實(shí)例的具體模塊的地址,并在后續(xù)的執(zhí)行中使用。算法實(shí)例接口中,還存在大量的片內(nèi)和片外內(nèi)存或片外與片外內(nèi)存之間的拷貝,而在DM6467平臺(tái)中不允許算法直接訪問和控制周邊硬件資源,也包括DMA資源。為了使用DMA資源就需要使用DMA資源管理器來控制和分配DMA資源。它主要是通過三個(gè)標(biāo)準(zhǔn)接口IDMADMANACPY3實(shí)現(xiàn)的,其中接口IDMA3主要提供算法的DMA資源規(guī)范及協(xié)議,這個(gè)接口允許客戶端應(yīng)用程序的查詢并提供給算法其請(qǐng)求的DMA資源。DMAN3是資源管理器,它主要負(fù)責(zé)為基于IDMA3接口的應(yīng)用程序和算法管理和發(fā)放DMA資源。ACPY
點(diǎn)擊復(fù)制文檔內(nèi)容
化學(xué)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1