V4L2文件翻譯(八)

2021-06-21 12:49:01 字數 4645 閱讀 6404

struct v4l2_pix_format型別

成員名描述

__u32

width

寬度(畫素)

__u32

height

高度(畫素),若field是v4l2_field_top、v4l2_field_bottom、v4l2_field_alternate之一那麼高度指的是此區域的行數,否則的話指的是此幀的行數(是區域高度的兩倍,因為是隔行掃瞄)

__u32

pixelformat

畫素格式或壓縮型別,由應用程式設定

enum v4l2_field

field

__u32

bytesperline

兩個相鄰線最左邊的畫素相隔幾個位元組

__u32

sizeimage

驅動設定的一張完整在快取中占用多少個位元組,通常等於bytesperline乘以height。若影象由多種長度壓縮資料組成,這個值就是處理一張的最大位元組數

enum v4l2_colorspace

colorspace

這是pixelformat的補充,驅動必須為捕捉流進行設定,輸出流要被應用程式設定

__u32

priv

關於格式的自定義保留位,若驅動和應用程式都不使用必須將其設定為0

結構體v4l2_plane_pix_format定義了多面格式中每個面的尺寸和布局,v4l2_pix_format_mplane結構體是v4l2_plane_pix_format結構體的集合,包含了所有面的資訊。

struct v4l2_plane_pix_format型別

成員名描述

__u32

sizeimage

一面的影象資料最大多少個位元組

__u16

bytesperline

兩相鄰線最左邊畫素位元組距離

__u16

reserved[7]

保留位,應置0

struct v4l2_pix_format_mplane型別

成員名描述

__u32

width

影象寬度,畫素單位

__u32

height

影象高度,畫素單位

__u32

pixelformat

畫素格式,單平面和多平面的fourcc都可以

enum v4l2_field

field

見struct v4l2_pix_format

enum v4l2_colorspace

colorspace

見struct v4l2_pix_format

struct v4l2_plane_pix_format

