Optimize pure C unscaled yuv2rgb.
Aligning the tables reduces the amount of code generated on e.g. ARM as the offset constant then has few enough set bits so it can be encoded inside a single instruction instead of 2. Ideally all should be declared aligned, but the DECLARE_ALIGNED macros does not work with pointer tables, thus also reordered the tables. Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
This commit is contained in:
		
							parent
							
								
									18802942d1
								
							
						
					
					
						commit
						4fab08c94f
					
				@ -362,9 +362,11 @@ typedef struct SwsContext {
 | 
				
			|||||||
    int dstY;                     ///< Last destination vertical line output from last slice.
 | 
					    int dstY;                     ///< Last destination vertical line output from last slice.
 | 
				
			||||||
    int flags;                    ///< Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
 | 
					    int flags;                    ///< Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
 | 
				
			||||||
    void *yuvTable;             // pointer to the yuv->rgb table start so it can be freed()
 | 
					    void *yuvTable;             // pointer to the yuv->rgb table start so it can be freed()
 | 
				
			||||||
 | 
					    // alignment ensures the offset can be added in a single
 | 
				
			||||||
 | 
					    // instruction on e.g. ARM
 | 
				
			||||||
 | 
					    DECLARE_ALIGNED(16, int, table_gV)[256 + 2*YUVRGB_TABLE_HEADROOM];
 | 
				
			||||||
    uint8_t *table_rV[256 + 2*YUVRGB_TABLE_HEADROOM];
 | 
					    uint8_t *table_rV[256 + 2*YUVRGB_TABLE_HEADROOM];
 | 
				
			||||||
    uint8_t *table_gU[256 + 2*YUVRGB_TABLE_HEADROOM];
 | 
					    uint8_t *table_gU[256 + 2*YUVRGB_TABLE_HEADROOM];
 | 
				
			||||||
    int table_gV[256 + 2*YUVRGB_TABLE_HEADROOM];
 | 
					 | 
				
			||||||
    uint8_t *table_bU[256 + 2*YUVRGB_TABLE_HEADROOM];
 | 
					    uint8_t *table_bU[256 + 2*YUVRGB_TABLE_HEADROOM];
 | 
				
			||||||
    DECLARE_ALIGNED(16, int32_t, input_rgb2yuv_table)[16+40*4]; // This table can contain both C and SIMD formatted values, teh C vales are always at the XY_IDX points
 | 
					    DECLARE_ALIGNED(16, int32_t, input_rgb2yuv_table)[16+40*4]; // This table can contain both C and SIMD formatted values, teh C vales are always at the XY_IDX points
 | 
				
			||||||
#define RY_IDX 0
 | 
					#define RY_IDX 0
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user