Emby Emby Emby Learn
  • Emby Home
  • Video
  • Audio
  • Media Files
    • Subtitles and captions
    • Photos and images
    • Metadata and discovery
    • Libraries and media collections
    • Playback and streaming
    • Media hardware acceleration
    • Displays and AV connections
    • Live TV and recording
  1. Emby Learn
  2. Video
  3. Color and pixel formats
  4. Limited and full range
Search Results for

    Show / Hide Table of Contents

    Limited and Full Video Range

    Video range defines the numerical scaling and offsets that connect stored component codes to their intended signal values.

    If a movie's blacks become gray and its whites look subdued, a range mismatch is one possible cause. The sample codes may have arrived intact, but the renderer has used the wrong black point and scale when interpreting them.

    In a common 8-bit limited-range luma representation, code 16 represents black and 235 nominal white. Full-range 8-bit luma instead uses 0 and 255. Both conventions can describe the intended black-to-white interval. The mapping between that interval and its stored numbers is different.

    Inspection tools may abbreviate these conventions as tv and pc respectively. Those labels describe component coding; the intended interpretation still applies on either kind of display.

    Range interpretation can appear at the source decoder, a server conversion stage, an Emby app's renderer, and the final output path. For a result that changes between original playback and converted playback, compare the source and delivered stream's range fields and the actual sample transformation.

    Two mappings, calculated from the same signal

    Let E be a normalized luma signal from 0 to 1. In these 8-bit examples, form a stored code by nearest rounding:

    Limited: code = round(16 + 219 E)

    Full: code = round(255 E)

    Intended signal E Limited-range luma code Full-range luma code
    0: reference black 16 0
    0.25 71 64
    0.5 126 128
    0.75 180 191
    1: nominal white 235 255

    The two columns depict approximately the same signal levels through different numerical scales. Their integer rounding errors differ because their available code grids differ.

    The reverse calculation removes the corresponding offset and scale. Limited-range code 71 represents (71 − 16)/219 ≈ 0.25114. Full-range code 64 represents 64/255 ≈ 0.25098. Both are close to the intended quarter-scale signal.

    Why the wrong interpretation changes contrast

    Take limited-range black 16 and interpret it as full range. The signal becomes 16/255 ≈ 0.06275, above black. Nominal white 235 becomes 235/255 ≈ 0.92157, below white. The original black-to-white span is squeezed into the middle of the expected full-range interval.

    These percentages describe the encoded signal coordinate, not emitted light. The display's transfer relationship determines what light follows from each coordinate. The numerical mismatch nevertheless explains the raised black and compressed contrast.

    In the opposite direction, interpret full-range code 12 as limited range:

    (12 − 16)/219 ≈ −0.01826.

    The result lies below reference black. Full-range code 245 similarly becomes (245 − 16)/219 ≈ 1.04566, above nominal white. If the subsequent presentation clips to the nominal interval, multiple dark or bright input codes collapse to the same endpoint. Detail is lost at those ends rather than merely shifted.

    Chroma has a neutral offset of its own

    Luma and RGB components describe nominal values from 0 to 1. YCbCr chroma describes signed color differences around zero, so its digital mapping also needs a neutral point.

    Common limited-range coding Luma black–white Chroma nominal interval Neutral chroma
    8-bit 16–235 16–240 128
    10-bit 64–940 64–960 512

    For 8-bit limited chroma, the scale is 224 and the offset 128. Reusing the luma scale 219 or treating the chroma byte as an unsigned RGB intensity changes color reconstruction. Full-range chroma has its own defined mapping too; a generic 0–255 luma formula is not the complete three-component conversion.

    The codes beyond nominal luma black and white provide working margins in the relevant video systems. Filtering can produce excursions into those margins. A nominal range description and a specific clipping policy are separate decisions.

    A tag correction or an image conversion?

    A range tag describes how to interpret existing codes. Changing a tag does not rescale them. If our correctly coded limited-range black is 16, changing only its label to full range makes it the raised signal value calculated above.

    A real limited-to-full conversion instead maps each luma code through its source interpretation and into the destination scale:

    destination = round(255 × (source − 16)/219)

    Within the nominal interval, source 16 becomes 0, 235 becomes 255, and 71 becomes approximately 64. Chroma is converted using the appropriate chroma mapping. The output description must then agree with the converted samples.

    If a file contains full-range samples mislabeled as limited, correcting that incorrect label can restore the intended interpretation without changing its samples. Establishing what the samples actually represent is the step that distinguishes these two cases.

    See Also

    • YCbCr Video
    • Video Bit Depth
    • Video Color Tags and Signaling
    • Electro-Optical Transfer Function (EOTF)

    References

    • ITU-R BT.601: Digital component coding and working margins
    • ITU-R BT.2100: Narrow and full-range integer representations
    • FFmpeg 8.1: Color-range equations
    On this Page
    2026 © EMBY LLC. Please see our terms of use and privacy policy.
    Back to Top