達芬奇培訓資料_第1頁
達芬奇培訓資料_第2頁
達芬奇培訓資料_第3頁
達芬奇培訓資料_第4頁
達芬奇培訓資料_第5頁
已閱讀5頁,還剩115頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2024/3/11達芬奇培訓資料一、概述第2頁一、概述攝像頭視頻輸出到具有自動取景功能的系統中

第3頁將目標的特征圖片預存到U盤中

根據監(jiān)控場所不同可以對每次保存圖片的個數m,保存圖片的間隔n秒進行設置

在攝像頭監(jiān)控視角范圍內特征出現時,則按照設置內容對圖片進行保存,且發(fā)出報警信號保存在U盤中的圖片可以在監(jiān)視器上瀏覽、放大且保證一定的清晰度特征查找實時性高

通過按鍵實現預存特征圖片,在監(jiān)視器上瀏覽、放大保存的圖片增加OSD顯示

一、達芬奇簡介-項目資源第4頁芯片:DM6446?評估板:DVEVM?內核:MontaVistaLinux?主機:RedhatLinux?仿真器:XDS510USB?軟件:CCS3.2?工具鏈:CodecEngine1.02?C64x+:DSP內核,執(zhí)行算法?ARM926EJ‐S:ARM內核,主控整個系統?VPSS:由VPFE和VPBE組成?VICP:視頻圖象協處理器一、達芬奇簡介-項目資源第5頁DM6446一、達芬奇簡介-項目資源第6頁DM6446一、達芬奇簡介-項目資源第7頁DSPCore?內核:C64x升級到C64x+?指令集:新增ADDSUB2,MAX2,MIN2,DDOTP4,CMPY,DPACK2等指令?片內RAM:L1和L2是各自獨立的,而C64x內核中,L1是包含在L2中的?DMA:IDMA+EDMA,支持3D傳輸,QDMA成為EDMA的一部分,PaRAM長度增加為8個字長一、達芬奇簡介-項目資源第8頁ARMCore?內核:ARM926EJ‐S?主存:32‐bit,DDR2‐400?EMIF:NorFlash,NandFlash?ATA:HDD,CompactFlash?SDIO:MMC,SD?USB:USB2.0FullSpeed480Mbps?EMAC:10/100MbpsEthernetMACARM一、達芬奇簡介-項目資源第9頁VPSS?VPSS:VideoProcessSub‐System?VPFE:VideoProcessFront‐End?CCDC:用于視頻和圖象的采集,可以直接和CMOS或者CCD傳感器模組相連?H:直方圖統計?3A:自動曝光,自動白平衡,自動聚焦?Preview:快視預覽?Resizer:1/4x‐4x的縮放倍數,實現ZOOM一、達芬奇簡介-項目資源第10頁VPSS?VPSS:VideoProcessSub‐System?VPFE:VideoProcessFront‐End?CCDC:用于視頻和圖象的采集,可以直接和CMOS或者CCD傳感器模組相連?H:直方圖統計?3A:自動曝光,自動白平衡,自動聚焦?Preview:快視預覽?Resizer:1/4x‐4x的縮放倍數,實現ZOOM?VPBE:VideoProcessBack‐End?OSD:用于制作菜單?DAC:4路DAC輸出,支持CVBS格式和S‐Video格式?數字視頻輸出:支持8‐16bitYUV格式和24bitRGB格式一、達芬奇簡介-項目資源第11頁評估板:DVEVM?評估板:DVEVM?附帶攝像頭,模擬屏,紅外遙控器,評估板各種接口十分齊全?DVEVM上有三個可編程器件?做為軟硬件協同開發(fā)的分界平臺?快速評估軟件和算法的性能一、達芬奇簡介-項目資源第12頁評估板:DVEVM一、達芬奇簡介-項目資源第13頁內核:MontaVistaLinux?MontaVistaLinuxPro?內核?文件系統?工具鏈?DVEVM包含三個組件的評估版?集成開發(fā)環(huán)境-DevRocket(MontaVistaDevRocket圖形開發(fā)環(huán)境

)?DVSDK包含四個組件的企業(yè)版一、達芬奇簡介-項目資源第14頁主機配置?TFTPServer?NFSServer?Minicom?安裝的時候禁用防火墻和SELinux一、達芬奇簡介-項目資源第15頁仿真器:XDS560PCI?算法開發(fā)流程中的Emulator?算法的功能驗證必須通過仿真器和目標板進行,一般的,Simulator驗證通過的代碼,Emulator大都正確?底層開發(fā)使用,調試硬件,燒寫Flash一、達芬奇簡介-項目資源第16頁軟件:CCS3.2?老版本的CCS不支持C64x+的內核?老版本的CCS不支持更高版本的BIOS?我們推薦使用的CCS版本:?CodeComposerStudioVersion?相關的組件有:?DSPBIOS?CodeGenerateTools?XDCToolsCCS一、達芬奇簡介-項目資源第17頁工具鏈:CodecEngine1.02?CodecEngine簡稱CE?CE是什么??CE能干什么??CE由什么組成??CE怎么使用??沒有CE能不能開發(fā)算法?一、達芬奇簡介-項目資源第18頁工具鏈:CodecEngine1.02?CE是TI提供的一個軟件架構?應用軟件通過CE提供的接口調用算法?CE同時支持單核模式和雙核模式?CE可以實現雙核通信?CE由dsplink,cmem,fc,xdais四個組件和一組VISA的例程構成?沒有CE,也可以實現雙核系統的開發(fā)一、達芬奇簡介-項目資源第19頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第20頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第21頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第22頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第23頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第24頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第25頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第26頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第27頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第28頁工具鏈:CodecEngine1.02一、達芬奇簡介-項目資源第29頁工具鏈:CodecEngine1.02一、達芬奇簡介-完整設計流程第30頁?獲取算法C模型?獲取測試序列?VC或GCC下編譯算法C模型,并且根據測試序列生成輸出標準序列?算法C模型的優(yōu)化?移植到CCS下?算法DSP模型的優(yōu)化一、達芬奇簡介-完整設計流程第31頁?獲取算法C模型?獲取測試序列?VC或GCC下編譯算法C模型,并且根據測試序列生成輸出標準序列?算法C模型的優(yōu)化?移植到CCS下?算法DSP模型的優(yōu)化?CCS下用Simulator進行仿真?CCS下用Emulator進行功能驗證?Linux下用CE工具鏈進行算法封裝?Linux下用DVEVM進行算法功能驗證?Linux下進行算法可重入的功能驗證?Linux下制作算法演示Demo一、達芬奇簡介-完整工具鏈第32頁?DSPBIOS?CodeGenerateTools?XDCTools?FrameworkComponent?Cmem?DSPLink?XDAIS?CodecEngine二、程序架構第33頁三、應用程序設計第34頁主線程(main.c)。主線程在初始化完數據后就變成控制線程。

