====== YUV 4:4:4 UVC Brightness ====== At this stage of the imaging pipeline the pixel data is represented in full-range YCbCr 4:4:4 color space with 12-bit precision per component. The purpose of this block is to apply **UVC Brightness adjustment** to the image by modifying the luma component while preserving chroma. ===== Conceptual model ===== The UVC Brightness control is described in terms of an HSL-based model in [[https://wiki.sub2r.com/doku.php/isp:brightness|UVC Brightness]] Conceptually, UVC Brightness corresponds to a **uniform additive offset applied to perceived lightness**. In a YCbCr pipeline, this behavior maps directly to an **additive offset applied to the luma (Y) component**, while chroma components remain unchanged. This document specifies that mapping explicitly for FPGA implementation. ===== Input format ===== The input consists of YCbCr pixels with the following properties: \[ Y12 \in [0..4095]\\ C_b12 \in [0..4095]\text{, neutral at }2048\\ C_r12 \in [0..4095]\text{, neutral at }2048 \] All values are unsigned 12-bit integers using full-range (computer-range) coding. ===== Output format ===== The output format is identical to the input format: \[ Y12^{\text{bright}} \in [0..4095]\\ C_b12^{\text{bright}} = C_b12\\ C_r12^{\text{bright}} = C_r12 \] Only the luma component is modified by the brightness stage. ===== Brightness offset definition ===== The UVC Brightness control provides a signed brightness offset value \(B\), defined and scaled as specified in [[https://wiki.sub2r.com/doku.php/isp:brightness|UVC Brightness]] ===== UVC Brightness implementation ===== Brightness is applied as a **signed additive offset** to the luma component: \[ Y12^{\text{bright}} = clamp12(Y12 + B) \] Where: * \(Y12\) is the input luma value, * \(B\) is the signed brightness offset, * and `clamp12(x)` clamps the result to the range \([0..4095]\). The chroma components are passed through unchanged: \[ C_b12^{\text{bright}} = C_b12\\ C_r12^{\text{bright}} = C_r12 \] ===== FPGA implementation considerations ===== * Brightness adjustment shall be implemented using **signed integer arithmetic**. * The addition must be performed at sufficient bit width to avoid overflow before clamping. * Clamping is applied **after** the addition. * No multiplications, divisions, or LUTs are required for this stage. ===== Notes ===== * This block operates entirely in **YCbCr space**. * Brightness adjustment affects **only luma**, preserving chroma relationships. * The behavior is conceptually equivalent to the HSL-based UVC Brightness model. * This stage assumes **full-range (computer-range) YCbCr** coding. * Extreme brightness values may cause luma clipping, which is expected behavior.