plane_fmt[video_max_planes

描述每個平面的結構體集合,有效數量放在num_planes中

__u8

num_planes

平面數量

__u8

reserved[11]

保留位,應用應將其置0

為了在驅動和應用程式之間交換影象資料,在兩邊都有標準影象資料是很有必要的。v4l2包含了一些格式,這一章節就來清晰的介紹一下v4l2中支援的標準影象格式。

儘管如此,最終還是需要一些標準格式的,所以v4l2需要相容一些較好的標準格式。

v4l2標準主要是非壓縮格式,在記憶體中,畫素通常是以從左到右,從上到下的方式進行排列的。快取的第乙個位元組資料一般在最上邊的最左的畫素中,然後依次向右,直到最定行的最後乙個畫素。行中最右邊的畫素可能是0,或是填充資料以為了保證每行畫素資料都對齊。在對齊資料後,若有的話,是第二行最左側的畫素資料,依此類推。最後一行也像其他行一樣有一些填充資料。

在v4l2中每個格式都是pix_fmt_***的格式,他們定義在videodev.h標頭檔案中。同樣也列舉除了fourcc的定義,但是他們卻與windows世界的不同。

對於一些格式來說,資料被儲存在隔開的、不連續的記憶體緩衝中。這些格式有些是fourcc,以及多平面格式。比如,yuv422幀通常儲存在乙個記憶體緩衝中,但是還可以放到兩個或三個分開的緩衝中,2平面版本中y部分乙個緩衝,cbcr部分在另乙個,或3平面版本中每個部分乙個緩衝。這些自快取就被視作「面」。

介紹伽馬校正(顏色灰度校正)

e'r = f(r)

e'g = f(g)

e'b = f(b)

亮度構造和顏色差異訊號

e'y = coeffr e'r + coeffg e'g + coeffb e'b

(e'r - e'y) = e'r - coeffr e'r - coeffg e'g - coeffb e'b

(e'b - e'y) = e'b - coeffr e'r - coeffg e'g - coeffb e'b

規範化顏色差異訊號

顏色差異訊號縮減範圍[-0.5;+0.5]

kb = 0.5 / (1 - coeffb)

kr = 0.5 / (1 - coeffr)

pb = kb (e'b - e'y) = 0.5 (coeffr / coeffb) e'r + 0.5 (coeffg / coeffb) e'g + 0.5 e'b

pr = kr (e'r - e'y) = 0.5 e'r + 0.5 (coeffg / coeffr) e'g + 0.5 (coeffb / coeffr) e'b

量化

y' = (lum. levels - 1) · e'y + lum. offset

cb = (chrom. levels - 1) · pb + chrom. offset

cr = (chrom. levels - 1) · pr + chrom. offset

在[0;255]範圍內捨入為最接近的整數,最終形成yuv的y'cbcr格式。

例2.1 itu-r rec. bt.601顏色轉換

to yuv

int er, eg, eb;         /* gamma corrected rgb input [0;255] */

int y1, cb, cr; /* output [0;255] */

double r, g, b; /* temporaries */

double y1, pb, pr;

intclamp (double x)

r = er / 255.0;

g = eg / 255.0;

b = eb / 255.0;

y1 = 0.299 * r + 0.587 * g + 0.114 * b;

pb = -0.169 * r - 0.331 * g + 0.5 * b;

pr = 0.5 * r - 0.419 * g - 0.081 * b;

y1 = clamp (219 * y1 + 16);

cb = clamp (224 * pb + 128);

cr = clamp (224 * pr + 128);

或更簡短些

y1 = 0.299 * er + 0.587 * eg + 0.114 * eb;

y1 = clamp ( (219 / 255.0) * y1 + 16);

cb = clamp (((224 / 255.0) / (2 - 2 * 0.114)) * (eb - y1) + 128);

cr = clamp (((224 / 255.0) / (2 - 2 * 0.299)) * (er - y1) + 128);

反向轉換

int y1, cb, cr;         /* gamma pre-corrected input [0;255] */

int er, eg, eb; /* output [0;255] */

double r, g, b; /* temporaries */

double y1, pb, pr;

intclamp (double x)

y1 = (y1 - 16) / 219.0;

pb = (cb - 128) / 224.0;

pr = (cr - 128) / 224.0;

r = 1.0 * y1 + 0 * pb + 1.402 * pr;

g = 1.0 * y1 - 0.344 * pb - 0.714 * pr;

b = 1.0 * y1 + 1.772 * pb + 0 * pr;

er = clamp (r * 255); /* [ok? one should prob. limit y1,pb,pr] */

eg = clamp (g * 255);

eb = clamp (b * 255);

表2.5 索引格式定義

碼byte 0

v4l2_pix_fmt_pal8

"pal8"

i7 i6 i5 i4 i3 i2 i1 i0

V4L2文件翻譯(一)

相關資料 裝置命名 每乙個驅動註冊乙個或多個裝置節點後他們的主裝置號都是81,而子裝置號在0 255之間。除非通過config video fixed minor ranges編譯選項編譯核心,否則子裝置號是動態分配的。而且,子裝置號分配範圍與裝置節點型別有關 video radio等 很多驅動支援...

V4L2文件翻譯(三)

裝置通常有一些使用者可設定的控制器,如亮度和飽和度等等一些會展示在圖形使用者介面的東西。但不同裝置會有不同的可用設定,而且此外其可設定值範圍 預設值在不同裝置上也不盡相同。控制ioctl提供創造乙個良好使用者介面的資訊和機制,這會讓這些控制器在任何裝置上都能正確的工作。所有控制器都需通過id值進行訪...

V4L2文件翻譯(一)

裝置命名 每乙個驅動註冊乙個或多個裝置節點後他們的主裝置號都是81,而子裝置號在0 255之間。除非通過config video fixed minor ranges編譯選項編譯核心,否則子裝置號是動態分配的。而且,子裝置號分配範圍與裝置節點型別有關 video radio等 很多驅動支援通過vid...