@ -8,7 +8,7 @@
# define MODEL_WIDTH 320
# define MODEL_HEIGHT 640
# define FULL_W 852
# define FULL_W 852 // should get these numbers from camerad
# if defined(QCOM) || defined(QCOM2)
# define input_lambda(x) (x - 128.f) * 0.0078125f
@ -22,7 +22,12 @@ void dmonitoring_init(DMonitoringModelState* s) {
# else
const char * model_path = " ../../models/dmonitoring_model.dlc " ;
# endif
s - > m = new DefaultRunModel ( model_path , ( float * ) & s - > output , OUTPUT_SIZE , USE_DSP_RUNTIME ) ;
# ifdef QCOM2
int runtime = USE_CPU_RUNTIME ;
# else
int runtime = USE_DSP_RUNTIME ;
# endif
s - > m = new DefaultRunModel ( model_path , ( float * ) & s - > output , OUTPUT_SIZE , runtime ) ;
s - > is_rhd = read_db_bool ( " IsRHD " ) ;
}
@ -35,14 +40,31 @@ static inline T *get_buffer(std::vector<T> &buf, const size_t size) {
}
DMonitoringResult dmonitoring_eval_frame ( DMonitoringModelState * s , void * stream_buf , int width , int height ) {
uint8_t * raw_buf = ( uint8_t * ) stream_buf ;
uint8_t * raw_y_buf = raw_buf ;
uint8_t * raw_u_buf = raw_y_buf + ( width * height ) ;
uint8_t * raw_v_buf = raw_u_buf + ( ( width / 2 ) * ( height / 2 ) ) ;
int cropped_width = height / 2 ;
int cropped_height = height ;
# ifndef QCOM2
const int cropped_width = height / 2 ;
const int cropped_height = height ;
const int global_x_offset = 0 ;
const int global_y_offset = 0 ;
const int crop_x_offset = width - cropped_width ;
const int crop_y_offset = 0 ;
# else
const int full_width_tici = 1928 ;
const int full_height_tici = 1208 ;
const int adapt_width_tici = 808 ;
const int cropped_height = adapt_width_tici / 1.33 ;
const int cropped_width = cropped_height / 2 ;
const int global_x_offset = full_width_tici / 2 - adapt_width_tici / 2 ;
const int global_y_offset = full_height_tici / 2 - cropped_height / 2 ;
const int crop_x_offset = adapt_width_tici - cropped_width ;
const int crop_y_offset = 0 ;
# endif
int resized_width = MODEL_WIDTH ;
int resized_height = MODEL_HEIGHT ;
@ -52,22 +74,21 @@ DMonitoringResult dmonitoring_eval_frame(DMonitoringModelState* s, void* stream_
uint8_t * cropped_v_buf = cropped_u_buf + ( ( cropped_width / 2 ) * ( cropped_height / 2 ) ) ;
if ( ! s - > is_rhd ) {
for ( int r = 0 ; r < height / 2 ; r + + ) {
memcpy ( cropped_y_buf + 2 * r * cropped_width , raw_y_buf + 2 * r * width + ( width - cropped_width ) , cropped_width ) ;
memcpy ( cropped_y_buf + ( 2 * r + 1 ) * cropped_width , raw_y_buf + ( 2 * r + 1 ) * width + ( width - cropped_width ) , cropped_width ) ;
memcpy ( cropped_u_buf + r * cropped_width / 2 , raw_u_buf + r * width / 2 + ( ( width / 2 ) - ( cropped_width / 2 ) ) , cropped_width / 2 ) ;
memcpy ( cropped_v_buf + r * cropped_width / 2 , raw_v_buf + r * width / 2 + ( ( width / 2 ) - ( cropped_width / 2 ) ) , cropped_width / 2 ) ;
for ( int r = 0 ; r < cropped_ height/ 2 ; r + + ) {
memcpy ( cropped_y_buf + 2 * r * cropped_width , raw_y_buf + ( 2 * r + global_y_offset + crop_y_offset ) * width + global_x_offset + crop_x_offset , cropped_width ) ;
memcpy ( cropped_y_buf + ( 2 * r + 1 ) * cropped_width , raw_y_buf + ( 2 * r + global_y_offset + crop_y_offset + 1 ) * width + global_x_offset + crop_x_offset , cropped_width ) ;
memcpy ( cropped_u_buf + r * cropped_width / 2 , raw_u_buf + ( r + ( global_y_offset + crop_y_offset ) / 2 ) * width / 2 + ( global_x_offset + crop_x_offset ) / 2 , cropped_width / 2 ) ;
memcpy ( cropped_v_buf + r * cropped_width / 2 , raw_v_buf + ( r + ( global_y_offset + crop_y_offset ) / 2 ) * width / 2 + ( global_x_offset + crop_x_offset ) / 2 , cropped_width / 2 ) ;
}
} else {
// not tested
uint8_t * premirror_cropped_y_buf = get_buffer ( s - > premirror_cropped_buf , cropped_width * cropped_height * 3 / 2 ) ;
uint8_t * premirror_cropped_u_buf = premirror_cropped_y_buf + ( cropped_width * cropped_height ) ;
uint8_t * premirror_cropped_v_buf = premirror_cropped_u_buf + ( ( cropped_width / 2 ) * ( cropped_height / 2 ) ) ;
for ( int r = 0 ; r < height / 2 ; r + + ) {
memcpy ( premirror_cropped_y_buf + 2 * r * cropped_width , raw_y_buf + 2 * r * width , cropped_width ) ;
memcpy ( premirror_cropped_y_buf + ( 2 * r + 1 ) * cropped_width , raw_y_buf + ( 2 * r + 1 ) * width , cropped_width ) ;
memcpy ( premirror_cropped_u_buf + r * cropped_width / 2 , raw_u_buf + r * width / 2 , cropped_width / 2 ) ;
memcpy ( premirror_cropped_v_buf + r * cropped_width / 2 , raw_v_buf + r * width / 2 , cropped_width / 2 ) ;
memcpy ( premirror_cropped_y_buf + ( 2 * r ) * cropped_width , raw_y_buf + ( 2 * r + global_y_offset + crop_y_offset ) * width + global_x_offset , cropped_width ) ;
memcpy ( premirror_cropped_y_buf + ( 2 * r + 1 ) * cropped_width , raw_y_buf + ( 2 * r + global_y_offset + crop_y_offset + 1 ) * width + global_x_offset , cropped_width ) ;
memcpy ( premirror_cropped_u_buf + r * cropped_width / 2 , raw_u_buf + ( r + ( global_y_offset + crop_y_offset ) / 2 ) * width / 2 + global_x_offset / 2 , cropped_width / 2 ) ;
memcpy ( premirror_cropped_v_buf + r * cropped_width / 2 , raw_v_buf + ( r + ( global_y_offset + crop_y_offset ) / 2 ) * width / 2 + global_x_offset / 2 , cropped_width / 2 ) ;
}
libyuv : : I420Mirror ( premirror_cropped_y_buf , cropped_width ,
premirror_cropped_u_buf , cropped_width / 2 ,