2.1. 單平面格式結構

type v4l2_pix_format
struct v4l2_pix_format

__u32

width

影像寬度,以畫素為單位。

__u32

height

影像高度,以畫素為單位。如果 fieldV4L2_FIELD_TOPV4L2_FIELD_BOTTOMV4L2_FIELD_ALTERNATE 之一,則高度指的是場中的行數,否則指的是幀中的行數(對於隔行掃描格式,幀中的行數是場高度的兩倍)。

應用程式設定這些欄位來請求影像大小,驅動程式返回最接近的可能值。對於平面格式,widthheight 應用於最大的平面。為了避免歧義,驅動程式必須返回四捨五入為任何較小平面縮放因子的倍數的值。例如,當影像格式為 YUV 4:2:0 時,widthheight 必須是 2 的倍數。

對於在流中包含解析度資訊編碼的壓縮格式,當饋送到有狀態 mem2mem 解碼器時,這些欄位可能為零,以依賴解碼器來檢測正確的值。有關更多詳細資訊,請參見記憶體到記憶體有狀態影片解碼器介面和格式描述。

對於有狀態 mem2mem 編碼器的 CAPTURE 側的壓縮格式,這些欄位必須為零,因為編碼大小預計將由編碼器本身根據 OUTPUT 側在內部計算。有關更多詳細資訊,請參見記憶體到記憶體有狀態影片編碼器介面和格式描述。

__u32

pixelformat

畫素格式或壓縮型別,由應用程式設定。這是一個小端 四字元程式碼。V4L2 在 RGB 格式中定義標準 RGB 格式,在 YUV 格式中定義 YUV 格式,並在 保留影像格式中定義保留程式碼

__u32

field

場序,來自列舉 v4l2_field。影片影像通常是隔行掃描的。應用程式可以請求僅捕獲或輸出頂部或底部場,或者以交錯方式或順序儲存在一個緩衝區中,或在單獨的緩衝區中交替儲存的兩個場。驅動程式返回實際選擇的場序。有關場的更多詳細資訊,請參見場序

__u32

bytesperline

兩個相鄰行中最左側畫素之間的距離,以位元組為單位。

應用程式和驅動程式都可以設定此欄位以請求在每行末尾新增填充位元組。但是,驅動程式可能會忽略應用程式請求的值,返回 width 乘以每個畫素的位元組數或硬體所需的更大值。這意味著應用程式只需將此欄位設定為零即可獲得合理的預設值。

影片硬體可能會訪問填充位元組,因此它們必須位於可訪問的記憶體中。考慮影像的最後一行之後的填充位元組跨越系統頁面邊界的情況。輸入裝置可能會寫入填充位元組,該值未定義。輸出裝置忽略填充位元組的內容。

當影像格式為平面時,bytesperline 值應用於第一個平面,並按與其他平面的 width 欄位相同的因子進行劃分。例如,YUV 4:2:0 影像的 Cb 和 Cr 平面在每行之後具有的填充位元組數是 Y 平面的一半。為了避免歧義,驅動程式必須返回四捨五入為縮放因子的倍數的 bytesperline 值。

對於壓縮格式,bytesperline 值沒有意義。在這種情況下,應用程式和驅動程式必須將其設定為 0。

__u32

sizeimage

用於儲存完整影像的緩衝區大小,以位元組為單位,由驅動程式設定。通常這是 bytesperline 乘以 height。當影像由可變長度的壓縮資料組成時,這是編解碼器支援最壞情況壓縮場景所需的位元組數。

驅動程式將設定未壓縮影像的值。

允許客戶端為標記有 V4L2_FMT_FLAG_COMPRESSED 的可變長度壓縮資料在 ioctl VIDIOC_ENUM_FMT 設定 sizeimage 欄位,但驅動程式可能會忽略它並自行設定該值,或者可能會根據對齊要求或最小/最大大小要求修改提供的值。如果客戶端想將其留給驅動程式,則應將 sizeimage 設定為 0。

__u32

colorspace

影像顏色空間,來自列舉 v4l2_colorspace。此資訊補充了 pixelformat,並且必須由驅動程式為捕獲流設定,並由應用程式為輸出流設定,請參見顏色空間。如果應用程式設定了標誌 V4L2_PIX_FMT_FLAG_SET_CSC,則應用程式可以為捕獲流設定此欄位,以請求捕獲的影像資料的特定顏色空間。如果驅動程式無法處理請求的轉換,它將返回另一個支援的顏色空間。驅動程式透過在列舉期間在相應的結構 v4l2_fmtdesc 中設定標誌 V4L2_FMT_FLAG_CSC_COLORSPACE 來指示支援顏色空間轉換。請參見影像格式描述標誌

__u32

priv

此欄位指示結構 v4l2_pix_format 的其餘欄位(也稱為擴充套件欄位)是否有效。當設定為 V4L2_PIX_FMT_PRIV_MAGIC 時,它指示擴充套件欄位已正確初始化。當設定為任何其他值時,它指示擴充套件欄位包含未定義的值。