程序包含6個單獨的POSIX線程

控制線程(ctrl.c)。完成控制功能,主要是遙控器。視頻線程(video.c)。視頻采集線程。視頻顯示線程(display.c)。聲音線程(audio_thread.c)。完成語音報警功能。其中,video,display,capture,audio線程由main線程在其變?yōu)閏ontrol線程之前創(chuàng)建。在程序執(zhí)行起來之后,一共有5個單獨的線程在運行。三、應用程序設計-目錄第35頁優(yōu)先級說明

線程初始化清理同步說明

各個線程說明

Main線程

Video線程

Control線程Capture線程

Display線程

Audio線程

三、應用程序設計-優(yōu)先級說明第36頁三、應用程序設計-優(yōu)先級說明第37頁除了main和control線程之外的線程都配置為優(yōu)先的且優(yōu)先策略是(SCHED_FIFO)。SCHED_FIFO(先進先出)策略按線程在執(zhí)行前在列表上存在的時間對列表上的線程進行排序。處于列表首位的線程通常為在列表上存在時間最長的線程,而處于末尾的線程在列表上存在的時間最短。此策略允許一個線程一直運行,直到具有較高優(yōu)先級的另一個線程已準備好運行,或者直到當前線程自動阻止。如果此線程被占據,它就繼續(xù)處于其線程優(yōu)先級列表的首位;如果此線程阻止,當它再次成為一個可運行的線程時,將被添加到此線程所在的優(yōu)先級列表的末尾。在本工程中,video,capture,display,audio線程分享最高優(yōu)先級,而control線程具有最低優(yōu)先級。三、應用程序設計-線程初始化清理同步說明第38頁線程的初始化和清理同步在本程序中使POSIX條件量來完成。這個在main線程中初始化。在Rendezvous模塊中:typedefstructRendezvous_Obj{intcount;pthread_mutex_tmutex;pthread_cond_tcond;}Rendezvous_Obj;用count來表示線程的總數,每初始化完一個線程的時候都使count減1表明本線程初始化完畢且等待其他線程。為了避免沖突,使用互斥量來保護對count的操作。三、應用程序設計-線程初始化清理同步說明第39頁staticinlinevoidRendezvous_meet(Rendezvous_HandlehRv){pthread_mutex_lock(&hRv->mutex);hRv->count--;if(hRv->count>0){pthread_cond_wait(&hRv->cond,&hRv->mutex);}else{pthread_cond_broadcast(&hRv->cond);}pthread_mutex_unlock(&hRv->mutex);}當所有線程都初始化完畢后,所有線程同時解鎖并開始執(zhí)行各自的主循環(huán)。對于線程完成后的清理工作也類似。這種對緩存共享的方法就不會出現一個線程對緩存操作沒有完成的情況下被其他線程訪問。三、應用程序設計-Main線程第40頁Main線程主要的任務是執(zhí)行必要初始化工作,接收命令行參數并傳遞給其他線程。如圖所示,一開始要檢測視頻標準,這個是在板子上的撥碼開關S3第10個開關,通過FBDev顯示設備驅動的FBIO_GETSTDioctl來得到。令行傳遞語法參數來設置線程環(huán)境。CodecEngine和它的TraceUtil模塊初始化來跟蹤。Pause模塊用來處理過程中的暫停,Rendezvous模塊用來同步線程的初始化和清理。最后,控制線程controlthread)ctrlThrFxn()被調用,主要main線程變成control線程。三、應用程序設計-Control線程第41頁控制線程負責用戶接口:紅外、OSD顯示菜單、OSD顯示jpeg圖片及jpeg壓縮??刂凭€程也負責更新和顯示OSD菜單。在達芬奇平臺上,OSD窗口(/dev/fb/0)在視頻顯示(/dev/fb/3)窗口的前端。而控制顯示OSD窗口透明度的是使用屬性窗口(/dev/fb/2)。在屬性窗口中,每個像素的透明度由一個元組(4bit)和它的值(0-7)來控制??刂凭€程就可以通過函數setOsdTransparency()來設置OSD窗口的透明度。Control線程的優(yōu)先級最低三、應用程序設計-Video線程第42頁該線程是算法的核心線程,完成檢測目標的任務。Video線程接收來自采集線程的每一幀緩沖區(qū),完成目標檢測后把緩沖區(qū)交給display線程的顯示設備(VPSS后端)來顯示。

