USB grabbers: HDR to SDR quality test round-up. New LUT generation for HDR to SDR and new HyperHDR tool for automatic LUT calibration. The cheap macrosilicon MS2109 clone surprises us again.

The latest version of V18beta (still in development but can be already tested) brings a new innovative and unique tool that will take your HDR content viewing experience to new levels. There will also be some theory and concrete results that will ultimately settle what you can expect from a given grabber and our software HDR to SDR algorithms.

TL;DR? Just go to the download section or generate your own LUT for HDR to SDR because the results are spectacular for most grabbers. And here's the picture of the unexpected winner:






1 HDR to SDR challenges

We are focusing on technical issues here, leaving other details like color space conversion or perceptual quantizer on the secondary plan as they are well documented in ITU-R publications. The analysis of samples from multiple grabbers showed that it is impossible to create one perfect LUT that will provide the optimal HDR to SDR result for each grabber. Manufacturers do not adhere to any standard here, but on the other hand, none of these grabers are advertised as capable of preperly capturing the HDR source. So we get a brighter or darker image with always distorted colors for HDR content.

First one: YUV to RGB conversion.
Applies if you use YUV / NV12 codec not only for HDR but also SDR!
  1. Coefficients. YUV only specifies the format of the data itself, but how to convert it to RGB colors is no longer contained in just one standard. In practice, we encountered the standards of rec.609, rec.709, FCC. Using the wrong coefficient causes a significant deterioration in quality.
  2. Limited or full YUV data range. For safety, we usually assume a limited range, otherwise if we use the full range algorithm for a device with a limited range, then instead of deep black color we would get at most gray. But if we apply limited range algorithm to a full-range device, we will significantly worsen the quality of the conversion. It turned out that the popular and cheap MS2109 uses FULL range, unlike other tested grabers!
Second one: HDR to SDR processing
  1. we have to guess the range of data that comes
  2. we have to guess the proper gain
  3. sometimes we have to "repair" gamma before applying standard HDR PQ
  4. some manufactures artificially improve the "quality" of their grabbers. But the gain works properly only for the standard SDR signal. In the case of HDR, it damages the format that we are trying to reconstruct. See case MS2109 for details.


2 Proposed solution

The only way is to display the specified control screen in HDR, capture it by graber and analyze the result. The idea had followed me for a long time but I wasn't sure about the result and more of it was a research. But in the end the result proved it was the right approach. For this purpose, we can use, for example: Windows 10 with HDR enabled. The web browser will display in full screen a special test screen controlled by HyperHDR and then the application will analyze the captured image. The calculations are quite complicated, so they can put a strain on your hardware. It is also possible to calibrate LUT using images received from an external source by a flatbuffers instead of a USB grabber.

intro


3 Results

The result is the result of an internal subjective weight function: the lower score the better. But for us, the purity of the colors (pure red / green / blue at full scale) and the proportions for their mixes (color ratio for yellow, brown, purple, pink etc.) are even more important. We'll give you all the details, but remember: these USB grabbers are not advertised as HDR capable, we are trying to fix them ourselves without any detailed product documentation available.

For reference these are samples of typical HDR content with washed out colors and lowered brightness, captured by reviewied USB grabbers before being fixed with HyperHDR LUT:

sample1 sample2


3.1 Rullz MS2109


One of the many devices that use the macrosilicon MS2109 chip. The result is GREAT for a $8 device. But there is one catch: the manufacturer artificially amplifies the SDR processing by a modified brightness / contrast / saturation. You need to put them back to the middle of the scale: brightness to 1 (zero does not work in HyperHDR), contrast and saturation to 128.
ms2109
Why? Because these controls are for SDR source. For HDR, it will break the BT.2020 signal we are trying to convert to RGB. Note: This is the only full range grabber in the test and needs a special approach. The automatic calibration can handle it.

New dedicated V18 LUT Old built-in V17 LUT
click to zoom
MS2109-new MS2109-old
MS2109-new2 MS2109-old2