希望使用畫素格式擴充套件欄位的應用程式必須首先透過查詢裝置的 V4L2_CAP_EXT_PIX_FORMAT 功能來確保支援該功能。如果未設定該功能,則不支援畫素格式擴充套件欄位,並且使用擴充套件欄位將導致未定義的結果。

要使用擴充套件欄位,應用程式必須將 priv 欄位設定為 V4L2_PIX_FMT_PRIV_MAGIC,初始化所有擴充套件欄位,並將結構 v4l2_format raw_data 欄位的未使用位元組歸零。

priv 欄位未設定為 V4L2_PIX_FMT_PRIV_MAGIC 時,驅動程式必須表現得好像所有擴充套件欄位都設定為零。返回時,驅動程式必須將 priv 欄位設定為 V4L2_PIX_FMT_PRIV_MAGIC,並將所有擴充套件欄位設定為適用的值。

__u32

flags

由應用程式或驅動程式設定的標誌,請參見格式標誌

union {

(anonymous)

__u32

ycbcr_enc

Y’CbCr 編碼,來自列舉 v4l2_ycbcr_encoding。此資訊補充了 colorspace,並且必須由驅動程式為捕獲流設定,並由應用程式為輸出流設定,請參見顏色空間。如果應用程式設定了標誌 V4L2_PIX_FMT_FLAG_SET_CSC,則應用程式可以為捕獲流設定此欄位,以請求捕獲的影像資料的特定 Y’CbCr 編碼。如果驅動程式無法處理請求的轉換,它將返回另一個支援的編碼。對於 HSV 畫素格式,此欄位將被忽略。驅動程式透過在列舉期間在相應的結構 v4l2_fmtdesc 中設定標誌 V4L2_FMT_FLAG_CSC_YCBCR_ENC 來指示支援 ycbcr_enc 轉換。請參見影像格式描述標誌

__u32

hsv_enc

HSV 編碼,來自列舉 v4l2_hsv_encoding。此資訊補充了 colorspace,並且必須由驅動程式為捕獲流設定,並由應用程式為輸出流設定,請參見顏色空間。如果應用程式設定了標誌 V4L2_PIX_FMT_FLAG_SET_CSC,則應用程式可以為捕獲流設定此欄位,以請求捕獲的影像資料的特定 HSV 編碼。如果驅動程式無法處理請求的轉換,它將返回另一個支援的編碼。對於非 HSV 畫素格式,此欄位將被忽略。驅動程式透過在列舉期間在相應的結構 v4l2_fmtdesc 中設定標誌 V4L2_FMT_FLAG_CSC_HSV_ENC 來指示支援 hsv_enc 轉換。請參見影像格式描述標誌

}

__u32

quantization

量化範圍,來自列舉 v4l2_quantization。此資訊補充了 colorspace,並且必須由驅動程式為捕獲流設定,並由應用程式為輸出流設定,請參見顏色空間。如果應用程式設定了標誌 V4L2_PIX_FMT_FLAG_SET_CSC,則應用程式可以為捕獲流設定此欄位,以請求捕獲的影像資料的特定量化範圍。如果驅動程式無法處理請求的轉換,它將返回另一個支援的量化。驅動程式透過在列舉期間在相應的結構 v4l2_fmtdesc 中設定標誌 V4L2_FMT_FLAG_CSC_QUANTIZATION 來指示支援量化轉換。請參見影像格式描述標誌

__u32

xfer_func

傳遞函式,來自列舉 v4l2_xfer_func。此資訊補充了 colorspace,並且必須由驅動程式為捕獲流設定,並由應用程式為輸出流設定,請參見顏色空間。如果應用程式設定了標誌 V4L2_PIX_FMT_FLAG_SET_CSC,則應用程式可以為捕獲流設定此欄位,以請求捕獲的影像資料的特定傳遞函式。如果驅動程式無法處理請求的轉換,它將返回另一個支援的傳遞函式。驅動程式透過在列舉期間在相應的結構 v4l2_fmtdesc 中設定標誌 V4L2_FMT_FLAG_CSC_XFER_FUNC 來指示支援 xfer_func 轉換。請參見影像格式描述標誌

格式標誌

V4L2_PIX_FMT_FLAG_PREMUL_ALPHA

0x00000001

顏色值已預乘 alpha 通道值。例如,如果具有 50% 透明度的淺藍色畫素由 RGBA 值 (128, 192, 255, 128) 描述,則用預乘顏色描述的相同畫素將由 RGBA 值 (64, 96, 128, 128) 描述

V4L2_PIX_FMT_FLAG_SET_CSC

0x00000002

由應用程式設定。它僅用於捕獲,而對於輸出流則被忽略。如果設定,則請求裝置執行顏色空間轉換,從接收到的顏色空間轉換為請求的顏色空間值。如果色度欄位(colorspacexfer_funcycbcr_enchsv_encquantization)設定為 *_DEFAULT,則該色度設定將與接收到的內容保持不變。因此,為了更改量化,只有 quantization 欄位應設定為非預設值(V4L2_QUANTIZATION_FULL_RANGEV4L2_QUANTIZATION_LIM_RANGE),並且所有其他色度欄位應設定為 *_DEFAULT

要檢查硬體對當前畫素格式支援哪些轉換,請參見影像格式描述標誌