WUGXA Deep Colour support and syncing to display

Hello, I’m a proud owner of a Vero V that I recently bought as a projectionist for a cineclub. I chose it since I’m familiar with linux and have experience running Kodi Libreelec on a PI, and I found ideal that the OSMC team implements the Amlogic S905X4-O hardware video processor in linux to take advantage of its full functionality and customization.

We’re using a WUXGA G50-W8 Barco projector that supports according to specs up to 12-bit RGB/YCC444 at 60 Hz at this native resolution of 1920x1200. However, I can’t output higher that 8-bit RGB, (not even 422 10-bit) , while I can output 10-bit RGB/422 and 12-bit 422 at 1920x1080 and 12-bit 422 and 10-bit RGB at 3840x2160.

I’m not sure whether it is a current limitation of my projector’s firmware (I opened a ticket at Barco), but does the Vero V support 10-bit at 1920x1200 (identified as VIC 789 in amhdmitx/config)? It is a VESA resolution. I want to use this native resolution to upscale 4:3 and 1.66 content to use those 1200 lines of light.

I’m generally projecting <=1920x1080 8-bit limited-range only content, and I favour outputting limited-range to the projector, so I maintain 16-235 luma as is. I’d like to upsample and output 10-bit RGB or 422 to have more precision in chroma and to try temporal dithering on and off. I can’t seem to find dither_en or deband_en in /sys/class/amvecm/ node. Are dithering and debanding settings available? I think I have noticed a slight snow efect in 10-bit HDR ramps

As for syncing to display native refresh rates, the projector currently supports 23.98, 24, 25, 29.97, 30, 50, 59.94 and 60 Hz at 1920x1080. In general, do you think enabling syncing to the display refresh rate in Kodi settings provide more accurate and stable sync with the projector even on native refresh rates? I don’t mind a minimal audio resampling if that perfectly syncs and waits for the projector vertical refresh.
If I only set the Kodi refresh rate to the projector refresh rate without enabling syncing to the display in kodi settings, is there any kind of synchronization happening between the Vero and the display or they go their own speed until until they drift? I find it specially relevant for 23.976 rate, since the projector indicates 23.98, which is not exactly the same value at least as a descriptor. I did a test and it looked to have better cinematic refresh when enabling syncing to the display.

Here you are with logs at 1920x1200:
https://paste.osmc.tv/bomerisoca
and at 3840x2160 (the projector downscales internally to 1920x1080):
https://paste.osmc.tv/xiwedorebo

This is a log of the console when trying to force 10-bit at 1920x1200:

osmc@osmc:~$ cat /sys/class/amhdmitx/amhdmitx0/config
cur_VIC: 789
cur_video_param->VIC=789
cur_video_param->colordepth: 8bit
para->colorspace: RGB
AVIF VIC: 0
VIC: 789 1920x1200p60hz
Colour depth: 8-bit
Colourspace: RGB
Colour range: limited
EOTF: PQ
YCC colour range: limited
Colorimetry: BT2020nc
PLL clock: 0xdb010480, Vid clock div 0x000a739c
Aspect ratio: 16:9/full frame
DV type Not DV
audio config: off
audio on/off: off
audio source: I2S
audio type: L-PCM
audio channel num: 2 channels
audio sample rate: 44.1kHz
audio sample size: MAX
3D config: off

osmc@osmc:~$ echo ‘rgb,10bit’ | sudo tee /sys/class/amhdmitx/amhdmitx0/attr
rgb,10bit
osmc@osmc:~$ cat /sys/class/amhdmitx/amhdmitx0/config
cur_VIC: 789
cur_video_param->VIC=789
cur_video_param->colordepth: 8bit
para->colorspace: RGB
AVIF VIC: 0
VIC: 789 1920x1200p60hz
Colour depth: 8-bit
Colourspace: RGB
Colour range: limited
EOTF: PQ
YCC colour range: limited
Colorimetry: BT2020nc
PLL clock: 0xdb010480, Vid clock div 0x000a739c
Aspect ratio: 16:9/full frame
DV type Not DV
audio config: off
audio on/off: off
audio source: I2S
audio type: L-PCM
audio channel num: 2 channels
audio sample rate: 44.1kHz
audio sample size: MAX
3D config: off

