# if SENSOR_ID == 3
# define BGGR
# define BIT_DEPTH 10
# define PV_MAX10 1023
# define PV_MAX16 65536 // gamma curve is calibrated to 16bit
# define BLACK_LVL 64
# define VIGNETTE_RSZ 2.2545f
float combine_dual_pvs ( float lv , float sv , int expo_time ) {
float svc = fmax ( sv * expo_time , ( float ) ( 64 * ( PV_MAX10 - BLACK_LVL ) ) ) ;
float svd = sv * fmin ( expo_time , 8.0 ) / 8 ;
if ( expo_time > 64 ) {
if ( lv < PV_MAX10 - BLACK_LVL ) {
return lv / ( PV_MAX16 - BLACK_LVL ) ;
} else {
return ( svc / 64 ) / ( PV_MAX16 - BLACK_LVL ) ;
}
} else {
if ( lv > 32 ) {
return ( lv * 64 / fmax ( expo_time , 8.0 ) ) / ( PV_MAX16 - BLACK_LVL ) ;
} else {
return svd / ( PV_MAX16 - BLACK_LVL ) ;
}
}
}
float4 normalize_pv_hdr ( int4 parsed , int4 short_parsed , float vignette_factor , int expo_time ) {
float4 pl = convert_float4 ( parsed - BLACK_LVL ) ;
float4 ps = convert_float4 ( short_parsed - BLACK_LVL ) ;
float4 pv ;
pv . s0 = combine_dual_pvs ( pl . s0 , ps . s0 , expo_time ) ;
pv . s1 = combine_dual_pvs ( pl . s1 , ps . s1 , expo_time ) ;
pv . s2 = combine_dual_pvs ( pl . s2 , ps . s2 , expo_time ) ;
pv . s3 = combine_dual_pvs ( pl . s3 , ps . s3 , expo_time ) ;
return clamp ( pv * vignette_factor , 0.0 , 1.0 ) ;
}
float3 color_correct ( float3 rgb ) {
float3 corrected = rgb . x * ( float3 ) ( 1.55361989 , - 0.268894615 , - 0.000593219 ) ;
corrected + = rgb . y * ( float3 ) ( - 0.421217301 , 1.51883144 , - 0.69760146 ) ;
corrected + = rgb . z * ( float3 ) ( - 0.132402589 , - 0.249936825 , 1.69819468 ) ;
return corrected ;
}
float3 apply_gamma ( float3 rgb , int expo_time ) {
float s = log2 ( ( float ) expo_time ) ;
if ( s < 6 ) { s = fmin ( 12.0 - s , 9.0 ) ; }
// log function adaptive to number of bits
return clamp ( log ( 1 + rgb * ( PV_MAX16 - BLACK_LVL ) ) * ( 0.48 * s * s - 12.92 * s + 115.0 ) - ( 1.08 * s * s - 29.2 * s + 260.0 ) , 0.0 , 255.0 ) / 255.0 ;
}
# endif