Our score: 566 (the lower the better):
Prime color (Red, Green, Blue) Captured color Built-in V17 LUT New dedicated V18 LUT
Red: (255,0,0) (135, 86, 57) (254, 40, 7) (255,0,0)
Green: (0,255,0) (120, 148, 88) (106, 254, 39) (0,255,0)
Blue: (0,0,255) (72, 54, 143) (38, 17, 254) (0,1,255)
Yellow: (255,255,0) (146, 151, 92) (254, 254, 45) (254,255,0)
Magenta: (255,0,255) (136, 91, 143) (254, 54, 254) (251,8,255)
Cyan: (0,255,255) (124, 149, 146) (123, 254, 254) (0,255,255)
Orange: (255,128,0) (137, 117, 72) (254, 169, 18) (252,127,0)
Pink: (255,0,128) (135, 88, 107) (254, 46, 150) (253,0,122)
Azure: (0,128,255) (95, 112, 143) (38, 167, 254) (0,129,255)
Brown: (128,64,0) (99, 83, 46) (152, 59, 1) (117,60,0)
Purple: (128,0,64) (97, 59, 75) (166, 17, 58) (118,6,57)
Low red: (128,0,0) (96, 57, 34) (164, 12, 0) (116,3,0)
Low green: (0,128,0) (85, 109, 59) (27, 158, 8) (0,124,0)
Low blue: (0,0,128) (45, 34, 105) (12, 1, 182) (0,2,122)
LowestGray: (16,16,16) (40, 40, 41) (7, 7, 7) (14,14,14)
Gray1: (32,32,32) (54, 56, 53) (16, 24, 17) (28,28,28)
Gray2: (48,48,48) (68, 68, 68) (40, 41, 40) (45,45,45)
Gray3: (64,64,64) (77, 78, 76) (56, 64, 54) (58,58,58)
Gray4: (96,96,96) (95, 97, 94) (89, 111, 94) (91,91,91)
Gray5: (120,120,120) (106, 108, 105) (122, 149, 131) (116,116,116)
Gray6: (144,144,144) (116, 118, 115) (160, 193, 170) (143,143,143)
Gray7: (172,172,172) (125, 127, 124) (214, 236, 210) (171,171,171)
Gray8: (196,196,196) (133, 135, 132) (251, 254, 253) (199,199,199)
HighestGray: (220,220,220) (140, 142, 139) (254, 254, 254) (227,227,227)
White: (255,255,255) (148, 150, 147) (254, 254, 254) (255,255,255)


3.2 Navy U3


Another surprise. It seems that the less the manufacturer is the artificially better quality of the signal, the better for our algorithms. Perfect result. The internal splitter doesn't support HDR so you need external one.

New dedicated V18 LUT Old built-in V17 LUT
click to zoom
navy-new navy-old
navy-new2 navy-old2


Our score: 742 (the lower the better):
Prime color (Red, Green, Blue) Captured color Built-in V17 LUT New dedicated V18 LUT
Red: (255,0,0) (134, 84, 55) (254, 46, 24) (255, 0, 0)
Green: (0,255,0) (117, 147, 89) (72, 248, 54) (0, 255, 9)
Blue: (0,0,255) (72, 51, 143) (43, 26, 243) (0, 0, 255)
Yellow: (255,255,0) (145, 150, 91) (254, 253, 59) (255, 255, 0)
Magenta: (255,0,255) (137, 87, 143) (254, 56, 248) (255, 0, 255)
Cyan: (0,255,255) (122, 148, 146) (91, 253, 252) (3, 255, 255)
Orange: (255,128,0) (137, 115, 70) (253, 142, 36) (255, 126, 1)
Pink: (255,0,128) (134, 86, 107) (254, 52, 131) (255, 7, 128)
Azure: (0,128,255) (94, 109, 143) (49, 140, 247) (20, 127, 255)
Brown: (128,64,0) (100, 81, 44) (133, 70, 16) (129, 61, 0)
Purple: (128,0,64) (97, 55, 74) (135, 26, 65) (127, 0, 60)
Low red: (128,0,0) (97, 55, 33) (135, 23, 10) (128, 0, 0)
Low green: (0,128,0) (83, 109, 59) (38, 137, 26) (0, 130, 0)
Low blue: (0,0,128) (45, 31, 104) (21, 13, 127) (0, 1, 125)
LowestGray: (16,16,16) (37, 40, 36) (16, 21, 17) (14, 14, 14)
Gray1: (32,32,32) (52, 55, 52) (32, 37, 33) (30, 30, 30)
Gray2: (48,48,48) (65, 68, 64) (48, 55, 48) (46, 46, 46)
Gray3: (64,64,64) (75, 78, 75) (63, 71, 65) (61, 61, 61)
Gray4: (96,96,96) (93, 96, 92) (98, 104, 97) (93, 93, 93)
Gray5: (120,120,120) (104, 107, 104) (120, 132, 124) (119, 119, 119)
Gray6: (144,144,144) (114, 116, 113) (148, 157, 147) (143, 143, 143)
Gray7: (172,172,172) (124, 126, 123) (178, 188, 179) (173, 173, 173)
Gray8: (196,196,196) (131, 134, 131) (200, 218, 205) (198, 198, 198)
HighestGray: (220,220,220) (138, 141, 138) (226, 247, 232) (225, 225, 225)
White: (255,255,255) (146, 149, 146) (254, 254, 254) (255, 255, 255)