osmc@osmc:~$ echo ‘422,10bit’ | sudo tee /sys/class/amhdmitx/amhdmitx0/attr
422,10bit
osmc@osmc:~$ cat /sys/class/amhdmitx/amhdmitx0/config
cur_VIC: 789
cur_video_param->VIC=789
cur_video_param->colordepth: 8bit
para->colorspace: 422
AVIF VIC: 0
VIC: 789 1920x1200p60hz
Colour depth: 8-bit
Colourspace: RGB
Colour range: limited
EOTF: PQ
YCC colour range: limited
Colorimetry: BT2020nc
PLL clock: 0xdb010480, Vid clock div 0x000a739c
Aspect ratio: 16:9/full frame
DV type Not DV
audio config: off
audio on/off: off
audio source: I2S
audio type: L-PCM
audio channel num: 2 channels
audio sample rate: 44.1kHz
audio sample size: MAX
3D config: off

Thank you very much in advance!

Please, I’d need to discard whether The Vero is limiting a VESA (non-CEA) resolution such as 1920x1200 (identified as VIC 789 in amhdmitx/config) to RGB 8-bit, because I need to claim Barco for not allowing 10/12-bit color at this resolution with my projector.
@grahamh @sam_nazarko

Is this the case with 1920x1200?

Yes. If it’s a VESA mode Vero outputs 8 bits RGB. We have assumed VESA modes are associated only with monitors and I don’t think AMLogic have the timings for VESA modes at 10 bits in the kernel. 1920x1200 seems a bit strange for a projector.

Can you ask Barco for the timings for that mode so we could look at adding it?

BTW you should not put that ,. Just rgb10bit would do it (if it was actually working).

And to some of your other questions:

  • we don’t recommend sync to display, if only because it only works for LPCM IIRC.
  • there’s no mechanism for a display to feed back timings to a source as something is playing. There are latency values in a display’s EDID. I’ve only ever come across those in projectors and I’m not convinced AVRs make good use of them. AVRs often have a switch to enable sync which should use those values but the system is very old with values only for progressive and interlaced with no thought of higher resolutions like 4k. You will be aware that you can adjust the a/v sync for each file, and the setting is stored in the database.
  • @sam_nazarko knows more than me about the dithering. I don’t think there’s any control over debanding but I may be wrong. If AML support that you may find some info on it in other forums.

Thanks Graham for the write-up.
I have confirmation from Barco that they support WUXGA at RGB and YCbCr 4:4:4 in 12 bit or YCbCr 4:2:2 in 8 bit, at 60 Hz with Reduced Blanking ,as mentioned on their specs.

I will try echo ‘rgb10bit’ | sudo tee /sys/class/amhdmitx/amhdmitx0/attr to force 10-bit on WUXGA as soon as I get the chance, although I suppose that it won’t as you say the Vero outputs 8-bit RGB with VESA modes and I tried forcing RGB in the GUI. Or it could be that the Barco is limiting VESA at 8-bit, even if specs say otherwise. They may think their “monitor” is still 8-bit only. Most installation DLP projectors were native WUXGA last year. There are 10-bit WUXGA monitors from HP and Dell from as long as 2012.

Regarding timings from the Barco, I’ve asked them to implement multimedia frequencies at native WUXGA resolution, as of now I only get 60 and 59.94 Hz, they confirmed they handed this to their lab to allow for a firmware update.
As a reference, the EDID shown in the log from the paste logs that I posted includes a DTD for 1920x1200@59.95 Hz in Block0:

  Detailed Timing Descriptors:
    DTD 1:  1920x1200   59.950 Hz   8:5    74.038 kHz 154.000 MHz
                 Hfront   48 Hsync  32 Hback  80 Hpol P
                 Vfront    3 Vsync   6 Vback  26 Vpol N
  Display Range Limits:
    Monitor ranges (GTF): 56-85 Hz V, 31-100 kHz H, max dotclock 170 MHz
    Display Product Name: 'G50-W8'

