Beispiel #1
0
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;
}
Beispiel #2
0
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 ) );
        }
    }
}