3.3 AV ACCESS 4KVC00


If you've read the previous articles, you know that this grabber can be problematic to use. Nevertheless, the built-in splitter supports HDR, though not for such a wide range of video color formats as the Ezcap 320.

New dedicated V18 LUT Old built-in V17 LUT
click to zoom
4-KVC00-new 4-KVC00-old
4-KVC00-new2 4-KVC00-old2


Our score: 1981 (the lower the better):
Prime color (Red, Green, Blue) Captured color Built-in V17 LUT New dedicated V18 LUT
Red: (255,0,0) (191, 85, 50) (254, 44, 20) (255,0,0)
Green: (0,255,0) (149, 216, 96) (242, 254, 75) (0,255,0)
Blue: (0,0,255) (65, 42, 208) (35, 21, 254) (0,3,255)
Yellow: (255,255,0) (214, 219, 102) (254, 254, 105) (255,255,0)
Magenta: (255,0,255) (196, 89, 210) (254, 60, 254) (255,0,255)
Cyan: (0,255,255) (158, 217, 215) (250, 254, 254) (0,255,255)
Orange: (255,128,0) (199, 142, 68) (254, 248, 36) (255,122,0)
Pink: (255,0,128) (192, 85, 128) (254, 51, 199) (255,0,124)
Azure: (0,128,255) (97, 129, 211) (41, 204, 254) (0,126,255)
Brown: (128,64,0) (110, 81, 38) (171, 63, 13) (120,61,9)
Purple: (128,0,64) (104, 47, 76) (158, 20, 69) (117,8,63)
Low red: (128,0,0) (105, 46, 27) (162, 17, 7) (119,6,6)
Low green: (0,128,0) (80, 125, 53) (27, 188, 20) (0,124,9)
Low blue: (0,0,128) (34, 23, 124) (13, 9, 183) (0,5,124)
LowestGray: (16,16,16) (25, 29, 30) (7, 12, 12) (15,15,15)
Gray1: (32,32,32) (40, 44, 45) (18, 25, 26) (29,29,29)
Gray2: (48,48,48) (55, 59, 61) (34, 43, 45) (43,43,43)
Gray3: (64,64,64) (70, 75, 75) (52, 66, 66) (58,58,58)
Gray4: (96,96,96) (98, 103, 103) (102, 123, 122) (89,89,89)
Gray5: (120,120,120) (119, 124, 124) (157, 179, 182) (116,116,116)
Gray6: (144,144,144) (140, 145, 143) (235, 254, 252) (144,144,144)
Gray7: (172,172,172) (164, 167, 167) (254, 254, 254) (180,180,180)
Gray8: (196,196,196) (185, 187, 185) (254, 254, 254) (215,215,215)
HighestGray: (220,220,220) (201, 204, 201) (254, 254, 254) (245,245,245)
White: (255,255,255) (217, 220, 217) (254, 254, 254) (255,255,255)


3.4 Ezcap 321


Good score. If you want to use HDR signal, you need an external HDMI splitter as the built-in doesn't support it.

New dedicated V18 LUT Old built-in V17 LUT
click to zoom
ezcap321-new ezcap321-old
ezcap321-new2 ezcap321-old2