三、應用程序設計-Video線程第43頁如圖10所示,video線程的初始化主要完成:創(chuàng)建CodecEngine實例(Engine_open())。這個函數返回一個句柄,算法實例化時使用這個句柄。創(chuàng)建算法用vdieoEncodeAlgCreate()。該函數調用了CCS下編寫的算法,在工具鏈(后邊詳細敘述)封裝好目標識別算法后,vdieoEncodeAlgCreate()函數中創(chuàng)建算法實例。該實例由VIDENC_create()調用。hEncode=VIDENC_create(hEngine,encoderName,¶ms);其中的參數params包含了采集視頻的一些參數。算法使用的數據暫存區(qū)和顯示使用的暫存區(qū)使用Memeory_contigAlloc()函數來申請。Capture線程使用CAP_BUFFERS個暫存區(qū)來采集數據并暫存。先使用Memeory_contigAlloc()函數來申請內存,然后把它們發(fā)送給capture線程來采集FifoUtil_put()。當video線程完成初始化后,就使用Rendezvous模塊跟其它幾個線程同步。故而,只有當所有線程都完成初始化后,video線程才會進入主循環(huán)。三、應用程序設計-Display線程第44頁單獨的顯示線程的目的是為了增加把處理和顯示分開,它主要負責把完成算法后的幀復制到FBDev顯示設備的緩沖區(qū)。它允許DSP處理和顯示同步。該線程開始執(zhí)行是通過初始化FBDev顯示設備驅動(在initDisplayDevice()函數中)。在這個函數中,顯示的分辨率(D1)和每像素比特數(16)通過FBIOPUT_VSCREENINFOioctl設置。在設置之前,三個緩沖區(qū)通過mmap()函數使它們用戶空間有效。這些緩沖區(qū)初始化為黑色,因為視頻不一定是滿的D1分辨率。然后一個Rszcopy工作要創(chuàng)建。Rszcopy模塊使用VPSSresizer模塊來圖像從源拷貝到目的地而不占用CPU時間。當display線程完成初始化后,就使用Rendezvous模塊跟其它幾個線程同步。故而,只有當所有線程都完成初始化后,display線程才會進入主循環(huán)。三、應用程序設計-Capture線程第45頁程序里可以在算法之前使用VPSSresizer模塊來除去交錯現象(blog詳述)。為了讓移除交錯現象和DSP處理同步,使用單獨的capture線程。在video線程處理算法之前,由capture線程來移除交錯現象。首先,由于平滑模塊因為插值的原因需要更多的垂直行數(EXTRA_ROWS),所以采集的行數就增加了。可是如果大于480(NTSC)或者576(PAL)是不可能的,因為480和576是最大高度,因而最定上的幾行一般在D1顯示屏上不可見。視頻采集設備通過initCaptureDevice()函數初始化。這里的視頻采集設備是Video4Linux2(v4l2)設備驅動。在這個函數里,用戶選擇輸入接頭,可以用VIDIOC_S_INPUTioctl來設置。同時視頻采集設備的能力可以通過VIDIOC_QUERYCAPioctl來改正。三、應用程序設計-Capture線程第46頁標準視頻(NTSC或PAL)通過采集設備被自動檢測。這里格式設置為D1分辨率,并且通知采集設備用VIDIOC_S_FMTioctl把兩場合成一幀(V4L2_FIELD_INTERLACED)。然后通過VIDIOC_S_CROPioctl,采集設備驅動就被設置為裁剪D1格式的圖片為用戶通過命令行輸入的分辨率。之后,通過VIDIOC_REQBUFSioctl在采集設備驅動里分配三個視頻采集緩沖區(qū),然后通過mmap()這些緩沖區(qū)就被映射到用戶處理空間。最后使用VIDIOC_STREAMONioctl來啟動采集。

三、應用程序設計-Audio線程第47頁該線程的任務是在某些情況下發(fā)出聲音。在程序中,聲音是通過讀取語音文件,之后把讀取的數據發(fā)送到聲音設備驅動。讀取聲音文件是通過fd=open(“data/alertsound.wav”,O_RDWR)完成,把讀到的數據放到inputBuffer中(m=(int)read(fd,inputBuffer,blksize);)把讀到的數據寫入聲音設備write(outputFd,outputBuffer,blksize)即可。是否發(fā)出聲音通過gblGetAudioPlay()來判斷。三、應用程序設計-線程間交互第48頁在開始主循環(huán)前,display線程占先視頻緩沖區(qū)。這保證當主循環(huán)開始的時候,所有的顯示緩沖區(qū)被display線程占用。結果就是,DSP的處理可以跟復制到顯示幀緩沖同步工作,并且系統可以從偶爾的耗時的幀恢復。幀被算法檢測后,隨后就放到顯示緩沖區(qū),并通過FifoUtil_put()發(fā)送到顯示線程。Display線程的占用通過Rendezvous來同步。三、應用程序設計-線程間交互第49頁Capture線程的主循環(huán)在一幀數據從采集設備中出列時開始,出列使用VIDIOC_DQBUFioctl,目的是video線程中的緩沖區(qū),它使用FifoUtil_get()。采集幀緩存然后根據命令行來選擇是否在把目的緩沖發(fā)送到video線程前除去交錯現象。Capture線程然后把采集視頻緩存通過VIDIOC_QBUFioctl返回給采集設備驅動。三、應用程序設計-線程間交互第50頁Video線程從capture線程接收到一幀數據并通過FifoUtil_get()從display線程得到顯示緩存。采集的幀緩存通過VIDENC_process()讓DSP處理,然后把這個緩存用FifoUtil_put()返回給capture線程。經過處理后的緩存就通過FifoUtol_put()被發(fā)送到display線程來顯示。三、應用程序設計-線程間交互第51頁Display線程通過FifoUtil_get()接收到處理過的數據,并使用VPSSresizer模塊和Rszcopy_execute()把它復制到FBDev顯示設備驅動幀緩存。當display線程完成復制緩存,它通過FBIOPAN_DISPLAYioctl在垂直同步信號來時使新的幀緩存為新的顯示緩存。然后就的帶下一個垂直同步信號(FBIO_WAITFORVSYNCioctl)。當display線程完成這些,video線程就可以處理下一幀了,這樣就使得ARM和DSP能充分利用。四、工具鏈的建立第52頁工具鏈是指的Linux下對程序的編譯環(huán)境。在這里通過codec_engine_1_02\examples\codecs下的videnc_copy工程封裝CCS下調試好的程序并生成videnc_copy.a64P,再通過codec_engine_1_02\examples\servers\video_copy工程把videnc_copy.a64P封裝成all.x64P。最后通過應用程序encodedecode工程調用all.x64P。

