Warranty Case H4203978 · Technical Demonstration

1080p → 4K: the filter matters.

A native 1920×1080 frame from Avatar: The Way of Water, upscaled to 3840×2160 live in your browser — once with the bilinear filter the C2 Pro uses in 3D mode, and once with the filters its 2D mode already uses.

Hisense C2 Pro · firmware V0000.09.02X.P0925 · case H4203978

Nothing is pre-rendered — your GPU reconstructs the 4K frame from the 1080p source, per pixel, with whichever two filters you pick. Zoom into the hair braids and drag the gold divider.

fit
Bilinear = what the C2 Pro does to every 3D frame Lanczos-3 = what its own 2D path already does Drag to pan · scroll or pinch to zoom · drag the gold divider

The implementation

This is the exact code computing the two sides of the demo above. The only difference between the defect and the fix is the kernel the scaler samples with.

Bilinear — what the 3D path does today

4 samples · 2×2 kernel · runs every frame on every 3D pixel
// 2-tap linear interpolation, per axis
vec3 bilinear(sampler2D t, vec2 src){
    ivec2 p = ivec2(floor(src - 0.5));
    vec2  f = (src - 0.5) - vec2(p);
    vec3  c = vec3(0.0);
    for(int j = 0; j < 2; j++)
    for(int i = 0; i < 2; i++){
        float w = (i==0 ? 1.0-f.x : f.x)
                * (j==0 ? 1.0-f.y : f.y);
        c += w * texelFetch(t, p + ivec2(i,j), 0).rgb;
    }
    return c;
}

Lanczos-3 — the fix

36 samples · 6×6 windowed sinc · reference-quality reconstruction
// windowed sinc kernel
float lanczos(float x, float a){
    x = abs(x);
    if(x < 1e-4) return 1.0;
    if(x >= a)   return 0.0;
    float px = 3.14159265 * x;
    return (sin(px)/px) * (sin(px/a)/(px/a));
}

vec3 lanczos3(sampler2D t, vec2 src){
    ivec2 p = ivec2(floor(src - 0.5));
    vec2  f = (src - 0.5) - vec2(p);
    vec3  c = vec3(0.0);
    float ws = 0.0;
    for(int j = -2; j <= 3; j++)
    for(int i = -2; i <= 3; i++){
        float w = lanczos(float(i)-f.x, 3.0)
                * lanczos(float(j)-f.y, 3.0);
        c  += w * texelFetch(t, p + ivec2(i,j), 0).rgb;
        ws += w;
    }
    return c / ws;
}

The fix is a one-line change.

// video HAL, 3D path initialization
- scaler.setFilter(FILTER_BILINEAR);
+ scaler.setFilter(FILTER_LANCZOS);  // already implemented in the 2D path

Both filters already ship in the same firmware on the 2D path, and both are trivially cheap on the MT9618's Mali-G52 GPU and VPU. No new silicon, no new pipeline, no performance risk.

What I'm asking for under warranty case H4203978 is a firmware build with that change — or a written explanation of why the 3D signal path is given a worse scaler than the 2D path of the same projector.