Skip to content

Commit c71d341

Browse files
ArcaneNibblemarcan
authored andcommitted
jpeg: Implement YUV10 mode for encoding
Signed-off-by: R <[email protected]>
1 parent 4681053 commit c71d341

2 files changed

Lines changed: 33 additions & 4 deletions

File tree

proxyclient/experiments/jpeg.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,26 @@ def yuv2rgb(y, u, v):
3838
return (r, g, b)
3939

4040

41+
def rgb2yuv(r, g, b):
42+
r /= 255
43+
g /= 255
44+
b /= 255
45+
46+
y = 0.299*r + 0.587*g + 0.114*b
47+
u = -0.14713*r - 0.28886*g + 0.436*b
48+
v = 0.615*r - 0.51499*g - 0.10001*b
49+
50+
y = y * 255 + 16
51+
u = u * 255 + 128
52+
v = v * 255 + 128
53+
54+
y = min(255, max(0, int(y)))
55+
u = min(255, max(0, int(u)))
56+
v = min(255, max(0, int(v)))
57+
58+
return (y, u, v)
59+
60+
4161
ap = argparse.ArgumentParser(description='JPEG block experiment')
4262
ap.add_argument("--jpeg", dest='which_jpeg', type=str, default='jpeg0',
4363
help='which JPEG instance (jpeg0/jpeg1)')
@@ -203,6 +223,7 @@ def yuv2rgb(y, u, v):
203223
'RGB888',
204224
'RGB101010',
205225
'RGB565',
226+
'YUV10',
206227
]
207228
pixfmt = args.encode_pixelfmt
208229

@@ -219,10 +240,15 @@ def yuv2rgb(y, u, v):
219240
image_data += struct.pack("<I", (r << 2) | (g << 12) | (b << 22))
220241
elif pixfmt == 'RGB565':
221242
image_data += struct.pack("<H", (r >> 3) | ((g >> 2) << 5) | ((b >> 3) << 11))
243+
elif pixfmt == 'YUV10':
244+
# absolute garbage color space conversion
245+
# for demonstration purposes only
246+
y_, u_, v_ = rgb2yuv(r, g, b)
247+
image_data += struct.pack("<I", (y_ << 2) | (u_ << 12) | (v_ << 22))
222248
else:
223249
assert False
224250

225-
if pixfmt in ['RGB888', 'RGB101010']:
251+
if pixfmt in ['RGB888', 'RGB101010', 'YUV10']:
226252
BYTESPP = 4
227253
elif pixfmt == 'RGB565':
228254
BYTESPP = 2
@@ -811,7 +837,7 @@ def set_default_regs(param1=0):
811837

812838
jpeg.PX_TILES_W = divroundup(im_W, macroblock_W)
813839
jpeg.PX_TILES_H = divroundup(im_H, macroblock_H)
814-
if pixfmt in ['RGB888', 'RGB101010']:
840+
if pixfmt in ['RGB888', 'RGB101010', 'YUV10']:
815841
if args.encode_subsampling == '444' or args.encode_subsampling == '400':
816842
jpeg.PX_PLANE0_TILING_H = 4
817843
jpeg.PX_PLANE0_TILING_V = 8
@@ -863,7 +889,8 @@ def set_default_regs(param1=0):
863889
jpeg.REG_0x20c = im_W
864890
jpeg.REG_0x210 = im_H
865891

866-
jpeg.CONVERT_COLOR_SPACE = 1
892+
if pixfmt in ['RGB888', 'RGB101010', 'RGB565']:
893+
jpeg.CONVERT_COLOR_SPACE = 1
867894
jpeg.MATRIX_MULT[0].val = 0x4d
868895
jpeg.MATRIX_MULT[1].val = 0x96
869896
jpeg.MATRIX_MULT[2].val = 0x1d
@@ -882,6 +909,8 @@ def set_default_regs(param1=0):
882909
jpeg.ENCODE_PIXEL_FORMAT.set(FORMAT=E_ENCODE_PIXEL_FORMAT.RGB101010)
883910
elif pixfmt == 'RGB565':
884911
jpeg.ENCODE_PIXEL_FORMAT.set(FORMAT=E_ENCODE_PIXEL_FORMAT.RGB565)
912+
elif pixfmt == 'YUV10':
913+
jpeg.ENCODE_PIXEL_FORMAT.set(FORMAT=E_ENCODE_PIXEL_FORMAT.YUV10_linear)
885914
else:
886915
assert False
887916
jpeg.ENCODE_COMPONENT0_POS = 0

proxyclient/m1n1/hw/jpeg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class R_CODEC(Register32):
2828

2929
class E_ENCODE_PIXEL_FORMAT(IntEnum):
3030
RGB101010 = 0
31-
YUV10_linear = 1 # partially tested, details not understood
31+
YUV10_linear = 1
3232
RGB888 = 2
3333
RGB565 = 3
3434
YUV_planar = 4 # partially tested, details not understood

0 commit comments

Comments
 (0)