四、工具鏈的建立-步驟第53頁把ccs下編寫好的文件復制到Linuxcodec_engine_1_02\examples\codecs下的videnc_copy工程中。修改該工程中的package.bld文件,修改varSRCS=[“videnc_copy”,“objectrecognition”];中括號里只選擇工程下的C文件。修改該文件選擇DSP端只用cgtool來編譯。

for(vari=0;i<1/*Build.targets.length*/;i++)修改codec_engine_1_02\examples下的user.bld,把linux86注掉,選擇用C64P,跟第二步中對應。Build.targets=[//Linux86,C64P,MVArm9,四、工具鏈的建立-步驟第54頁

修改DSP算法占用的空間,修改server/all.tcf文件

修改loadmodules.shinsmoddsplinkk.koddr_start=0x8f400000ddr_size=0xA00000在videnc_copy工程文件中調用算法編譯videnc_copy生成videnc_copy.a64P修改server,編譯生成all.x64P

編譯encodedecode調用all.x64P五、Jpeg壓縮與解壓縮第55頁在本工程中用到了Jpeg的壓縮與解壓縮。這里主要使用了jpeglib庫來完成壓縮與解壓縮的任務。具體編程請參考庫的使用手冊。

六、視頻格式轉換第56頁在工程中采集的視頻是YUV422格式,Jpeg壓縮時需要RGB888格式,Jpeg解壓縮完后的格式是RGB565格式,視頻顯示的格式是YUV422,OSD顯示的格式是RGB565格式。而算法處理的數據是YCbCr格式且需要抽取單個顏色空間。所以這里需要多次的格式轉換。

(參考轉換代碼)六、視頻格式轉換-格式介紹第57頁YUV422。UYVY格式

U00Y00V00Y01U02Y02V02Y02U10Y10V10Y11U12Y12V12Y12U20Y20V20Y21U22Y22V22Y22U30Y30V30Y31U32Y32V32Y32六、視頻格式轉換-格式介紹第58頁RGB888

每格一個字節(jié).R00G00B00R01G01B01R02G02B02R03G03B03R10G10B10R11G11B11R12G12B12R13G13B13R20G20B20R21G21B21R22G22B22R23G23B23R30G30B30R31G31B31R22G32B32R33G33B33六、視頻格式轉換-格式介紹第59頁RGB565RGB5-6-5bit76543210pG2G1G0R4R3R2R1R0qB4B3B2B1B0G5G4G3六、視頻格式轉換-格式介紹第60頁4L2_PIX_FMT_RGB565

每格一個字節(jié).p00q00p01q01p02q02p03q03p10q10p11q11p12q12p13q13p20q20p21q21p22q22p23q23p30q30p31q31p32q32p33q33七、達芬奇OSD第61頁TMS320DM6446支持背景窗顏色,兩個視頻窗口,兩個OSD窗口,一個指針(cursor)窗口。它們以遞增的順序排列如圖:七、達芬奇OSD第62頁一個特有的第二個OSD窗口(OSDWIN1)可以用來配置成屬性窗口來控制視頻窗口和第一個OSD窗口(OSDWIN0)的混合(如透明度)。因為“alpha”混合功能是OSDWIN1最通用的功能,所以以下就主要討論第一個OSD窗口(OSDWIN0)用來顯示OSD圖片,以及第二個OSD窗口(OSDWIN1)用作屬性窗口來控制混合。

OSD窗口可以配置成接收RGB565或者bitmap數據。在這里把第二個OSD窗口用作屬性窗口,第一個OSD窗口使用RGB565模式

七、達芬奇OSD-菜單建立第63頁根據要求的菜單樣式,使用一個鏈表把整個菜單連接起來,在遙控器的控制通過OSD繪制當前的菜單。對任何一個菜單項來說,都有一個鏈表節(jié)點對應。鏈表的結構如下:typedefstructnode{ Intbtindex;structnode*llink,*rlink,*ulink,*dlink,*mlink;}keynode;八、插值算法第64頁工程中用到了三種插值算法,分別是最近鄰域法、線性插值法和雙立方插值算法。其中最近鄰法速度最快效果最差,線性插值法綜合效果居中,雙立方插值算法效果最好但是速度最慢。這三種算法的使用要根據算法消耗時間和效果之間取得平衡。八、插值算法-最近鄰域法第65頁最臨近插值的思想很簡單。對于通過反向變換得到的一個浮點坐標,對其進行簡單的取整,得到一個整數型坐標,這個整數型坐標對應的像素值就是目的像素的像素值,也就是說,取浮點坐標最鄰近的左上角點對應的像素值??梢?,最鄰近插值簡單且直觀,但得到的圖像質量不高。

八、插值算法-雙線性內插值第66頁對于一個目的像素,設置坐標通過反向變換得到的浮點坐標為(i+u,j+v),其中i、j均為非負整數,u、v為[0,1)區(qū)間的浮點數,則這個像素得值f(i+u,j+v)可由原圖像中坐標為(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所對應的周圍四個像素的值決定,即:f(i+u,j+v)=(1-u)(1-v)f(i,j)+(1-u)vf(i,j+1)+u(1-v)f(i+1,j)+uvf(i+1,j+1)其中f(i,j)表示源圖像(i,j)處的的像素值,以此類推。這就是雙線性內插值法。雙線性內插值法計算量大,但縮放后圖像質量高,不會出現像素值不連續(xù)的的情況。由于雙線性插值具有低通濾波器的性質,使高頻分量受損,所以可能會使圖像輪廓在一定程度上變得模糊。八、插值算法-雙三次插值算法第67頁雙立方插值算法是在水平、垂直和對角線方向對像素取樣,然后使用總顏色的加權平均值建立新像素,它是三者中運算速度最慢,但效果最佳的一種。公式如:

九、InterlacedArtifacts第68頁NTSC/PAL標準定義后,一個視頻幀分成奇偶兩場,每一場采集奇偶行。之后兩場合并形成一幀。NTSC標準,視頻幀的采集速率是30f/s,兩場之間的開始時間是16.67ms。PAL標準對應的間隔是20ms。當有快速運動的物體在場景中時,這樣的解決方法導致了隔行掃描偽像。隔行掃描包含對圖像的兩次掃描,一次掃描捕獲偶數行,另一次掃描捕獲奇數行。兩次捕獲以很小時差分隔開,然后再合在一起形成一個完整的幀。在合并這兩部分時,可能會形成隔行掃描偽信號。例如,矩形框的垂直邊緣將導致鋸齒效應。在不同時間捕獲一個運動視頻目標而產生的這種偽信號被稱為隔行掃描偽像。公式如:

隔行偽像不僅降低視覺效果,而且含有高頻噪聲,它們是逐行掃描編碼器的一個挑戰(zhàn)。九、InterlacedArtifacts第69頁如何解決隔行掃描這個缺點?一個簡單的辦法就是把原始圖像中奇場去除,并重新插值得到。這個方法的一個缺點是移除奇場導致數據量丟失,但是確很容易做到。

輸入的圖像幀數據設置為4:2:2隔行掃描格式如下圖。輸入的視頻格式是NTSCSD或者720*576每幀。輸出格式一致。

UYVY隔行掃描數據格式九、InterlacedArtifacts第70頁基本的想法是丟棄所有奇場的數據并插值它們

de-interlace九、InterlacedArtifacts第71頁使用達芬奇的Resize功能完成

VPSSresizer是達芬奇上的一個硬件,執(zhí)行多相濾波來完成圖像縮放。它可以完成1/4X到4X的縮放功能。它可以完成隔行掃描的Y/Cb/Cr4:2:2數據或者單獨的一個顏色平面,如灰度數據,單獨的RGB8:8:8數據或者Y/Cb/Cr數據。如果使用4:2:2隔行掃描格式(由UYVY格式構成)的輸入幀,分辨率為每幀720×480像素(NTSCSD)。在去隔行處理中,縮放器首先被告知輸入幀的寬度為724像素,而非實際的720像素。這是由于為準確實現1:1的縮放,DM6446處理器的水平輸入大小必須被調節(jié)為720+delta,delta由縮放器中的公式計算求得。接著,縮放器獲知間距是實際間距的兩倍寬,這樣它就可以把第一組兩個水平掃描行當作一個來接收。這使得縮放器可以在偶數行上實現1:1的水平縮放,并將奇數行丟棄(右上角)。輸入和輸出在垂直方向上尺寸分別被設定為244和480,因此縮放器執(zhí)行1:2的垂直放大以插入被丟棄的奇數行。然后縮放器被告知輸出幀的寬度是720像素,輸出間距是1440[720+(360×2)]字節(jié),從而形成一個輸出幀。十、Boot第72頁Standalone需要的工作

1.燒寫u-Boot(什么是u-boot)

2.編譯內核

3.創(chuàng)建文件系統(介紹文件系統)4.燒寫Flash

1.使用ramdisk,燒寫到norflash,文件格式ext2

2.Norboot+nandfilesystem

十、Boot-uboot第73頁U-boot

在目標板上先運行一個程序(程序在Flash中),通過這個程序以某種交互的方式從HOST將IMAGE下載到RAM中。如通過串口、USB接口、網絡接口等方式。這種方式就是bootloader的方式。十、Boot-u-boot第74頁燒寫u-BootTheflashwriter.outfileshouldberunninginTICodeComposerStudio(CCS)SoftwareRequired-U-Bootimage(e.g.file“u-boot.bin”)File“flashwriter.out”in“FlashWrite”directoryinyoursoftwaredisk-CodeComposerStudio(CCS)versionornewer-DaVinciEVMcompatibleemulatordriverforCCSSerialterminalapplicationsuchasHyperTerminal,TeraTermforMSWindows?andMinicomorC-KermitforLinux.十、Boot-u-boot第75頁燒寫u-Boot需要的硬件準備:-JTAGEmulatorconnectedtoDaVinciEVM-ConnectincludedRS323serialcableto“COM1”portofthePCworkstationand“UART0”portoftheEVM.Theterminalemulationsoftwaresetupis57600baud,8-bitdata,noparity,onestopbitandnoflowcontrol-InspectjumperJ4labeled“CS2SELECT”andmakesure“FLASH”isselected-MakesuretheredS3switchDIPposition1and2arebothsettoOFF十、Boot-u-boot第76頁燒寫u-Boot燒寫指令:1)StartCCSandloadflashwriter.out:OpentheARM-sideCCSdebugger.Fromthemenu,clickonFile->LoadProgramandopentheflashwriter.outimageasinthefollowingfigure:十、Boot-u-boot第77頁燒寫u-Boot燒寫指令:2)Loadu-boot:

-Runflashwriter.outbyeitherclickingDebug->RunorhittheF5key.Adialogboxwillshowtoaskfortheu-bootfilename.-EnterthelocalWindowspathtotheu-bootfile,suchas“c:\temp\u-boot.bin”.Itwillnowaskyouforasecondparameter,theoffset.Enter0andpressreturn.Theprocessmaytakeseveralminutes.Toverify,here’sCCSscreenaftersuccessfulcompletion:十、Boot-u-boot第78頁燒寫u-Boot十、Boot-u-boot第79頁燒寫u-Boot3)VerifythatU-Bootisworking

YoucannowturnofftheboardandremovetheJTAGcable.MakesureaRS232cableisattachedfromtheboardtoCOM1ofaPCwithaterminalemulationprogramsuchasMicrosoftWindowsXP?HyperTerminalorTeraTerm.Theterminalapplicationsettingsshouldbesetfor57600baudrate,8-bitdata,onestopbit,noparityandnoflowcontrol.Makesurethattheboardisnotturnedon.Settheredswitchinthemiddleoftheboard(S3)to1011111110(1=ON,0=OFF),checktomakesureJ4isselectingFLASHandturnontheboard.Youshouldnowbegreetedwithau-bootpromptonyourserialterminalconsoleasbelow.十、Boot-u-boot第80頁燒寫u-Boot3)VerifythatU-Bootisworking