Block1 from the EDID indicates a Maximum TMDS of 600 MHz, as the the projector supports 4096x2160/60Hz at RGB 8-bits and 3840x2160/30Hz at RGB 12-bit, 444 12-bit and 422 at 8-bit.

It would be fantastic if you could add timings for deep color support for 1920x1200 at 59.950 (59.94?) and 60 Hz from the EDID 59.950 Hz DTD while I wait for Barco to implement additional multimedia frequencies in their firmware. As I sidenote, I tried modifying the native EDID and added DTDs with precise timings for these refresh frequencies and tried it on the Vero but the Barco projector didn’t comply, so their firmware is clearly limiting these.

IIRC 24Hz just isn’t part of the VESA standard so we are in uncharted waters. That DTD only specifies timings in terms of the pixel frequency but it’s the most we can expect from Barco. We’ll have to work out what that means for the clocks in Vero. I have a 1920x1200 monitor but it doesn’t do deep colour or 24Hz so this could mean some trial and error. But we do enjoy a challenge. It should be trivial to allow 422 on a VESA mode, the problem is I recall it used to be supported but it caused some problems for some users. We can add a switch to enable it.

1 Like

By curiosity: most content is limited range 4:2:0. Do you generally recommend to output full-range YCC by default instead of forcing 16-235 and RGB out?

My understanding is that if content is 16-235, it could make sense to keep output in that range instead of remapping to full-range, specially if VESA modes restrict to 8-bit, to reduce the possibility of banding.

Does hardware acceleration support H264/H265 4:2:2 and 4:4:4 playback? I tried a HDR10 2160p HEVC 4:4:4 but couldn’t play on the Vero.

No we don’t recommend that at all. See here How to avoid washed-out colours - Limited and Full Range settings

If you output limited range, YCC then there are no colourspace conversions so no interpolation which could increase banding. If you output RGB, the colourspace conversion is done in full-range so there’s at least one full/limited conversion.

No. You will at best get a slide show from that format as it tries to decode in software.

Any progress on this? We have implemented YUV 422 output for VESA modes so your Barco should now be able to get 10 bit video at 59.95 or 60Hz if you update your Vero V.

Yes, I received validation from Barco to customise my EDID and I made a new one with 5 DTDs for custom WUGXA timings (23.976,24, 25, 30, 50 and 60). I uploaded the EDID to the projector and tested these modes on Windows 11 and they worked.

I updated my Vero V to the latest version and tested YUV422 10-bit and 12-bit output with 1920x1200 at 60Hz. If you are so kind I would appreciate a lot if you could add these exact timings to enable 23.976, 24, 25 and 30 Hz refresh frequencies to the kernel driver for these modes:

DTD 1:  1920x1200   60.000000 Hz  16:10    75.000 kHz    156.000000 MHz
             Hfront   48 Hsync  32 Hback   80 Hpol P
             Vfront    3 Vsync   6 Vback   41 Vpol N
DTD 2:  1920x1200   30.000000 Hz  16:10    37.500 kHz     78.000000 MHz
             Hfront   48 Hsync  32 Hback   80 Hpol P
             Vfront    3 Vsync   6 Vback   41 Vpol N
DTD 3:  1920x1200   23.976923 Hz  16:10    29.971 kHz     62.340000 MHz
             Hfront   48 Hsync  32 Hback   80 Hpol P
             Vfront    3 Vsync   6 Vback   41 Vpol N
DTD 4:  1920x1200   24.000000 Hz  16:10    30.000 kHz     62.400000 MHz
             Hfront   48 Hsync  32 Hback   80 Hpol P
             Vfront    3 Vsync   6 Vback   41 Vpol N
DTD 5:  1920x1200   25.000000 Hz  16:10    31.250 kHz     65.000000 MHz
             Hfront   48 Hsync  32 Hback   80 Hpol P
             Vfront    3 Vsync   6 Vback   41 Vpol N

As you can see they share the same porches, sync and polarity. Only pixel clocks and horizontal frequency change. As i can’t upload the .bin edid, here is the raw hexadecimal:

00 ff ff ff ff ff ff 00 0a 13 08 23 06 00 00 00
10 23 01 03 80 00 00 78 0a c3 43 a8 56 4a a0 26
06 4a 53 00 00 00 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 f0 3c 80 a0 70 b0 32 40 30 20
36 00 00 00 00 00 00 1a 78 1e 80 a0 70 b0 32 40
30 20 36 00 00 00 00 00 00 1a 00 00 00 fc 00 47
35 30 2d 57 38 0a 20 20 20 20 20 20 00 00 00 fd
00 17 78 0f 87 3c 00 0a 20 20 20 20 20 20 01 fb

02 03 3e f0 56 10 05 1f 14 20 21 5d 5e 5f 60 61
62 63 64 65 66 3f 11 12 02 03 01 23 09 07 07 83
01 00 00 e2 00 ca 67 03 0c 00 20 00 38 44 67 d8
5d c4 01 78 80 03 e3 05 e7 31 e3 06 07 01 5a 18
80 a0 70 b0 32 40 30 20 36 00 00 00 00 00 00 1a
60 18 80 a0 70 b0 32 40 30 20 36 00 00 00 00 00
00 1a 64 19 80 a0 70 b0 32 40 30 20 36 00 00 00
00 00 00 1a 00 00 00 00 00 00 00 00 00 00 00 91

Thanks in advance!

What happens if you try to set those refreshrates at the moment (with RGB 8 bits or YUV422)? I think it might ‘just work’ already.

Nevermind - I can see what needs adding.

Update: It is unusual for both 23.98 and 24Hz to be specified in an EDID and it’s something we would have to work around. At the moment we assume that any display which supports 24, 30 or 60Hz will also support the fractional rate just by lowering the pixel clock. Is it easy to just get rid of that DTD 3?

They don’t appear available in the refresh list in the GUI. Only 60 and 59.94, the latter of which I didn’t specify on the DTDs.
Is it possible to import the DTDs from the EDID as Windows does? I forgot to add a 50 Hz DTD for 25i interlaced content to let the Vero do the deinterlacing. I may add a last DTD for 29.97 or 48 Hz.

Yesterday I realised the Vero switched to 50 Hz 1920x1080 for a 25p movie. I was in 25 Hz mode in the GUI with a blank whitelist and still it switched to 50 Hz. Is it the Vero or the Barco that chooses to double the frequency for stability? Both 25 and 50 Hz VIC modes for 1920x1280 are available in the CEA extension block. I had the GUI option to double the frequency disabled.

So you don’t need Barco devs to provide anything? That’s good.

As I say, there’s no need to specify the fractional refreshrates in DTDs and it’s counterproductive (Vero may end up applying 1/1.001 to the 23.98Hz for example). I’ve never seen an explicit fractional rate in any EDID.

Kodi famously chooses 50p output for 50i or 25p content on all platforms. Without that, videos tend to start at one refreshrate and change a few seconds in - particularly annoying on most PJs. This also happens with 30Hz but not with 24Hz as a 48Hz mode is rarely available.

I will add 24, 25, 30, 50 and FWIW 48Hz to 1920x1200.

BTW how do you project scope content? Anamorphic lens?

I don’t understand why 23.98 is possible with CEA-861 VIC modes but not on explicit DTDs, which should have precedence over standard modes. I wish OSMC read the DTDs like Windows. EDID supports fractional rates for any DTD with specific timings up to 10 kHz step accuracy for horizontal frequency input.

I don’t understand either why OSMC overrides refresh rates when there’s no need to. A constant 25p video won’t change refresh rate.

I’ve also tested full range HEVC video and it does not work (blacks are crushed), tried forcing RGB and 0-255, also forced from the command line. It seems the hardware decoder ignores the range tag. 0-255 only works for the GUI. I know most content is limited range, but it should work. I have a need for full range because I transcode DCPs for playback and would like to benefit from full range at 10-bit, given that I can’t play other than 4:2:0.

I project scope content by zooming in the lens to fill the screen. Thanks for adding these frequencies to WUXGA.