Our score: 2513 (the lower the better):
Prime color (Red, Green, Blue) Captured color Built-in V17 LUT New dedicated V18 LUT
Red: (255,0,0) (140, 79, 45) (254, 38, 18) (255, 0, 0)
Green: (0,255,0) (118, 154, 82) (88, 254, 48) (0, 255, 0)
Blue: (0,0,255) (67, 41, 150) (42, 13, 244) (0, 0, 255)
Yellow: (255,255,0) (152, 156, 89) (254, 254, 60) (254, 254, 3)
Magenta: (255,0,255) (143, 84, 150) (254, 44, 250) (255, 0, 255)
Cyan: (0,255,255) (122, 154, 153) (109, 254, 254) (0, 253, 255)
Orange: (255,128,0) (143, 116, 62) (254, 144, 31) (255, 125, 0)
Pink: (255,0,128) (140, 81, 108) (254, 41, 136) (255, 0, 131)
Azure: (0,128,255) (90, 110, 148) (46, 140, 249) (0, 128, 251)
Brown: (128,64,0) (99, 78, 33) (126, 66, 10) (127, 61, 0)
Purple: (128,0,64) (97, 47, 70) (128, 16, 58) (128, 0, 61)
Low red: (128,0,0) (96, 46, 21) (124, 15, 5) (127, 0, 0)
Low green: (0,128,0) (76, 109, 49) (30, 157, 19) (0, 129, 0)
Low blue: (0,0,128) (35, 18, 104) (17, 3, 120) (0, 0, 127)
LowestGray: (16,16,16) (25, 28, 25) (8, 11, 9) (8, 8, 8)
Gray1: (32,32,32) (43, 46, 43) (23, 27, 23) (25, 25, 25)
Gray2: (48,48,48) (56, 61, 57) (34, 45, 39) (41, 41, 41)
Gray3: (64,64,64) (69, 73, 70) (51, 64, 57) (58, 58, 58)
Gray4: (96,96,96) (90, 94, 91) (87, 104, 94) (92, 92, 92)
Gray5: (120,120,120) (102, 107, 104) (114, 135, 124) (117, 117, 117)
Gray6: (144,144,144) (113, 118, 114) (139, 164, 150) (140, 140, 140)
Gray7: (172,172,172) (124, 129, 126) (175, 204, 187) (168, 168, 168)
Gray8: (196,196,196) (136, 138, 133) (219, 238, 212) (196, 196, 196)
HighestGray: (220,220,220) (143, 145, 140) (252, 254, 241) (217, 217, 217)
White: (255,255,255) (153, 156, 151) (254, 254, 254) (252, 252, 252)


3.5 Ezcap 331


Good result typical for modern USB grabbers, but the price is high and the built quality is below the average.

New dedicated V18 LUT Old built-in V17 LUT
click to zoom
ezcap331-new ezcap331-old
ezcap331-new2 ezcap331-old2


Our score: 3025 (the lower the better):
Prime color (Red, Green, Blue) Captured color Built-in V17 LUT New dedicated V18 LUT
Red: (255,0,0) (136, 84, 55) (252, 44, 26) (255, 0, 0)
Green: (0,255,0) (118, 148, 89) (89, 253, 58) (0, 255, 9)
Blue: (0,0,255) (74, 51, 145) (46, 21, 242) (0, 0, 255)
Yellow: (255,255,0) (146, 149, 92) (254, 254, 67) (255, 251, 8)
Magenta: (255,0,255) (136, 89, 143) (249, 49, 246) (251, 0, 255)
Cyan: (0,255,255) (121, 148, 146) (101, 254, 253) (0, 254, 255)
Orange: (255,128,0) (139, 116, 69) (252, 149, 37) (255, 123, 0)
Pink: (255,0,128) (134, 86, 108) (246, 47, 137) (248, 1, 130)
Azure: (0,128,255) (93, 111, 145) (50, 142, 247) (0, 127, 255)
Brown: (128,64,0) (102, 83, 44) (133, 74, 17) (130, 61, 0)
Purple: (128,0,64) (99, 56, 75) (131, 22, 65) (127, 0, 61)
Low red: (128,0,0) (99, 55, 33) (131, 22, 12) (128, 0, 0)
Low green: (0,128,0) (84, 109, 58) (39, 153, 26) (0, 125, 0)
Low blue: (0,0,128) (47, 31, 105) (25, 9, 123) (0, 0, 127)
LowestGray: (16,16,16) (38, 40, 37) (17, 22, 19) (14, 14, 14)
Gray1: (32,32,32) (53, 55, 53) (33, 39, 35) (29, 29, 29)
Gray2: (48,48,48) (64, 69, 65) (43, 58, 51) (44, 44, 44)
Gray3: (64,64,64) (74, 79, 76) (60, 75, 67) (59, 59, 59)
Gray4: (96,96,96) (92, 97, 93) (91, 108, 98) (91, 91, 91)
Gray5: (120,120,120) (104, 108, 105) (117, 138, 126) (117, 117, 117)
Gray6: (144,144,144) (113, 118, 114) (139, 164, 150) (140, 140, 140)
Gray7: (172,172,172) (122, 127, 124) (168, 196, 181) (168, 168, 168)
Gray8: (196,196,196) (132, 135, 130) (204, 222, 201) (196, 196, 196)
HighestGray: (220,220,220) (139, 142, 137) (231, 251, 228) (222, 222, 222)
White: (255,255,255) (147, 150, 145) (254, 254, 254) (255, 255, 255)