十、Boot-編譯內核第81頁編譯內核

使用:host$makeARCH=armCROSS_COMPILE=arm_v5t_le-davinci_dm644x_defconfig命令可還原默認配置。使用makemenuconfig、host$makeARCH=armCROSS_COMPILE=arm_v5t_le-xconfig或者host$makeARCH=armCROSS_COMPILE=arm_v5t_le-gconfig來進行驅動配置。注:resizer驅動的位置在devicedrivers->characterdevices中。用root用戶進行內核編譯:host$makeARCH=armCROSS_COMPILE=arm_v5t_le-uImage,可生成uImage文件,其文件路徑為:home/avs/workdir/lsp/ti_davinci/arch/arm/boot/uImage將其拷貝到主機的/tftpboot目錄下,并使用chmoda+r/tftpboot/uImage命令修改其權限。十、Boot-編譯內核第82頁編譯一個支持NAND的新內核步驟如下:1、轉到linux內核所在目錄(LSP):cd/opt/mv_pro_4.0/montavista/pro/devkit/lsp/ti-davinci/加載linux內核配置工具:makeARCH=armCROSS_COMPILE=arm_v5t_le-xconfig2、在這個圖形工具中,可以配置需要的內核驅動。比如我們不需要硬盤支持,那就在DeviceDrivers中,3、選擇“ATA/ATAPI/MFM/RLLSupport”,不選擇主框,把該選項去掉就使得系統不包含硬盤支持而選擇支持NAND。如圖:十、Boot-編譯內核第83頁十、Boot-編譯內核第84頁4、在MemoryTechnologyDevices(MTD)選項中,找到NANDFlashDeviceDrivers選項。十、Boot-編譯內核第85頁5、保證NANDFlashDevice的選項是一個對號而不是一個點,同時選擇BootloaderupgradeonNANDDevice十、Boot-編譯內核第86頁6、在root用戶下編譯新內核:makeARCH=armCROSS_COMPILE=arm_v5t_le-uImage十、Boot-創(chuàng)建文件系統第87頁文件系統類型:Linux支持的文件系統為數眾多,如ext2、vfat、proc、nfs、iso9660等,在嵌入式領域中有Romfs、Cramfs、jffs、jffs2等。十、創(chuàng)建文件系統-RAMdisk第88頁Ramdisk就是將內存的一部分分配為一個分區(qū)并作為硬盤來使用。對于系統運行時不斷使用的程序,將它們放在Ramdisk中將加快計算機的操作,如大數據量的網絡服務器、無盤工作站等。一個初始化好的RAMdisk依賴于bootloader(u-boot)在啟動時把它從非易失性存儲器(如NORflash)下載到易失性存儲器中(如DDR)。在RAMdisk中的文件系統是一個初始化的RAM文件系統,或者initrd。這個文件系統可以掛載為跟文件系統并且應用程序可以從它這里執(zhí)行。為了節(jié)省時間,可以使用DVEVM提供的RAMdisk。它在/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/images下。在這里,RAMdisk文件是ramdisk.gz(大約2.1MB)。運行時,占用DDR大約6.3MB。

十、創(chuàng)建文件系統-RAMdisk第89頁創(chuàng)建Ramdisk步驟:1、進入/mnt工作目錄,建立需要的目錄 $mkdirrdmnt

//新ramdisk掛載的目錄

$mkdirrdimg

//產生的鏡像文件的目錄

$mkdirrdold

//ramdisk舊文件目錄

$mkdirrdold/tmp

//掛載舊ramdisk的目錄2、掛載舊的ramdisk $mount-olooprdold/ramdisk

rdold/tmp3、建立新的ramdisk,并初始化 $ddif=/dev/zeroof=rdimg/ramdisk.imgbs=1kcount=15360

