bool menu_iterate(retro_input_t input, retro_input_t old_input, retro_input_t trigger_input) { unsigned action = MENU_ACTION_NOOP; static bool initial_held = true; static bool first_held = false; uint64_t input_state = 0; int32_t ret = 0; if (!driver.menu) return false; #ifdef HAVE_OVERLAY if (BIND_PRESSED(trigger_input, RARCH_OVERLAY_NEXT)) input_overlay_next(driver.overlay); #endif check_fullscreen_func(trigger_input); driver.retro_ctx.poll_cb(); input_state = menu_input(); if (driver.menu->do_held) { if (!first_held) { first_held = true; driver.menu->delay_timer = initial_held ? 12 : 6; driver.menu->delay_count = 0; } if (driver.menu->delay_count >= driver.menu->delay_timer) { first_held = false; driver.menu->trigger_state = input_state; driver.menu->scroll_accel = min(driver.menu->scroll_accel + 1, 64); } initial_held = false; } else { first_held = false; initial_held = true; driver.menu->scroll_accel = 0; } driver.menu->delay_count++; driver.menu->old_input_state = input_state; if (driver.block_input) driver.menu->trigger_state = 0; /* don't run anything first frame, only capture held inputs * for old_input_state. */ action = input_frame(driver.menu->trigger_state); if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->iterate) ret = driver.menu_ctx->backend->iterate(action); draw_frame(true); throttle_frame(); draw_frame(false); if (driver.menu_ctx && driver.menu_ctx->input_postprocess) driver.menu_ctx->input_postprocess(driver.menu->old_input_state); #if 0 /* Go back to Main Menu when exiting */ if (ret < 0) menu_flush_stack_type(driver.menu->menu_stack, MENU_SETTINGS); #endif if (ret) return false; return true; }
void ProcessThread::own_thread() { enum class Format { UNKNOWN, RAW8, RAW16, MJPEG, YUYV, BGR8 }; Format format = Format::UNKNOWN; int cv_format = CV_MAKETYPE( CV_8U, 1 ); sepia::Stream::image_header_t* hdr = m_input->getHeader( m_id ); switch( hdr->fourcc ) { case 0x00000000: if( hdr->bpp == 8 ) { format = Format::RAW8; cv_format = CV_MAKETYPE( CV_8U, 1 ); } else if( hdr->bpp == 16 ) { format = Format::RAW16; cv_format = CV_MAKETYPE( CV_16U, 1 ); } else if( hdr->bpp == 24 ) { format = Format::BGR8; cv_format = CV_MAKETYPE( CV_8U, 3 ); } break; case FOURCC( 'M', 'J', 'P', 'G'): format = Format::MJPEG; cv_format = CV_MAKETYPE( CV_8U, 3 ); // format after conversion break; default: break; } cv::Mat input_frame( m_input->getHeader( m_id )->height, m_input->getHeader( m_id )->width, cv_format, m_input->getAddress( m_id ) ); cv::Mat converted_frame( m_output->getHeader( m_id )->height, m_output->getHeader( m_id )->width, CV_8UC3 ); if( m_rectifier == NULL ) { converted_frame.data = reinterpret_cast< unsigned char* >( m_output->getAddress( m_id ) ); } cv::Mat rectified_frame( m_output->getHeader( m_id )->height, m_output->getHeader( m_id )->width, CV_8UC3, m_output->getAddress( m_id ) ); JpegDecoder decoder; while( !m_terminate ) { if( format == Format::RAW8 || format == Format::RAW16 ) { cv::demosaicing( input_frame, converted_frame, cv::COLOR_BayerBG2BGR_EA ); } else if( format == Format::MJPEG ) { // perform JPEG decode here decoder.readHeader( reinterpret_cast< unsigned char* >( input_frame.data ), m_input->getHeader( m_id )->size ); decoder.readData( reinterpret_cast< unsigned char* >( converted_frame.data ), m_input->getHeader( m_id )->width * 3, true ); } else { } if( m_rectifier != NULL ) { if( m_id == 0 ) { m_rectifier->remapLeft( &converted_frame, &rectified_frame ); } else if( m_id == 1 ) { m_rectifier->remapRight( &converted_frame, &rectified_frame ); } } m_barrier->wait(); if( m_id == 0 ) { m_output->update(); m_input->update(); } m_barrier->wait(); input_frame.data = reinterpret_cast< unsigned char* >( m_input->getAddress( m_id ) ); if( m_rectifier != NULL ) { rectified_frame.data = reinterpret_cast< unsigned char* >( m_output->getAddress( m_id ) ); } else { converted_frame.data = reinterpret_cast< unsigned char* >( m_output->getAddress( m_id ) ); } } }