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 H4203978Nothing 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.
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.
// 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; }
// 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; }
// 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.