3.6 Ezcap 320


The manufacturer decided to "improve" the captured HDR stream: it did not achieve its intended purpose, but the image without correction is a bit brighter and the colors a bit more vivid than the competition. However, it made our work much more difficult because the original HDR signal was seriously distorted. Unfortunately, so far we have not been able to determine the inverse function, so that this graber differs from the results of our HDR to SDR conversion from the top.

New dedicated V18 LUT Old built-in V17 LUT
click to zoom
ezcap320-new ezcap320-old
ezcap320-new2 ezcap320-old2


Our score: 15549 (the lower the better):
Prime color (Red, Green, Blue) Captured color Built-in V17 LUT New dedicated V18 LUT
Red: (255,0,0) (202, 59, 28) (254, 13, 9) (255, 0, 0)
Green: (0,255,0) (102, 195, 64) (28, 254, 30) (0, 252, 0)
Blue: (0,0,255) (56, 25, 167) (36, 3, 249) (51, 1, 219)
Yellow: (255,255,0) (191, 193, 71) (254, 254, 43) (252, 239, 0)
Magenta: (255,0,255) (209, 67, 197) (254, 15, 254) (255, 0, 255)
Cyan: (0,255,255) (109, 194, 186) (39, 254, 254) (0, 250, 238)
Orange: (255,128,0) (209, 120, 47) (254, 139, 19) (255, 107, 0)
Pink: (255,0,128) (207, 61, 110) (254, 12, 140) (255, 0, 130)
Azure: (0,128,255) (71, 117, 195) (19, 163, 254) (0, 138, 255)
Brown: (128,64,0) (108, 59, 18) (154, 23, 3) (153, 52, 0)
Purple: (128,0,64) (99, 27, 55) (134, 3, 37) (144, 0, 64)
Low red: (128,0,0) (100, 26, 11) (135, 3, 1) (146, 0, 0)
Low green: (0,128,0) (51, 115, 32) (4, 189, 8) (0, 139, 0)
Low blue: (0,0,128) (32, 16, 131) (15, 1, 192) (5, 2, 166)
LowestGray: (16,16,16) (24, 26, 24) (7, 10, 8) (26, 26, 26)
Gray1: (32,32,32) (29, 36, 31) (9, 18, 12) (34, 34, 34)
Gray2: (48,48,48) (45, 47, 44) (24, 29, 26) (51, 51, 51)
Gray3: (64,64,64) (55, 58, 55) (35, 41, 37) (63, 63, 63)
Gray4: (96,96,96) (84, 89, 83) (74, 93, 78) (98, 98, 98)
Gray5: (120,120,120) (106, 111, 105) (120, 146, 125) (125, 125, 125)
Gray6: (144,144,144) (123, 130, 124) (161, 208, 180) (148, 148, 148)
Gray7: (172,172,172) (141, 151, 142) (240, 254, 251) (172, 172, 172)
Gray8: (196,196,196) (161, 166, 160) (254, 254, 254) (198, 198, 198)
HighestGray: (220,220,220) (172, 177, 172) (254, 254, 254) (215, 215, 215)
White: (255,255,255) (189, 194, 188) (254, 254, 254) (240, 240, 240)


3.7 Ezcap 269