//建立了一個15M的ramdisk鏡像文件,并用/dev/zero設備初始化4、為鏡像文件建立文件系統 $mke2fs-F-v-m0rdimg/ramdisk.img5、掛載新的ramdisk,如果有文件ramdisk.gz先解壓 $mount-olooprdimg/ramdisk.imgrdmnt6、拷貝需要的文件進入新的ramdisk $cp-avrdold/tmp/*rdmnt十、創(chuàng)建文件系統-RAMdisk第90頁6、拷貝需要的文件進入新的ramdisk$cp-avrdold/tmp/*rdmnt7、卸載舊的ramdisk$umountrdold/tmp8、卸載新的ramdisk$umountrdmnt9、把新的ramdisk制成壓縮包$gzip-9rdimg/ramdisk.imgramdisk.gz在此ramdisk.gz即為新建立的ramdisk鏡像十、創(chuàng)建文件系統-RAMdisk第91頁6、拷貝需要的文件進入新的ramdisk$cp-avrdold/tmp/*rdmnt7、卸載舊的ramdisk$umountrdold/tmp8、卸載新的ramdisk$umountrdmnt9、把新的ramdisk制成壓縮包$gzip-9rdimg/ramdisk.imgramdisk.gz在此ramdisk.gz即為新建立的ramdisk鏡像十、創(chuàng)建文件系統-制作jffs2鏡像第92頁JFFS2是瑞典Axis公司開發(fā)的一種基于Flash的日志文件系統。它也是可壓縮的,但壓縮比不及Cramfs的高。但是,它相比于Cramfs的明顯優(yōu)勢是可讀寫。另外JFFS2具有碎片收集功能,并提供崩潰/掉電安全保護,所有這些特點使它成為目前Flash設備上最流行的文件系統格式。它的缺點是當文件系統已滿或接近滿時,JFFS2運行會變慢,這是因為碎片收集的問題。十、創(chuàng)建文件系統-制作jffs2鏡像第93頁制作jffs2鏡像步驟:mkfs.jffs2–rfilename–oimage.img–-eraseblock=0x8000–size=0x0200–pad=0x1400000實際用到了:mkfs.jffs2–rram1–oimage.img-e0x8000-s0x0200

十、boot方式第94頁方案一:使用ramdisk,燒寫到norflash,文件格式ext2方案二:Norboot+nandfilesystem十、boot方式-方案一第95頁說明:跳線選擇12連通其它都不連接

Copythekernelimagein/tftpbootdirectory:

host$cp~workdir/lsp/ti-davinci/arch/arm/boot/uImage/tftpbootCopytheinitialRAMdiskfilesystemin/tftpbootdirectory:

host$cp/mnt/def_cd/ramdisk.gz/tftpboot/DownloadtheLinuxkernelviaTFTP:

DVEVM#setenvserverip<tftpserveripaddress>DVEVM#setenvbootfileuImageDVEVM#dhcpDownloadtheRAMdiskfilesystemviaTFTP:

DVEVM#tftp0x85000000ramdisk.gzDeterminethelocationinflashtostoreimage:

EVM#flinfo十、boot方式-方案一第96頁Erasetheflash:

DVEVM#protectoff0x2050000+0x2FBCA3CopyfromRAMintoflash:

DVEVM#cp.b0x807000000x20500000xc9224

DVEVM#cp.b0x850000000x21192240x232a7fProtecttheflashfromwriting:

DVEVM#protecton0x2050000+0x2FBCA39.SettheU-BootCommandandLinuxKernelCommandLine:DVEVM#setenvbootargsconsole=ttyS0,115200n8ip=dhcproot=/dev/ram0rwinitrd=0x85000000,6MDVEVM#setenvbootcmd‘cp.b0x21192240x850000000x232a7f;bootm0x20500000’10.Now,thesystemisreadytoboot,sosavetheu-bootenvironmentvariable:DVEVM#saveenvDVEVM#boot十、boot方式-方案一第97頁Linux現在就可以從flash上啟動,并且根文件系統被掛載到/dev/ram0上。在16MNORflash存儲器上,u-boot、rootfilesystem和壓縮的RAMdisk如表分布。十、boot方式-方案二第98頁Norboot+nandfilesystem

1、硬件環(huán)境:跳線要正確2、軟件環(huán)境內核路徑:主機上的/home/wangxw/montavista/pro/devkit/lsp/ti-davinci下encodedecoded程序相應的程序和工具: 自啟動文件系統映像:jffs2_auto.img3、內核配置十、boot方式-方案二第99頁DHCP配置支持自啟動的內核需要關閉DHCP相關選項,以實現在內核啟動時不自動發(fā)出DHCP請求,選項如圖所示:十、boot方式-方案二第100頁NFS配置支持JFFS2文件系統自啟動的內核,需要關閉NFS相關選項,選項如下圖所示:如果需要打開NFS,選項如下圖所示:十、boot方式-方案二第101頁4、文件系統網絡配置修改/etc/network/interfaces腳本,如下,設置的IP地址為

autoeth0ifaceeth0inetstaticaddressnetmasknetwork#optionalbroadcast55#optionalgateway9十、boot方式-方案二第102頁移植encodedecoded可執(zhí)行環(huán)境到jffs2文件系統中:建立/opt/demo文件夾添加/opt/demo需要的文件

all.x64P,data文件夾(alertsound.wav),dsplinkk.ko,loadmodules.sh,unloadmodules.sh,cmemk.ko,davinci_rsz_driver.koencodedecoded,文件(附測試文件:loopbackCombo.x64P,videoloopd)建立一個startmy.sh文件,內容如下:#!/bin/sh#scripttostartmyprogram:encodedecodedecho"Startencodedecodeprogram..."LD_LIBRARY_PATH=/opt/demomount-tvfat/dev/sda1/mnt/usbcd/opt/demo./loadmodules.sh./encodedecoded十、boot方式-方案二第103頁把startmy.sh文件復制到

cpstartmy.sh/mnt/def_cd/ram0/etc/init.d修改屬性:

