1. 程式人生 > >結合晶片exynos 4412介紹V4L2用來視訊編解碼的驅動

結合晶片exynos 4412介紹V4L2用來視訊編解碼的驅動

這裡結合晶片exynos 4412介紹一下V4L2用來視訊編解碼的驅動結構
核心程式碼基於3.4.106
 linux-3.4.106\drivers\media\video\s5p-mfc
 linux-3.4.106\drivers\media\video

1,V4L2結構


2,幾個主要介面
主要介面(ioctl下面的一層)
vidioc_qbuf
vidioc_dqbuf
vidioc_reqbufs
vidioc_s_fmt


3,主要資料結構
struct vb2_queue
struct v4l2_buffer
struct s5p_mfc_ctx
struct vb2_buffer
4,介面呼叫鏈


V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE是未解碼資料,存放ES流資料
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE是已經解碼資料,存放frame data buffer

v4l2_qbuf流程

vidioc_qbuf--vb2_qbuf

---  __enqueue_in_driver

----  q->ops->buf_queue(vb);

----  s5p_mfc_buf_queue

----   list_add_tail(&mfc_buf->list, &ctx->dst_queue);

----    s5p_mfc_try_run


v4l2_dqbuf流程


解出來一幀:

s5p_mfc_irq

---   s5p_mfc_handle_frame

---   s5p_mfc_handle_frame_new

---  vb2_buffer_done

---    wake_up(&q->done_wq);

----   list_add_tail(&vb->done_entry, &q->done_list); 把解出來的一幀掛上佇列

vidioc_dqbuf

---  vb2_dqbuf

---  __vb2_get_done_vb

---  __vb2_wait_for_done_vb(查詢是否有可用的vb)