By far the worst grabber for our application and also the oldest phased-out model. Quality is low even when capturing the usual SDR signal, which is very noisy even when using the nearly loss-less YUV codec (MJPEG produces worse result). Nevertheless, the new dedicated LUT improved the situation with respect to the built-in one.

New dedicated V18 LUT Old built-in V17 LUT
click to zoom
ezcap269-new ezcap269-old
ezcap269-new2 ezcap269-old2


Our score: 41726 (the lower the better):
Prime color (Red, Green, Blue) Captured color Built-in V17 LUT New dedicated V18 LUT
Red: (255,0,0) (104, 51, 20) (159, 19, 4) (199,0,0)
Green: (0,255,0) (93, 136, 54) (40, 225, 21) (0,255,0)
Blue: (0,0,255) (50, 17, 140) (30, 6, 239) (0,0,255)
Yellow: (255,255,0) (122, 135, 58) (150, 219, 24) (208,252,0)
Magenta: (255,0,255) (110, 51, 134) (169, 25, 219) (214,0,250)
Cyan: (0,255,255) (101, 134, 126) (50, 221, 186) (0,253,207)
Orange: (255,128,0) (110, 92, 32) (162, 89, 8) (209,107,0)
Pink: (255,0,128) (111, 48, 87) (180, 21, 89) (225,0,106)
Azure: (0,128,255) (72, 84, 133) (30, 83, 215) (16,99,245)
Brown: (128,64,0) (68, 54, 4) (66, 31, 0) (88,42,0)
Purple: (128,0,64) (69, 19, 49) (79, 5, 32) (96,0,40)
Low red: (128,0,0) (66, 22, 0) (73, 4, 0) (90,0,0)
Low green: (0,128,0) (54, 88, 17) (14, 87, 1) (0,114,0)
Low blue: (0,0,128) (29, 6, 105) (14, 1, 129) (0,0,155)
LowestGray: (16,16,16) (20, 20, 20) (6, 6, 6) (6,6,6)
Gray1: (32,32,32) (30, 30, 30) (12, 12, 12) (16,16,16)
Gray2: (48,48,48) (40, 40, 40) (21, 21, 21) (28,28,28)
Gray3: (64,64,64) (49, 49, 49) (30, 30, 30) (41,41,41)
Gray4: (96,96,96) (66, 70, 71) (45, 58, 59) (72,72,72)
Gray5: (120,120,120) (78, 83, 84) (65, 80, 81) (96,96,96)
Gray6: (144,144,144) (90, 94, 95) (87, 102, 104) (122,122,122)
Gray7: (172,172,172) (100, 105, 106) (107, 128, 128)(149,149,149)
Gray8: (196,196,196) (110, 114, 115) (133, 152, 154)(177,177,177)
HighestGray: (220,220,220) (118, 122, 123) (155, 176, 179)(203,203,203)
White: (255,255,255) (127, 132, 132) (180, 211, 210)(236,236,236)


4 Download links

You need to extract LUT table to your '.hyperhdr' folder in the home directory. The folder may be hidden (depends on the OS and the file explorer you use).
If you grabber is not at the list, you can created your own LUT using new automatic calibration tool from latest v18beta1. New LUT will be created in your home folder and overwrite the old one: you don't need to upload anything.

New dedicated LUT tables download:
Av access 4KVC00
Elgato HD60X
Ezcap 269
Ezcap 320
Ezcap 321
Ezcap 331
Navy U3
for MS2109 set brightness to 1, contrast and saturation to 128
MS2109


5 Summary

The new tool allows you to get an almost perfect HDR to SDR conversion result for our needs. Just as you can observe the components for the most important colors are much cleaner and the proportions are much better preserved.
Another surprise is the MS2109 score. If you remember, I was very skeptical: how can the device for $8 be good? Sort of, I was right: it is not good only almost perfect 😉 For excellence, it only lacks USB3.0 support, which makes a little slower compared to other grabers. But you could read about this in the previous test: latency test

Comments

Anonymous said…
Hello! What external hdmi splitter for HDR contend you can recommend?
awawa said…
Hi
Feintech VSP01201 is a proven and stable solution for HDR10, which I currently use with EDID-COPY mode. It is also worth considering EZ-SP12H2: it does not support CEC, may require the firmware update, but has a manual switch to force EDID settings.