@@ -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+
4161ap = argparse .ArgumentParser (description = 'JPEG block experiment' )
4262ap .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
0 commit comments