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); }
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(); }