View Single Post
Old 16th September 2021, 21:51   #13  |  Link
poisondeathray
Registered User
 
Join Date: Sep 2007
Posts: 5,377
Quote:
Originally Posted by DTL View Post
If there were any table of the HDR colorbars (of some exact type) in PQ and HLG (of some exact white/black and other variables) it can be compared in the release 4:2:2 10bit files for total code value error. But I think non of official tables still exist. Having perfect decoded levels accuracy is sort of 'nice to have' feature for now I think.
Vapoursynth colorbars are exact, because they are synthetically generated according to SMPTE RP 219-1, 219-2 and ITU-R BT.2111-0 . The diagram and exact 10,12 bit code values are listed in the later for PQ narrow/full and HLG

https://github.com/ifb/vapoursynth-colorbars

You can import vpy scripts in to avs for many pixel types with VSImport("script.vpy")

Quote:

"maybe the sinc implmentation is not the same"

Yes - there at least 2 ways possible:
1. anti-ringing pre-filtering before sinc (not clear sinc so it will show fading of frequency responce at highest valid frequencies and a bit less sharpness)
2. it really do not scale in the input HDR-transfer but perform converting to linear inside. Though it need to know the current transfer-domain of the input content to perform converting to linear and back.

" without the large ringing seen avisynth."

Avisynth sinc mostly probably do not perform non-requested conversions to linear domain (and back) and not perform pre-filtering so if input content is not anti-ringing conditioned it will expose full ringing.

It does not look like they do, taking a quick look at the code. But I might have missed something

If you replace internal SincResize with

fmtc_resample(w=last.width*4, h=last.height*4, kernel="sinc", taps=16)

it does not exhibit the large ringing patterns either


avs internal code I think is this

https://github.com/AviSynth/AviSynth..._functions.cpp

Code:
]
/***********************
 *** Sinc filter ***
 ***********************/
SincFilter::SincFilter(int _taps) {
   taps = (double)clamp(_taps, 1, 20);
}

double SincFilter::f(double value) {
   value = fabs(value);

  if (value > 0.000001) {
    value *= M_PI;
    return sin(value)/value;
  } else {
    return 1.0;
  }
}
poisondeathray is offline   Reply With Quote