bool DisplayDevice::vsyncControl(int enabled)
{
    struct drm_psb_vsync_set_arg arg;
    Drm& drm(Drm::getInstance());
    bool ret;

    log.v("vsyncControl");

    if (!initCheck())
        return false;

    //Mutex::Autolock _l(mLock);

    if (mConnection != DEVICE_CONNECTED)
        return false;

    memset(&arg, 0, sizeof(struct drm_psb_vsync_set_arg));
    arg.vsync.pipe = mType;
    if (enabled)
        arg.vsync_operation_mask = VSYNC_ENABLE;
    else
        arg.vsync_operation_mask = VSYNC_DISABLE;

    log.v("DisplayDevice::vsyncControl: disp %d, enabled %d", mType, enabled);

    ret = drm.writeReadIoctl(DRM_PSB_VSYNC_SET, &arg, sizeof(arg));
    if (ret == false) {
        log.e("DisplayDevice::vsyncControl: failed set vsync");
        return false;
    }

    mVsyncObserver->control(enabled);
    return true;
}
bool DisplayDevice::detectDisplayConfigs()
{
    int outputIndex = -1;
    struct Output *output;
    bool ret;
    Drm& drm(Drm::getInstance());

    log.d("detectDisplayConfigs");

    // detect drm objects
    switch (mType) {
    case DEVICE_PRIMARY:
        outputIndex = Drm::OUTPUT_MIPI0;
        break;
    case DEVICE_EXTERNAL:
        outputIndex = Drm::OUTPUT_HDMI;
        break;
    case DEVICE_VIRTUAL:
        return true;
    }

    if (outputIndex < 0) {
        log.w("detectDisplayConfigs(): failed to detect Drm objects");
        return false;
    }

    // detect
    ret = drm.detect();
    if (ret == false) {
        log.e("detectDisplayConfigs(): Drm detection failed");
        return false;
    }

    // get output
    output = drm.getOutput(outputIndex);
    if (!output) {
        log.e("detectDisplayConfigs(): failed to get output");
        return false;
    }


    // update display configs
    return updateDisplayConfigs(output);
}
Example #3
0
   void Dering( GenericImage<P>& i1, const GenericImage<P>& i0 )
   {
      i1.Status().Initialize( "Applying deringing routine", 12*i1.NumberOfNominalSamples() );
      i1.Status().DisableInitialization();

      float kd = 10 * instance.deringingDark;
      float kb = 10 * instance.deringingBright;

      i1.ResetSelections();
      i1.SelectNominalChannels();

      typename P::sample pmin = i1.MinimumPixelValue();
      if ( pmin < 0 )
         pmin = -pmin;
      pmin += 0.001F;

      i1 += pmin;  // N*n

      Image drm( i1 );

      size_type N = drm.NumberOfPixels();

      for ( int c = 0; c < drm.NumberOfChannels(); ++c )
      {
         float* f = drm[c];
         const float* fN = f + N;
         const typename P::sample* g = i0[c];
         do
            *f++ /= (*g++ + pmin);
         while ( f != fN );

         drm.Status() += N;   // N*n
      }

      drm.Rescale();          // N*n

      float median[ 3 ];
      for ( int c = 0; c < drm.NumberOfChannels(); ++c )
      {
         drm.SelectChannel( c );

         Image tmp( drm );
         size_type N2 = N >> 1;
         if ( N & 1 )
            median[c] = *pcl::Select( *tmp, *tmp + N, N2 );
         else
         {
            Sort( *tmp, *tmp + N );
            median[c] = 0.5*((*tmp)[N2] + (*tmp)[N2-1]);
         }

         drm.Status() += N;   // N*n
      }

      drm.ResetSelections();

      Image drm0;
      if ( kd > 0 && kb > 0 )
         drm0 = drm;

      if ( kd > 0 )
      {
         drm.Invert();           // N*n

         for ( int c = 0; c < drm.NumberOfChannels(); ++c )
         {
            drm.SelectChannel( c );

            drm.Sub( 1 - median[c] );   // N*n
            drm.Truncate();         // N*n

            typename P::sample* f = i1[c];
            const typename P::sample* fN = f + N;
            const float* d = drm[c];
            do
               *f++ += kd * *d++;
            while ( f != fN );

            drm.Status() += N;   // N*n
         }

         drm.ResetSelections();
         drm.SelectNominalChannels();

         if ( instance.outputDeringingMaps )
         {
            ImageWindow window( drm.Width(), drm.Height(), drm.NumberOfChannels(), 32, true, drm.IsColor(), true, "dr_map_dark" );
            window.MainView().Image().CopyImage( drm );
            window.Show();
         }

         if ( kb > 0 )
         {
            drm0.Status() = drm.Status();
            drm = drm0;
            drm0.FreeData();
         }
      }
      else
         drm.Status() += 4*N*drm.NumberOfChannels();

      if ( kb > 0 )
      {
         for ( int c = 0; c < drm.NumberOfChannels(); ++c )
         {
            drm.SelectChannel( c );

            drm.Sub( median[c] );   // N*n
            drm.Truncate();         // N*n

            typename P::sample* f = i1[c];
            const typename P::sample* fN = f + N;
            const float* d = drm[c];
            do
               *f++ -= kb * *d++;
            while ( f != fN );

            drm.Status() += N;   // N*n
         }

         drm.ResetSelections();
         drm.SelectNominalChannels();

         if ( instance.outputDeringingMaps )
         {
            ImageWindow window( drm.Width(), drm.Height(), drm.NumberOfChannels(), 32, true, drm.IsColor(), true, "dr_map_bright" );
            window.MainView().Image().CopyImage( drm );
            window.Show();
         }
      }
      else
         drm.Status() += 3*N*drm.NumberOfChannels();

      i1.Status() = drm.Status();
      i1.ResetSelections();
      i1.SelectNominalChannels();

      i1 -= pmin;  // N*n

      i1.Status().EnableInitialization();
   }