chmod+x/mnt/def_cd/ram0/etc/init.d/startmy.sh為該文件建立鏈接

host$cd/mnt/def_cd/ram0/etc/rc.d/rcS.dhost$ln–s../init.d/startweb.shS42startweb7.添加需要的庫文件以及鏈接libfreetype.so.6.3.7libjpeg.so.62.0.0libpng.so.3.0.0libpthread-0.10.solibz.so.等,并為它們建立鏈接

例如:ln–slibfreetype.so.6.3.7libfreetype.so.6根據encodedecoded文件需要的庫及鏈接都添加到/lib下十、boot方式-方案二第104頁5、配置encodedecoded自啟動

將需要執(zhí)行的程序寫入腳本:/etc/rc.d/rc.local,能夠實現linux啟動之后自動運行所需程序注意:運行程序中如果有讀文件寫文件等涉及路徑的操作,需要給出根文件系統下的絕對路徑.十、boot方式-方案二第105頁6、制作jffs2鏡像進入/home/wangxw/workdir/flash_fs/修改fs_source_pppoe/etc/network/interfaces和interfaces.static文件,將ip地址字段改為需要的數字(二者的ip地址要相同);制作鏡像: mkfs.jffs2–rfilename–oimage.img–-eraseblock=0x8000–size=0x0200–pad=0x1400000實際用到了: mkfs.jffs2–rram1–oimage.img-e0x8000–-s0x0200十、boot方式-方案二第106頁7、BootloaderUboot的啟動參數配置如下:bootdelay=3baudrate=115200bootcmd=bootm02100000ethaddr=00:0E:99:FF:FF:AAbootfile=uImage_newboard_nfsbootargs=console=ttyS0,115200n8root=/dev/mtdblock0rwrootfstype=jffs2mem=34Meth=00:0E:FF:FF:FF:aastdin=serialstdout=serialstderr=serial實際配置啟動:setenvbootargsconsole=ttyS0,57600n8video=dm64xxfb:interface=composite:mode=palnoinitrdrwroot=/dev/mtdblock0rwrootfstype=jffs2mem=112Meth=00:0E:FF:FF:FF:85ip=9十、boot方式-方案二第107頁8、下載燒寫內核內核(NORFlash)燒寫過程:DaVinciEVM#tftpboot0x80700000uImage_newboardDaVinciEVM#erase0x02100000+X(注釋:X為uImage_newboard的大小)DaVinciEVM#cp.b0x807000000x02100000X(注釋:X值同上)

十、boot方式-方案二第108頁9、NANDjffs2文件系統燒寫過程方法一EVM板啟動參數設為nfs啟動方式,啟動參數為:console=ttyS0,115200n8noinitrdrwip=dhcproot=/dev/nfsnfsroot=46:/home/wangxw/workdir/filesys,nolockmem=34M。用root登錄之后,出現命令輸入提示符:#cat/proc/mtd#flash_eraseall-j/dev/mtd0#nandwrite-j-p/dev/mtd0/opt/wugh/allen_jffs2.img方法二用uboot的命令燒寫,方法如同燒寫內核十一、聲音編程第109頁OSS(OpenSoundSystem),它由一套完整的內核驅動程序模塊組成,可以為絕大多數聲卡提供統一的編程接口。編程接口:如何對各種音頻設備進行操作是在Linux上進行音頻編程的關鍵,通過內核提供的一組系統調用,應用程序能夠訪問聲卡驅動程序提供的各種音頻設備接口,這是在Linux下進行音頻編程最簡單也是最直接的方法。十一、聲音編程-編程接口第110頁open系統調用訪問音頻設備read系統調用系統調用open可以獲得對聲卡的訪問權,同時還能為隨后的系統調用做好準備,其函數原型如下所示:intopen(constchar*pathname,intflags,intmode);系統調用read用來從聲卡讀取數據,其函數原型如下所示:intread(intfd,char*buf,size_tcount);十一、聲音編程-編程接口第111頁write系統調用訪問音頻設備ioctl系統調用系統調用write用來向聲卡寫入數據,其函數原型如下所示:size_twrite(intfd,constchar*buf,size_tcount);

系統調用ioctl可以對聲卡進行控制,凡是對設備文件的操作不符合讀/寫基本模式的,都是通過ioctl來完成的,它可以影響設備的行為,或者返回設備的狀態(tài),其函數原型如下所示:intioctl(intfd,intrequest,...);

十一、聲音編程-編程接口第112頁close系統調用訪問音頻設備當應用程序使用完聲卡之后,需要用close系統調用將其關閉,以便及時釋放占用的硬件資源,其函數原型如下所示:intclose(intfd);

十一、聲音編程-編程接口第113頁音頻設備文件對于Linux應用程序員來講,音頻編程接口實際上就是一組音頻設備文件,通過它們可以從聲卡讀取數據,或者向聲卡寫入數據,并且能夠對聲卡進行控制,設置采樣頻率和聲道數目等等。/dev/dsp

聲卡驅動程序提供的/dev/dsp是用于數字采樣(sampling)和數字錄音(recording)的設備文件,它對于Linux下的音頻編程來講非常重要:向該設備寫數據即意味著激活聲卡上的D/A轉換器進行放音,而向該設備讀數據則意味著激活聲卡上的A/D轉換器進行錄音。目前許多聲卡都提供有多個數字采樣設備,它們在Linux下可以通過/dev/dsp1等設備文件進行訪問。

十一、聲音編程-應用框架第114頁DSP編程對聲卡進行編程時首先要做的是打開與之對應的硬件設備,這是借助于open系統調用來完成的,并且一般情況下使用的是/dev/dsp文件。inthandle=open("/dev/dsp",O_WRONLY);if(handle=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論