@ -26,6 +26,14 @@ void dmonitoring_init(DMonitoringModelState* s) {
s - > is_rhd_checked = false ;
}
template < class T >
static inline T * get_buffer ( std : : vector < T > & buf , const size_t size ) {
if ( buf . size ( ) < size ) {
buf . resize ( size ) ;
}
return buf . data ( ) ;
}
DMonitoringResult dmonitoring_eval_frame ( DMonitoringModelState * s , void * stream_buf , int width , int height ) {
uint8_t * raw_buf = ( uint8_t * ) stream_buf ;
@ -39,8 +47,7 @@ DMonitoringResult dmonitoring_eval_frame(DMonitoringModelState* s, void* stream_
int resized_width = MODEL_WIDTH ;
int resized_height = MODEL_HEIGHT ;
uint8_t * cropped_buf = new uint8_t [ cropped_width * cropped_height * 3 / 2 ] ;
uint8_t * cropped_y_buf = cropped_buf ;
uint8_t * cropped_y_buf = get_buffer ( s - > cropped_buf , cropped_width * cropped_height * 3 / 2 ) ;
uint8_t * cropped_u_buf = cropped_y_buf + ( cropped_width * cropped_height ) ;
uint8_t * cropped_v_buf = cropped_u_buf + ( ( cropped_width / 2 ) * ( cropped_height / 2 ) ) ;
@ -53,8 +60,7 @@ DMonitoringResult dmonitoring_eval_frame(DMonitoringModelState* s, void* stream_
}
} else {
// not tested
uint8_t * premirror_cropped_buf = new uint8_t [ cropped_width * cropped_height * 3 / 2 ] ;
uint8_t * premirror_cropped_y_buf = premirror_cropped_buf ;
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 + + ) {
@ -70,10 +76,9 @@ DMonitoringResult dmonitoring_eval_frame(DMonitoringModelState* s, void* stream_
cropped_u_buf , cropped_width / 2 ,
cropped_v_buf , cropped_width / 2 ,
cropped_width , cropped_height ) ;
delete [ ] premirror_cropped_buf ;
}
uint8_t * resized_buf = new uint8_t [ resized_width * resized_height * 3 / 2 ] ;
uint8_t * resized_buf = get_buffer ( s - > resized_buf , resized_width * resized_height * 3 / 2 ) ;
uint8_t * resized_y_buf = resized_buf ;
uint8_t * resized_u_buf = resized_y_buf + ( resized_width * resized_height ) ;
uint8_t * resized_v_buf = resized_u_buf + ( ( resized_width / 2 ) * ( resized_height / 2 ) ) ;
@ -90,8 +95,7 @@ DMonitoringResult dmonitoring_eval_frame(DMonitoringModelState* s, void* stream_
mode ) ;
int yuv_buf_len = ( MODEL_WIDTH / 2 ) * ( MODEL_HEIGHT / 2 ) * 6 ; // Y|u|v -> y|y|y|y|u|v
float * net_input_buf = new float [ yuv_buf_len ] ;
float * net_input_buf = get_buffer ( s - > net_input_buf , yuv_buf_len ) ;
// one shot conversion, O(n) anyway
// yuvframe2tensor, normalize
for ( int r = 0 ; r < MODEL_HEIGHT / 2 ; r + + ) {
@ -120,10 +124,7 @@ DMonitoringResult dmonitoring_eval_frame(DMonitoringModelState* s, void* stream_
//fwrite(net_input_buf, MODEL_HEIGHT*MODEL_WIDTH*3/2, sizeof(float), dump_yuv_file2);
//fclose(dump_yuv_file2);
delete [ ] cropped_buf ;
delete [ ] resized_buf ;
s - > m - > execute ( net_input_buf , yuv_buf_len ) ;
delete [ ] net_input_buf ;
DMonitoringResult ret = { 0 } ;
memcpy ( & ret . face_orientation , & s - > output [ 0 ] , sizeof ret . face_orientation ) ;