---   wait_event_interruptible(q->done_wq,





5,記憶體管理方式

主要佇列:
分為capture plane(解碼後)和output plane(解碼前)

從另外一個維度看,
每個plane都有一個done_list佇列,表示解碼完比的,不用的ES buffer,或者存有有效YUV資料的Frame data buffer,使用者態dqbuffer就從這裡面取
每個plane都有一個另外的queue佇列,表示要解碼的ES buffer,或者已經顯示完畢的YUV資料的Frame data buffer,使用者態qbuffer就從這裡取

v4l2-core操作的是vb2-buffer,  這只是個handle而已,實際給MFC的是5p_mfc_buf , 這兩種buffer通過v4l2-buffer裡面的index來對應起來









初始化分配 input buffer:

vidioc_reqbufs

----vb2_reqbufs

----__vb2_queue_alloc(掛到q->bufs)

---__vb2_buf_mem_alloc

---- call_memop(q, alloc, q->alloc_ctx[plane]

----vb2_dma_contig_alloc

----dma_alloc_coherent分配dmabuffer

----  call_qop(q, buf_init, vb);

---  s5p_mfc_buf_init(相關資訊填充到 ctx->src_bufs[i])    這裡申請的記憶體,存放解嗎前的資料

初始化分配 out buffer

vidioc_reqbufs

----vb2_reqbufs

----__vb2_queue_alloc(掛到q->bufs)

---__vb2_buf_mem_alloc

---- call_memop(q, alloc, q->alloc_ctx[plane]

--- vb2_dma_contig_alloc

----dma_alloc_coherent分配dmabuffer

---- call_qop(q, buf_init, vb);

---s5p_mfc_buf_init(相關資訊填充到 ctx->src_bufs[i]) 這裡申請的記憶體,存放解碼完的資料

分配buffer給mfc用

vidioc_reqbufs---s5p_mfc_alloc_codec_buffers---vb2_dma_contig_alloc //分配buffer給mfc用。



中斷處理流程

s5p_mfc_irq

---s5p_mfc_handle_seq_done

---s5p_mfc_try_run

----s5p_mfc_set_dec_frame_buffer

---mfc_write(dev, OFFSETA(ctx->dst_bufs[i].cookie.raw.chroma),S5P_FIMV_DEC_CHROMA_ADR + i * 4);

把所有out buffer的地址寫進MFC

---s5p_mfc_set_dec_stream_buffer

---把此次要解碼的原始資料in buffer地址寫進MFC



有效資料存在哪裡?

解碼前的和解碼後的,都在vb->planes[plane].mem_priv裡面,這個mem_priv是struct vb2_dc_buf ,裡面記錄了這塊DMA記憶體的虛擬地址和實體地址,都是在vidioc_reqbufs----vb2_reqbufs----__vb2_queue_alloc(掛到q->bufs)---__vb2_buf_mem_alloc---- call_memop(q, alloc, q->alloc_ctx[plane]---------vb2_dma_contig_alloc的時候記錄好的。
然後這些記憶體的實體地址,在vidioc_reqbufs----vb2_reqbufs----__vb2_queue_alloc(掛到q->bufs)--> call_qop(q, buf_init, vb);--->s5p_mfc_buf_init時候,賦給了ctx->dst_bufs[i].cookie.raw.luma (解碼後)   ctx->dst_bufs[i].cookie.raw.chroma(解碼後)    ctx->src_bufs[i].cookie.stream ,(解碼前)
然後這些地址,在s5p_mfc_set_dec_stream_buffer   ,s5p_mfc_set_dec_frame_buffer時候寫進了暫存器,告訴MFC具體地址




Mmap/ querybuf
s5p_mfc_mmap通過(offset 與 DST_QUEUE_OFF_BASE)來判斷是vq_src還是vq_dst ,這個offset是querybuf的時候填上buf->m.planes[i].m.mem_offset的。
buf->m.planes[i].m.mem_offset 是__vb2_queue_alloc裡面__setup_offsets的時候,為每個plane的記憶體寫上的vb->v4l2_planes[plane].m.mem_offset = off;  這個mem_offset實際上沒什麼用。實際上就是個標誌位。就是為了mmap的時候能通過這個mem_offset找到每個plane的記憶體__find_plane_by_offset
這樣s5p_mfc_mmap裡面通過這個offset判斷是ctx->vq_src還是ctx->vq_dst,然後呼叫vb2_mmap,通過__find_plane_by_offset找到對應vb2_buffer和vb2_buffer裡面的plane,然後通過相應的vb->planes[plane].mem_priv,就可以呼叫vb2_dma_contig_mmap---remap_pfn_range呼叫標準核心API來mmap了
實際上整個mmap的過程就是找到對應的buffer和plane,一個個的mmap的



6 ,編解碼引數設定在那裡?


vidioc_s_fmt裡面通過fmt = find_format(f, MFC_FMT_DEC);找到static struct s5p_mfc_fmt formats[]裡面對應的要解碼的格式,然後對struct s5p_mfc_ctx *ctx進行賦值,以便後面使用

V4L2最終要通過對MFC的暫存器讀寫來控制解碼過程

1,啟動需要操作的暫存器
MFC poweron 
clk
載入韌體
重啟MFC
判斷韌體版本
為兩個plane分配記憶體
初始化各種等待,以及資料佇列

2,開始播放需要的暫存器

s5p_mfc_run_init_dec
分配一個tmp buffer,給MFC用
設定sharememory
設定slice,delay之類的
設定第一幀
 
3,播放一幀:
s5p_mfc_run_dec_frame
設定ES流資料的地址和size
告訴MFC哪些buffer不能用
設定第一幀還是中間真還是最後一針























相關推薦

結合晶片exynos 4412介紹V4L2視訊解碼驅動

這裡結合晶片exynos 4412介紹一下V4L2用來視訊編解碼的驅動結構核心程式碼基於3.4.106 linux-3.4.106\drivers\media\video\s5p-mfc linux-3.4.106\drivers\media\video 1,V4L2結構

ffmpeg進行編碼解碼,live555進行傳輸rtsp、rtp

本文概要:                 本文介紹了一種常用成熟的多媒體解碼方案。使用live555作為流媒體資料來源,建立rtsp會話請求h264資料流。後端使用ffmpeg解碼h264流並儲存為yuv420格式。                 該方案比較成熟,可

使用ffmpeg進行音視訊解碼到的函式介紹

/** * Initialize libavcodec. * If called more than once, does nothing. * * @warning This function must be called before any other libavcodec * funct

盤點幾個在手機上可以學習程的軟件

管理 評論 apt 搜索下載 打卡 school shell 編譯器 自動補全 前天在悟空問答的時候,很榮幸被邀請參加回答“在手機上可以用來學習編程的軟件有哪些?”這個問題,當時在回答的首頁看到一個頭條大微(小小猿愛嘻嘻)的回答,覺得十分受用,在此將

即時通訊音視訊開發(四):視訊解碼之預測技術介紹

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(二):視訊編解碼之數字視訊介紹》 《即時通訊音

即時通訊音視訊開發(二):視訊解碼之數字視訊介紹

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 本文是系列文章中的第2篇,本系列文章的大綱如下:   《即時

幾個開源的視訊解碼介紹

  排名分先後。 一、ffmpeg     ffmpeg屬於GPL或者LGPL,確切屬於哪一種,要根據編譯選項,因為它裡面的庫有些屬於GPL的有些屬於LGPL的,你編譯的時候開啟或者關閉這些庫的選項,就決定了它屬於哪一種。 http://www.ffm

視訊解碼的理論和實踐1:基礎知識介紹

近幾年,視訊編解碼技術在理論及應用方面都取得了重大的進展,越來越多的人想要了解編解碼技術。因此,網易雲信研發工程師為大家進行了歸納梳理,從理論及實踐兩個方面簡單介紹視訊編解碼技術。 相關閱讀推薦 1、視訊介紹 視訊的本質是影象序列,根據視覺暫留的原理

常用視訊格式與視訊解碼標準介紹

【常用視訊格式】細細算起來,視訊檔案可以分成兩大類:其一是影像檔案,比如說常見的VCD便是一例。其二是流式視訊檔案,這是隨著國際網際網路的發展而誕生的後起視訊之秀,比如說線上實況轉播,就是構架在流式視訊技術之上的。流式視訊(Streaming Video)採用一種“邊傳邊播

分散式之Netty介紹與實戰(四)--Netty解碼程式設計實戰

目錄 分散式之Netty介紹與實戰(一)–Java IO與NIO 分散式之Netty介紹與實戰(二)–Netty程式設計實踐 分散式之Netty介紹與實戰(三)–Netty執行緒模型解析 分散式之Netty介紹與實戰(四)–Netty編解碼程式設計實戰

各種音訊視訊解碼詳細介紹

媒體業務是網路的主要業務之間。尤其移動網際網路業務的興起,在運營商和應用開發商中,媒體業務份量極重,其中媒體的編解碼服務涉及需求分析、應用開發、釋放license收費等等。最近因為專案的關係,需要理清媒體的codec,比較搞的是,在豆丁網上看運營商的規範 標準,同一運營商同樣的業務在不同文件中不同

開源的視訊解碼介紹

一、ffmpeg     ffmpeg屬於GPL或者LGPL,確切屬於哪一種,要根據編譯選項,因為它裡面的庫有些屬於GPL的有些屬於LGPL的,你編譯的時候開啟或者關閉這些庫的選項,就決定了它屬於哪一種。http://www.ffmpeg.org/legal.html

視訊解碼問題:javaCV如何快速進行音訊預處理和解複解碼(基於javaCV-FFMPEG)

前言: 前面我用了很多章實現了javaCV的基本操作,包括:音視訊捕捉(攝像頭視訊捕捉和話筒音訊捕捉),推流(本地音視訊或者攝像頭話筒混合推流到伺服器),轉流(rtsp->rtmp),收流(錄製)。 序: 我們知道javaCV中編碼需要先取到一幀取樣的音訊(即取樣

exynos 4412 電源管理晶片PMIC 的配置及使用方法

轉載:http://www.cnblogs.com/humaoxiao/p/4267614.html/********************************************************************************* @author    Maoxiao Hu*

exynos 4412 電源管理晶片PMIC 的配置及使用方法

/** ****************************************************************************** * @author    Maoxiao Hu * @version   V1.0.0 * @date       Feb-2015 *****

淺析在QtWidget中自定義Model(beginInsertRows()和endInsertRows()是空架子,類似於一種信號,通知底層)

cti ron 初學者 開發 http 沒有 insert ati 學習 Qt 4推出了一組新的item view類,它們使用model/view結構來管理數據與表示層的關系。這種結構帶來的功能上的分離給了開發人員更大的彈性來定制數據項的表示,它也提供一個標準的model接

寫了一個簡單的Linux Shell下載文件

logs -- spi http col 內容 style bre shell #!/bin/sh for (( i=0; i<30; i=i+1 )); do # 利用spider來探測請求的資源是否存在,並把請求的結果寫入到一個文件 wget -

gulp是幹什麽的?(概念)

blank 頭部 ins get keyword pro lin 分鐘 校驗 當我們在使用gulp的時候,gulp到底用來幹什麽呢? 編譯 sass 合並優化壓縮 css 校驗壓縮 js 優化圖片 添加文件指紋(md5) 組件化頭部底部(include html) 實

IOS PushMeBaby(是一款測試ANPs的開源Mac項目)

cnblogs color ont log span 開源 接下來 font 註釋 ● PushMeBaby是一款用來測試ANPs的開源Mac項目 ● 它充當了服務器的作用,用法非常簡單 ● 它負責將內容提交給蘋果的APNs服務器,蘋果的APNs服務器再將內容推送給用戶

webform復合控件以及做年月日選擇日期的DropDownList控件

.cn 清除 tro cti run horizon lis document 重新 自動提交(不用刷新)的屬性: AutoPostBack="True" 1、RadioButtonList 單選集合 -屬性:RepeatDirection:Vertical (垂