CEA doesn’t have separate modes for fractional rates. It’s assumed if 24Hz is supported then 23.98Hz is also supported. The same will apply to VESA modes. Those DTDs are just unnecessary. The logic just divides the pixel frequency by 1.001 if that’s what the video reports or if the fractional rate is selected by the user for the GUI.

If you use the whitelist you can turn off the ‘double refreshrate’ option. IIRC it’s only 50i videos that have issues being played at 25p. Vero does not output interlaced video.

Yes. Full-range HEVC is so rare we don’t automatically recognise it. We found examples of HEVC that were limited range but tagged as full-range so we turned that off. You can go echo 1 | sudo tee /sys/module/am_vecm/parameters/range_control to tell the VPP to treat the source as full-range - but then all videos will be treated as full-range. I guess we could change it so there’s a switch to ignore or not ignore the range tag in videos and make that a setting in Kodi.

I’d appreciate that OSMC reads EDID’s DTDs so I don’t have to request custom VESA modes. However, if OSMC supports 23.98 and 59.94 for CEA 24 and 60 modes respectively, why not enable them for my requested 23.98 VESA mode if it’s just dividing the pixel frequency by 1.001?

I understand the logic about incorrect 25i and full range content, but I think it goes too far to disable expected behaviour. 25i videos activate 50Hz, but 25p shouldn’t. A full range tagged video should decode full range, and if the file is wrong then the user should correct that. Otherwise, implementing the option to override it in the GUI is necessary.

Does echo 1 | sudo tee /sys/module/am_vecm/parameters/range_controlforce full range?
I’d rather set it to automatic, so I can expect correct behaviour.

I don’t think you understand. Vero will output 23.98Hz, it just doesn’t need a separate DTD (frrom the 24Hz one) to do so.

Agreed. But it’s been like that for 8 years and you are the first user with that requirement.

Yes it does, as I explained, it’s not automatic but now you’ve raised that case we’ll look into changing it.

I do. Then why did you ask me before to do away with DTD 3 of 23.976? I need this timing. I said my projector supports 23.976 because I tested it with Windows, no need to assume, it does work. For the moment only 60 and 59.94 are available with my custom EDID. If it read the DTDs, it’d be straightforward. DTDs are not unusual on edids, that is why they are there for.

No you don’t. If you had only the 60Hz DTD (as in the original EDID) Vero would still output 59.94Hz if that was selected except atm IIRC we assume VESA modes don’t support fractional refreshrates. I’m going to change that for you.

Because it will confuse the EDID parser. There can be only one entry for 1920x1200x24Hz.

Ok Graham, Let’s see if we can understand each other:

The stock EDID had only one 59.950 Hz DTD for 1920x1200, not 60 Hz. Vero offered 60 Hz and 59.94 for this resolution in the GUI. But now I have a custom EDID with precise DTD timings.

VESA modes do support fractional framerates because Windows offers 23.976 for WUXGA with my custom EDID from the DTD 3.

My question is: Can you work out the parser so it accepts the exact timings that I included on DTD 3 for 23.976? The timings themselves are not fractional: 62.34 Mhz pixel clock and 29.971 kHz. Only the refresh rate is fractional, and Kodi supports fractional rates because it presents them available.
Custom DTDs on EDIDs for VESA resolutions with fractional refresh rates are perfectly valid, and necessary for my case. I can do without the 23.976 if that is not possible for the Vero/OSMC/Kodi parser, but I’d appreciate it would.

If I understood you correctly, the Vero logic derives the 23.98 rate on the GUI from related 24 Hz CEA VIC mode by dividing the pixel clock by 1001. Could you just do the same for my DTD 24 Hz mode to get the 23.98?

How would I get the update to see 24, 25, 30, and 50 refresh rates? And by curiosity, which parameters do you enter exactly for each custom rate, so I can understand better how Kodi works, and what can and can’t be done? I have dedicated quite an effort to make the custom EDID and the DTDs and I appreciate what may be done on your part.

I’d appreciate to know if there is a value for /sys/module/am_vecm/parameters/range_controlthat allows bypassing or keeping the range from input to output. I could add that command to a startup script, so I can try encoding full range videos.