From 7167b9737c86f1c2430258b657b45c674958ad9b Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 2 Nov 2021 19:31:04 +0100 Subject: [PATCH 1/8] [ADM_flyDialog] add analyzer option --- .../qt4/ADM_UIs/include/DIA_flyDialogQt4.h | 44 +- avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp | 623 ++++++++++++++++++ 2 files changed, 664 insertions(+), 3 deletions(-) diff --git a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h index dcb6cc96c1..c885cbbea7 100644 --- a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h +++ b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include "ADM_default.h" #include "ADM_rgb.h" @@ -53,9 +55,10 @@ enum class ControlOption { None = 0, PeekOriginalBtn = 1 << 0, - UserWidgetAfterControls = 1 << 1, - UserWidgetBeforePeekBtn = 1 << 2, - UserWidgetAfterPeekBtn = 1 << 3 + AnalyzerBtn = 1 << 1, + UserWidgetAfterControls = 1 << 2, + UserWidgetBeforePeekBtn = 1 << 3, + UserWidgetAfterPeekBtn = 1 << 4 }; inline ControlOption operator|(ControlOption a, ControlOption b) @@ -94,6 +97,7 @@ class ADM_UIQT46_EXPORT ADM_QCanvas : public QWidget }; class flyControl; +class flyDialogsAnalyzer; /** \class ADM_flyDialog \brief Base class for flyDialog @@ -124,6 +128,10 @@ class ADM_UIQT46_EXPORT ADM_flyDialog : public QObject std::vector buttonList; // useful for manipulating tab order QDialog *_parent; bool _bypassFilter; + // Analyzer + bool _analyze; + QGraphicsScene * _analyzerScenes[4]; + flyDialogsAnalyzer * _flyanal; @@ -187,6 +195,8 @@ public slots: virtual void backOneMinute(void); virtual void fwdOneMinute(void); virtual void play(bool status); + virtual void analyzerReleased(void); + virtual void analyzerClosed(void); virtual void peekOriginalPressed(void); virtual void peekOriginalReleased(void); virtual void timeout(void); @@ -308,4 +318,32 @@ class ADM_UIQT46_EXPORT ADM_rubberControl : public QWidget void mouseMoveEvent(QMouseEvent *); }; +class ADM_UIQT46_EXPORT flyDialogsAnalyzer +{ + private: + int width, height; + int rgbBufStride; + ADM_byteBuffer * rgbBufRaw; + ADMColorScalerFull * convertYuvToRgb; + uint32_t * wrkVectorScope; + uint32_t * bufVectorScope; + uint32_t * scaleVectorScope; + QImage * imgVectorScope; + uint32_t * wrkYUVparade[3]; + uint32_t * bufYUVparade; + QImage * imgYUVparade; + uint32_t * wrkRGBparade[3]; + uint32_t * bufRGBparade; + QImage * imgRGBparade; + uint32_t * wrkHistograms[6]; + uint32_t * bufHistograms; + QImage * imgHistograms; + int * paradeIndex; + int * paradeIndexHalf; + public: + flyDialogsAnalyzer(int width, int height); + virtual ~flyDialogsAnalyzer() ; + void analyze(ADMImage *in, QGraphicsScene * sceneVectorScope, QGraphicsScene * sceneYUVparade, QGraphicsScene * sceneRGBparade, QGraphicsScene * sceneHistograms); +}; + //EOF diff --git a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp index a8a0578df2..f701b2fb13 100644 --- a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp +++ b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp @@ -93,6 +93,19 @@ class flyControl QSpacerItem *horizontalSpacer_4 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout_4->addItem(horizontalSpacer_4); + if (controlOptions & ControlOption::AnalyzerBtn) + { + pushButton_analyzer = new QPushButton(); + pushButton_analyzer->setObjectName(QString("pushButton_analyzer")); + pushButton_analyzer->setAutoRepeat(false); + pushButton_analyzer->setText(QApplication::translate("seekablePreviewDialog", "Analyzer", 0)); + pushButton_analyzer->setToolTip(QApplication::translate("seekablePreviewDialog", "Show scopes", 0)); + + horizontalLayout_4->addWidget(pushButton_analyzer); + } + else + pushButton_analyzer = NULL; + if (controlOptions & ControlOption::UserWidgetBeforePeekBtn) { ADM_assert(userWidget != NULL); @@ -149,6 +162,7 @@ class flyControl QPushButton *pushButton_fwd1mn; QLineEdit *currentTime; QLabel *labelDuration; + QPushButton *pushButton_analyzer; QPushButton *pushButton_peekOriginal; }; @@ -249,6 +263,7 @@ uint8_t ADM_flyDialog::cleanup(void) */ ADM_flyDialog::~ADM_flyDialog(void) { + delete _flyanal; cleanup(); } @@ -306,6 +321,11 @@ bool ADM_flyDialog::addControl(QHBoxLayout *horizontalLayout_4, ControlOp QObject::connect(_control->pushButton_back1mn ,SIGNAL(clicked()),this,SLOT(backOneMinute())); QObject::connect(_control->pushButton_fwd1mn ,SIGNAL(clicked()),this,SLOT(fwdOneMinute())); QObject::connect(_control->pushButton_play ,SIGNAL(toggled(bool )),this,SLOT(play(bool))); + + if (controlOptions & ControlOption::AnalyzerBtn) + { + QObject::connect(_control->pushButton_analyzer ,SIGNAL(released()),this,SLOT(analyzerReleased())); + } if (controlOptions & ControlOption::PeekOriginalBtn) { QObject::connect(_control->pushButton_peekOriginal ,SIGNAL(pressed()),this,SLOT(peekOriginalPressed())); @@ -320,6 +340,8 @@ bool ADM_flyDialog::addControl(QHBoxLayout *horizontalLayout_4, ControlOp buttonList.push_back(_control->currentTime); if ((controlOptions & ControlOption::UserWidgetAfterControls) && (userWidget != NULL)) buttonList.push_back(userWidget); + if (controlOptions & ControlOption::AnalyzerBtn) + buttonList.push_back(_control->pushButton_analyzer); if ((controlOptions & ControlOption::UserWidgetBeforePeekBtn) && (userWidget != NULL)) buttonList.push_back(userWidget); if (controlOptions & ControlOption::PeekOriginalBtn) @@ -512,8 +534,12 @@ bool ADM_flyDialogYuv::process(void) if (_bypassFilter) { yuvToRgb->convertImage(_yuvBuffer,_rgbByteBufferDisplay.at(0)); + if (_analyze) + _flyanal->analyze(_yuvBuffer,_analyzerScenes[0],_analyzerScenes[1],_analyzerScenes[2],_analyzerScenes[3]); } else { processYuv(_yuvBuffer,_yuvBufferOut); + if (_analyze) + _flyanal->analyze(_yuvBufferOut,_analyzerScenes[0],_analyzerScenes[1],_analyzerScenes[2],_analyzerScenes[3]); yuvToRgb->convertImage(_yuvBufferOut,_rgbByteBufferDisplay.at(0)); } return true; @@ -656,6 +682,9 @@ bool FlyDialogEventFilter::eventFilter(QObject *obj, QEvent *event) _in->goToTime(lastPts); updateSlider(); _bypassFilter=false; + _analyze=false; + _analyzerScenes[0]=_analyzerScenes[1]=_analyzerScenes[2]=_analyzerScenes[3]=NULL; + _flyanal = new flyDialogsAnalyzer(width,height); QGraphicsScene *sc=new QGraphicsScene(this); sc->setBackgroundBrush(QBrush(Qt::darkGray, Qt::SolidPattern)); @@ -900,6 +929,50 @@ void ADM_flyDialog::play(bool state) } } +/** + * + */ +void ADM_flyDialog::analyzerReleased(void) +{ + _analyze=true; + _control->pushButton_analyzer->setEnabled(false); + if (_analyze) + { + QDialog * dialog=new QDialog(_parent); + QVBoxLayout * vboxlayout = new QVBoxLayout(dialog); + dialog->setWindowTitle(QApplication::translate("seekablePreviewDialog", "Analyzer", 0)); + dialog->setAttribute(Qt::WA_DeleteOnClose); + QGraphicsView * gv[4]; + for (int i=0; i<4; i++) + { + gv[i] = new QGraphicsView(dialog); + gv[i]->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + gv[i]->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + gv[i]->setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing); + gv[i]->setBackgroundBrush(QBrush(Qt::black,Qt::SolidPattern)); + _analyzerScenes[i] = new QGraphicsScene(dialog); + if (i==0) + _analyzerScenes[i]->setSceneRect(0,0,620,600); + else if (i<=2) + _analyzerScenes[i]->setSceneRect(0,0,772,258); + else + _analyzerScenes[i]->setSceneRect(0,0,772,259); + gv[i]->setScene(_analyzerScenes[i]); + gv[i]->scale(0.5,0.5); + vboxlayout->addWidget(gv[i]); + } + dialog->setLayout(vboxlayout); + QObject::connect(dialog ,SIGNAL(destroyed()),this,SLOT(analyzerClosed())); + dialog->show(); + } + this->sameImage(); +} +void ADM_flyDialog::analyzerClosed(void) +{ + _analyze = false; + _analyzerScenes[0]=_analyzerScenes[1]=_analyzerScenes[2]=_analyzerScenes[3]=NULL; + _control->pushButton_analyzer->setEnabled(true); +} /** * */ @@ -955,6 +1028,556 @@ void ADM_flyDialog::timeout(void) } } +/** + * + */ +flyDialogsAnalyzer::flyDialogsAnalyzer(int width, int height) +{ + this->width = width; + this->height = height; + wrkVectorScope = new uint32_t [256*256]; + bufVectorScope = new uint32_t [620*600]; + scaleVectorScope = new uint32_t [620*600]; + imgVectorScope = new QImage((uchar *)bufVectorScope, 620, 600, 620*sizeof(uint32_t), QImage::Format_RGB32); + + for (int y=0; y<600; y++) + { + for (int x=0; x<620; x++) + { + double xc = x-(64.0+256.0); + double yc = y-(44.0+256.0); + double r = std::sqrt(xc*xc + yc*yc); + uint32_t c = 0; + if ((r <= 300.0) && (r >= 284.0)) // hue ring + { + xc *= 127.0/r; + yc *= 127.0/r; + yc *= -1.0; + r = (8.0-std::abs(r-292.0))/8.0; // 0..1..0 triangle + r = std::sqrt(r); // nonlinearity + r *= 166; + if (r > 128.0) + r = 128.0; + int rgb[3]; + rgb[0] = std::round(r + 1.4*yc); + rgb[1] = std::round(r - 0.343*xc - 0.711*yc); + rgb[2] = std::round(r + 1.765*xc ); + for (int i=0; i<3; i++) + { + if (rgb[i] < 0) rgb[i] = 0; + if (rgb[i] > 255) rgb[i] = 255; + } + c = (rgb[0]<<16) + (rgb[1]<<8) + rgb[2]; + } + + for (int pri=1; pri<=6; pri++) + { + int rgb[3]; + rgb[0] = (pri&1)? 1:0; + rgb[1] = (pri&2)? 1:0; + rgb[2] = (pri&4)? 1:0; + double u = 64 + 256 + 2*224.0*(-0.1146*rgb[0] + -0.3854*rgb[1] + 0.5 *rgb[2]); + double v = 44 + 256 - 2*224.0*( 0.5 *rgb[0] + -0.4542*rgb[1] + -0.0458*rgb[2]); + u = x-u; + v = y-v; + r = std::sqrt(u*u + v*v); + if ((r <= 16.1) && (r >= 13.3)) + { + c = 0; + if (pri&1) + c += 0xFF0000; + if (pri&2) + c += 0x00FF00; + if (pri&4) + c += 0x0000FF; + } + } + + scaleVectorScope[y*620+x] = c; + } + } + + for (int i=0; i<3; i++) + wrkYUVparade[i] = new uint32_t [256*256]; + bufYUVparade = new uint32_t [772*258]; + imgYUVparade = new QImage((uchar *)bufYUVparade, 772, 258, 772*sizeof(uint32_t), QImage::Format_RGB32); + + for (int i=0; i<3; i++) + wrkRGBparade[i] = new uint32_t [256*256]; + bufRGBparade = new uint32_t [772*258]; + imgRGBparade = new QImage((uchar *)bufRGBparade, 772, 258, 772*sizeof(uint32_t), QImage::Format_RGB32); + + for (int i=0; i<6; i++) + wrkHistograms[i] = new uint32_t [256]; + bufHistograms = new uint32_t [772*259]; + imgHistograms = new QImage((uchar *)bufHistograms, 772, 259, 772*sizeof(uint32_t), QImage::Format_RGB32); + + paradeIndex = new int [width]; + for (int i=0; i 255) + paradeIndex[i] = 255; + } + paradeIndexHalf = new int [width/2]; + for (int i=0; i 255) + paradeIndexHalf[i] = 255; + } + + rgbBufStride = ADM_IMAGE_ALIGN(width * 4); + rgbBufRaw = new ADM_byteBuffer(); + rgbBufRaw->setSize(rgbBufStride * height); + convertYuvToRgb = new ADMColorScalerFull(ADM_CS_BILINEAR,width,height,width,height,ADM_PIXFRMT_YV12,ADM_PIXFRMT_RGB32A); +} +/** + * + */ +flyDialogsAnalyzer::~flyDialogsAnalyzer() +{ + delete [] wrkVectorScope; + delete [] bufVectorScope; + delete [] scaleVectorScope; + delete imgVectorScope; + for (int i=0; i<3; i++) + delete [] wrkYUVparade[i]; + delete [] bufYUVparade; + delete imgYUVparade; + for (int i=0; i<3; i++) + delete [] wrkRGBparade[i]; + delete [] bufRGBparade; + delete imgRGBparade; + for (int i=0; i<6; i++) + delete [] wrkHistograms[i]; + delete [] bufHistograms; + delete imgHistograms; + + delete [] paradeIndex; + delete [] paradeIndexHalf; + + delete convertYuvToRgb; + rgbBufRaw->clean(); + delete rgbBufRaw; + +} +/** + * + */ +void flyDialogsAnalyzer::analyze(ADMImage *in, QGraphicsScene * sceneVectorScope, QGraphicsScene * sceneYUVparade, QGraphicsScene * sceneRGBparade, QGraphicsScene * sceneHistograms) +{ + if (in == NULL) return; + if (sceneVectorScope == NULL) return; + if (sceneYUVparade == NULL) return; + if (sceneRGBparade == NULL) return; + if (sceneHistograms == NULL) return; + #define FRAME_COLOR (0xFF000000) //(0xFF7F7F7F) + // Make Y plane statistics + { + memset(wrkYUVparade[0],0,256*256*sizeof(uint32_t)); + memset(wrkHistograms[0],0,256*sizeof(uint32_t)); + uint8_t * yp=in->GetReadPtr(PLANAR_Y); + int stride=in->GetPitch(PLANAR_Y); + uint8_t * ptr; + int value; + + for (int y=0; yGetReadPtr(PLANAR_U); + uint8_t * vp=in->GetReadPtr(PLANAR_V); + int ustride=in->GetPitch(PLANAR_U); + int vstride=in->GetPitch(PLANAR_V); + uint8_t * uptr, * vptr; + int uvalue, vvalue; + int width=in->GetWidth(PLANAR_U); + int height=in->GetHeight(PLANAR_U); + + for (int y=0; yconvertImage(in,rgbBufRaw->at(0)); + memset(wrkRGBparade[0],0,256*256*sizeof(uint32_t)); + memset(wrkRGBparade[1],0,256*256*sizeof(uint32_t)); + memset(wrkRGBparade[2],0,256*256*sizeof(uint32_t)); + memset(wrkHistograms[0],0,256*sizeof(uint32_t)); + memset(wrkHistograms[1],0,256*sizeof(uint32_t)); + memset(wrkHistograms[2],0,256*sizeof(uint32_t)); + uint8_t * ptr; + int rvalue, gvalue, bvalue; + + for (int y=0; yat(y*rgbBufStride); + for (int x=0; x>24; + } + } + + // Normalize parades + { + uint32_t norm = 2147483648ULL/(width*height); + for (int ch=0; ch<3; ch++) + for (int i=0; i<256; i++) + { + wrkYUVparade[ch][i] = (wrkYUVparade[ch][i]*norm)>>8; + wrkRGBparade[ch][i] = (wrkRGBparade[ch][i]*norm)>>8; + } + } + + // Normalize vectorscope + { + uint32_t norm = 1073741824ULL/(width*height); + for (int y=0; y<256; y++) + for (int x=0; x<256; x++) + wrkVectorScope[y*256 + x] = (wrkVectorScope[y*256 + x]*norm)>>8; + } + + // Draw histograms + { + memset(bufHistograms, 0, 772*259*sizeof(uint32_t)); + uint32_t q,color; + + for (int csp=0; csp<2; csp++) + { + for (int ch=0; ch<3; ch++) + { + switch(ch+csp*3) + { + case 0: //R + color = 0xFFFF0000; + break; + case 1: //G + color = 0xFF00FF00; + break; + case 2: //B + color = 0xFF0000FF; + break; + case 3: //Y + color = 0xFFFFFFFF; + break; + case 4: //U + color = 0xFF7F3FFF; + break; + case 5: //V + color = 0xFFFF3F7F; + break; + } + for (int x=0; x<256; x++) + { + q = wrkHistograms[csp*3+ch][x]; + for (int y=0; y<128;y++) + { + bufHistograms[(csp*129+y+1)*772+(ch*257+1)+x] = ((((127-y)-(int)q) > 0) ? 0xFF000000 : color); + } + } + } + } + + // add frame + for (int x=0; x<772; x++) + { + bufHistograms[772*0+x] = FRAME_COLOR; + bufHistograms[772*129+x] = FRAME_COLOR; + bufHistograms[772*258+x] = FRAME_COLOR; + } + for (int y=1; y<257; y++) + { + bufHistograms[772*y+0] = FRAME_COLOR; + bufHistograms[772*y+257] = FRAME_COLOR; + bufHistograms[772*y+514] = FRAME_COLOR; + bufHistograms[772*y+771] = FRAME_COLOR; + } + + sceneHistograms->clear(); + sceneHistograms->addPixmap( QPixmap::fromImage(*imgHistograms)); + } + + // Draw YUV parade + { + uint32_t p,c; + // convert to color 0xffRRGGBB + for (int y=1; y<257; y++) + { + //Y + for (int x=1; x<257; x++) + { + p = wrkYUVparade[0][(256-y)*256 + x-1]; + c = 0; + if (p) + { + p /= 2; + if (p >= 256) + c = 0x00FFFFFF; + else + c = (p << 16) + (p << 8) + (p << 0); + } + bufYUVparade[772*y+x] = 0xFF000000 | c; + } + //U + for (int x=258; x<514; x++) + { + p = wrkYUVparade[1][(256-y)*256 + x-258]; + c = 0; + if (p) + { + if (p >= 1020) + c = 0x00FFFFFF; + else + if (p >= 510) + c = 0x00FF00FF + ((p/4) << 8); + else + if (p >= 256) + c = 0x000000FF + ((p/2) << 16) + ((p/4) << 8); + else + c = ((p/2) << 16) + ((p/4) << 8) + (p << 0); + } + bufYUVparade[772*y+x] = 0xFF000000 | c; + } + //V + for (int x=515; x<771; x++) + { + p = wrkYUVparade[2][(256-y)*256 + x-515]; + c = 0; + if (p) + { + if (p >= 1020) + c = 0x00FFFFFF; + else + if (p >= 510) + c = 0x00FF00FF + ((p/4) << 8); + else + if (p >= 256) + c = 0x00FF0000 + ((p/4) << 8) + ((p/2) << 0); + else + c = (p << 16) + ((p/4) << 8) + ((p/2) << 0); + } + bufYUVparade[772*y+x] = 0xFF000000 | c; + } + } + + // add frame + for (int x=0; x<772; x++) + { + bufYUVparade[772*0+x] = FRAME_COLOR; + bufYUVparade[772*257+x] = FRAME_COLOR; + } + for (int y=1; y<257; y++) + { + bufYUVparade[772*y+0] = FRAME_COLOR; + bufYUVparade[772*y+257] = FRAME_COLOR; + bufYUVparade[772*y+514] = FRAME_COLOR; + bufYUVparade[772*y+771] = FRAME_COLOR; + } + + sceneYUVparade->clear(); + sceneYUVparade->addPixmap( QPixmap::fromImage(*imgYUVparade)); + } + + // Draw RGB parade + { + uint32_t p,c; + // convert to color 0xffRRGGBB + for (int y=1; y<257; y++) + { + //R + for (int x=1; x<257; x++) + { + p = wrkRGBparade[0][(256-y)*256 + x-1]; + if (p >= 765) + c = 0x00FFFFFF; + else + if (p >= 256) + { + p = (p-255)/2; + c = 0x00FF0000 + (p<<8) + p; + } else + c = p << 16; + bufRGBparade[772*y+x] = 0xFF000000 | c; + } + //G + for (int x=258; x<514; x++) + { + p =wrkRGBparade[1][(256-y)*256 + x-258]; + if (p >= 765) + c = 0x00FFFFFF; + else + if (p >= 256) + { + p = (p-255)/2; + c = 0x0000FF00 + (p<<16) + p; + } else + c = p << 8; + bufRGBparade[772*y+x] = 0xFF000000 | c; + } + //B + for (int x=515; x<771; x++) + { + p = wrkRGBparade[2][(256-y)*256 + x-515]; + if (p >= 765) + c = 0x00FFFFFF; + else + if (p >= 256) + { + p = (p-255)/2; + c = 0x000000FF + (p<<16) + (p<<8); + } else + c = p << 0; + bufRGBparade[772*y+x] = 0xFF000000 | c; + } + } + + // add frame + for (int x=0; x<772; x++) + { + bufRGBparade[772*0+x] = FRAME_COLOR; + bufRGBparade[772*257+x] = FRAME_COLOR; + } + for (int y=1; y<257; y++) + { + bufRGBparade[772*y+0] = FRAME_COLOR; + bufRGBparade[772*y+257] = FRAME_COLOR; + bufRGBparade[772*y+514] = FRAME_COLOR; + bufRGBparade[772*y+771] = FRAME_COLOR; + } + + sceneRGBparade->clear(); + sceneRGBparade->addPixmap( QPixmap::fromImage(*imgRGBparade)); + } + + // Draw vectorscope + { + uint32_t p,q,c; + uint8_t argb[4]; + memset(bufVectorScope,0,620*600*sizeof(uint32_t)); + + for (int y=0; y<256; y++) + for (int x=0; x<256; x++) + bufVectorScope[(2*y + 44)*620 + 2*x + 64] = wrkVectorScope[(255-y)*256+x]; + + // interpolate histogram + for (int y=44; y<(44+512); y+=2) + { + uint32_t * ptr = bufVectorScope+620*y; + for (int x=(64-1); x<(64+512+1); x+=2) + { + *(ptr+x) = ( (*(ptr+x-1)) + (*(ptr+x+1)) )/2; + } + } + for (int y=(44-1); y<(44+512+1); y+=2) + { + uint32_t * ptrm = bufVectorScope+620*(y-1); + uint32_t * ptr = bufVectorScope+620*y; + uint32_t * ptrp = bufVectorScope+620*(y+1); + for (int x=64; x<(64+512); x+=1) + { + *(ptr+x) = ( (*(ptrm+x)) + (*(ptrp+x)) )/2; + } + } + + // convert to color 0xffRRGGBB and apply scale + for (int i=0; i<620*600; i++) + { + p = bufVectorScope[i]; + q = scaleVectorScope[i]; + if (p) + { + if (p >= 765) + { + c = 0x00FFFFFF; + } else + if (p >= 256) + { + p = (p-255)/2; + c = 0x0000FF00 + (p<<16) + p; + } else { + c = p<<8; + } + + if (q) + { + c = (c>>1) & 0x007F7F7F; + q = (q>>1) & 0x007F7F7F; + q += c; + } + else + q = c; + } + bufVectorScope[i] = 0xFF000000 | q; + } + + sceneVectorScope->clear(); + sceneVectorScope->addPixmap( QPixmap::fromImage(*imgVectorScope)); + } + #undef FRAME_COLOR +} //****************************** //EOF From 68db4d6fea7f318909e78814c27b48bb7be7488e Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 2 Nov 2021 19:31:28 +0100 Subject: [PATCH 2/8] [colorBalance/qt4] add analyzer button --- .../ADM_videoFilters6/colorBalance/qt4/Q_colorBalance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avidemux_plugins/ADM_videoFilters6/colorBalance/qt4/Q_colorBalance.cpp b/avidemux_plugins/ADM_videoFilters6/colorBalance/qt4/Q_colorBalance.cpp index e6274a5363..52c11a9bec 100644 --- a/avidemux_plugins/ADM_videoFilters6/colorBalance/qt4/Q_colorBalance.cpp +++ b/avidemux_plugins/ADM_videoFilters6/colorBalance/qt4/Q_colorBalance.cpp @@ -56,7 +56,7 @@ Ui_colorBalanceWindow::Ui_colorBalanceWindow(QWidget *parent, colorBalance *para memcpy(&(myFly->param),param,sizeof(colorBalance)); myFly->showRanges = false; myFly->_cookie=&ui; - myFly->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn + ControlOption::UserWidgetBeforePeekBtn, peekRangesBtn); + myFly->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn + ControlOption::AnalyzerBtn +ControlOption::UserWidgetBeforePeekBtn, peekRangesBtn); myFly->setTabOrder(); myFly->upload(); myFly->sliderChanged(); From 72f13e2372b8533596116f7747551f01420921a4 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 3 Nov 2021 15:27:58 +0100 Subject: [PATCH 3/8] [ADM_flyDialog] subclass QDialog, fix resizing issues --- .../qt4/ADM_UIs/include/DIA_flyDialogQt4.h | 23 ++++- avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp | 97 +++++++++++++------ 2 files changed, 91 insertions(+), 29 deletions(-) diff --git a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h index c885cbbea7..ceba58c822 100644 --- a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h +++ b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h @@ -35,6 +35,7 @@ #include #include #include +#include #include "ADM_default.h" #include "ADM_rgb.h" @@ -97,6 +98,7 @@ class ADM_UIQT46_EXPORT ADM_QCanvas : public QWidget }; class flyControl; +class ADM_analyzerDialog; class flyDialogsAnalyzer; /** \class ADM_flyDialog @@ -129,8 +131,9 @@ class ADM_UIQT46_EXPORT ADM_flyDialog : public QObject QDialog *_parent; bool _bypassFilter; // Analyzer - bool _analyze; - QGraphicsScene * _analyzerScenes[4]; + bool _analyze; + ADM_analyzerDialog * _analyzerDialog; + QGraphicsScene * _analyzerScenes[4]; flyDialogsAnalyzer * _flyanal; @@ -318,6 +321,22 @@ class ADM_UIQT46_EXPORT ADM_rubberControl : public QWidget void mouseMoveEvent(QMouseEvent *); }; +class ADM_UIQT46_EXPORT ADM_analyzerDialog : public QDialog +{ + Q_OBJECT + private: + QVBoxLayout * vboxlayout; + QGraphicsView * gv[4]; + void adjustGraphs(); + void resizeEvent(QResizeEvent *event); + void showEvent(QShowEvent *event); + public: + QGraphicsScene * gsc[4]; + ADM_analyzerDialog(QWidget *parent); + ~ADM_analyzerDialog(); + +}; + class ADM_UIQT46_EXPORT flyDialogsAnalyzer { private: diff --git a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp index f701b2fb13..236e1e7816 100644 --- a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp +++ b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -683,6 +684,7 @@ bool FlyDialogEventFilter::eventFilter(QObject *obj, QEvent *event) updateSlider(); _bypassFilter=false; _analyze=false; + _analyzerDialog=NULL; _analyzerScenes[0]=_analyzerScenes[1]=_analyzerScenes[2]=_analyzerScenes[3]=NULL; _flyanal = new flyDialogsAnalyzer(width,height); @@ -934,36 +936,15 @@ void ADM_flyDialog::play(bool state) */ void ADM_flyDialog::analyzerReleased(void) { - _analyze=true; _control->pushButton_analyzer->setEnabled(false); - if (_analyze) + if (!_analyze) { - QDialog * dialog=new QDialog(_parent); - QVBoxLayout * vboxlayout = new QVBoxLayout(dialog); - dialog->setWindowTitle(QApplication::translate("seekablePreviewDialog", "Analyzer", 0)); - dialog->setAttribute(Qt::WA_DeleteOnClose); - QGraphicsView * gv[4]; + _analyzerDialog = new ADM_analyzerDialog(_parent); for (int i=0; i<4; i++) - { - gv[i] = new QGraphicsView(dialog); - gv[i]->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - gv[i]->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - gv[i]->setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing); - gv[i]->setBackgroundBrush(QBrush(Qt::black,Qt::SolidPattern)); - _analyzerScenes[i] = new QGraphicsScene(dialog); - if (i==0) - _analyzerScenes[i]->setSceneRect(0,0,620,600); - else if (i<=2) - _analyzerScenes[i]->setSceneRect(0,0,772,258); - else - _analyzerScenes[i]->setSceneRect(0,0,772,259); - gv[i]->setScene(_analyzerScenes[i]); - gv[i]->scale(0.5,0.5); - vboxlayout->addWidget(gv[i]); - } - dialog->setLayout(vboxlayout); - QObject::connect(dialog ,SIGNAL(destroyed()),this,SLOT(analyzerClosed())); - dialog->show(); + _analyzerScenes[i] = _analyzerDialog->gsc[i]; + QObject::connect(_analyzerDialog ,SIGNAL(destroyed()),this,SLOT(analyzerClosed())); + _analyzerDialog->show(); + _analyze=true; } this->sameImage(); } @@ -1028,6 +1009,68 @@ void ADM_flyDialog::timeout(void) } } + + +/** + * + */ +ADM_analyzerDialog::ADM_analyzerDialog(QWidget *parent) : QDialog(parent) +{ + vboxlayout = new QVBoxLayout(this); + this->setWindowTitle(QApplication::translate("seekablePreviewDialog", "Analyzer", 0)); + this->setAttribute(Qt::WA_DeleteOnClose); // delete objets on closing the dialog + QSizePolicy policy; + for (int i=0; i<4; i++) + { + gv[i] = new QGraphicsView(this); + gv[i]->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + gv[i]->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + gv[i]->setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing); + gv[i]->setBackgroundBrush(QBrush(Qt::black,Qt::SolidPattern)); + policy.setHorizontalPolicy(QSizePolicy::Expanding); + policy.setVerticalPolicy(QSizePolicy::Expanding); + policy.setVerticalStretch((i==0)?7:3); + gv[i]->setSizePolicy(policy); + gsc[i] = new QGraphicsScene(this); + if (i==0) + gsc[i]->setSceneRect(0,0,620,600); + else if (i<=2) + gsc[i]->setSceneRect(0,0,772,258); + else + gsc[i]->setSceneRect(0,0,772,259); + gv[i]->setScene(gsc[i]); + gv[i]->scale(0.5,0.5); + vboxlayout->addWidget(gv[i]); + } + this->setLayout(vboxlayout); +} + +ADM_analyzerDialog::~ADM_analyzerDialog() +{ + +} + +void ADM_analyzerDialog::adjustGraphs() +{ + QRectF bounds; + for (int i=0; i<4; i++) + { + bounds = gsc[i]->itemsBoundingRect(); + gv[i]->fitInView(bounds, Qt::KeepAspectRatio); + } +} + +void ADM_analyzerDialog::resizeEvent(QResizeEvent *event) +{ + adjustGraphs(); +} + +void ADM_analyzerDialog::showEvent(QShowEvent *event) +{ + QDialog::showEvent(event); + adjustGraphs(); +} + /** * */ From 92c5b8555e97d8be609d9a39caa5fc99ae21d9dc Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 3 Nov 2021 17:11:56 +0100 Subject: [PATCH 4/8] [ADM_videoFilters6] add analyzer to chromaShift,colorTemp,contrast,deband,eq2 and hue filters --- .../ADM_videoFilters6/chromaShift/qt4/Q_chromashift.cpp | 2 +- .../ADM_videoFilters6/colorTemp/qt4/Q_colorTemp.cpp | 2 +- avidemux_plugins/ADM_videoFilters6/contrast/qt4/Q_contrast.cpp | 2 +- avidemux_plugins/ADM_videoFilters6/deband/qt4/Q_deband.cpp | 2 +- avidemux_plugins/ADM_videoFilters6/eq2/qt4/Q_eq2.cpp | 2 +- avidemux_plugins/ADM_videoFilters6/hue/qt4/Q_hue.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/avidemux_plugins/ADM_videoFilters6/chromaShift/qt4/Q_chromashift.cpp b/avidemux_plugins/ADM_videoFilters6/chromaShift/qt4/Q_chromashift.cpp index 3e233227d0..938778cd0d 100644 --- a/avidemux_plugins/ADM_videoFilters6/chromaShift/qt4/Q_chromashift.cpp +++ b/avidemux_plugins/ADM_videoFilters6/chromaShift/qt4/Q_chromashift.cpp @@ -44,7 +44,7 @@ Ui_chromaShiftWindow::Ui_chromaShiftWindow(QWidget* parent, chromashift *param,A myCrop=new flyChromaShift( this,width, height,in,canvas,ui.horizontalSlider); memcpy(&(myCrop->param),param,sizeof(chromashift)); myCrop->_cookie=&ui; - myCrop->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn); + myCrop->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn + ControlOption::AnalyzerBtn); myCrop->setTabOrder(); myCrop->upload(); myCrop->sliderChanged(); diff --git a/avidemux_plugins/ADM_videoFilters6/colorTemp/qt4/Q_colorTemp.cpp b/avidemux_plugins/ADM_videoFilters6/colorTemp/qt4/Q_colorTemp.cpp index 0ba0176b19..d6934c106a 100644 --- a/avidemux_plugins/ADM_videoFilters6/colorTemp/qt4/Q_colorTemp.cpp +++ b/avidemux_plugins/ADM_videoFilters6/colorTemp/qt4/Q_colorTemp.cpp @@ -44,7 +44,7 @@ Ui_colorTempWindow::Ui_colorTempWindow(QWidget *parent, colorTemp *param,ADM_cor myFly=new flyColorTemp( this,width, height,in,canvas,ui.horizontalSlider); memcpy(&(myFly->param),param,sizeof(colorTemp)); myFly->_cookie=&ui; - myFly->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn); + myFly->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn + ControlOption::AnalyzerBtn); myFly->setTabOrder(); myFly->upload(); myFly->sliderChanged(); diff --git a/avidemux_plugins/ADM_videoFilters6/contrast/qt4/Q_contrast.cpp b/avidemux_plugins/ADM_videoFilters6/contrast/qt4/Q_contrast.cpp index f2f2254916..3744bcf5f2 100644 --- a/avidemux_plugins/ADM_videoFilters6/contrast/qt4/Q_contrast.cpp +++ b/avidemux_plugins/ADM_videoFilters6/contrast/qt4/Q_contrast.cpp @@ -46,7 +46,7 @@ myCrop=new flyContrast( this,width, height,in,canvas,ui.horizontalSlider,scene); memcpy(&(myCrop->param),param,sizeof(contrast)); myCrop->_cookie=&ui; - myCrop->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn); + myCrop->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn + ControlOption::AnalyzerBtn); myCrop->setTabOrder(); myCrop->upload(); myCrop->sliderChanged(); diff --git a/avidemux_plugins/ADM_videoFilters6/deband/qt4/Q_deband.cpp b/avidemux_plugins/ADM_videoFilters6/deband/qt4/Q_deband.cpp index 43986aa954..95381f685c 100644 --- a/avidemux_plugins/ADM_videoFilters6/deband/qt4/Q_deband.cpp +++ b/avidemux_plugins/ADM_videoFilters6/deband/qt4/Q_deband.cpp @@ -43,7 +43,7 @@ Ui_debandWindow::Ui_debandWindow(QWidget *parent, deband *param,ADM_coreVideoFil myFly=new flyDeband( this,width, height,in,canvas,ui.horizontalSlider); memcpy(&(myFly->param),param,sizeof(deband)); myFly->_cookie=&ui; - myFly->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn); + myFly->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn + ControlOption::AnalyzerBtn); myFly->setTabOrder(); myFly->upload(); myFly->sliderChanged(); diff --git a/avidemux_plugins/ADM_videoFilters6/eq2/qt4/Q_eq2.cpp b/avidemux_plugins/ADM_videoFilters6/eq2/qt4/Q_eq2.cpp index 58eeae19bd..4b308ac795 100644 --- a/avidemux_plugins/ADM_videoFilters6/eq2/qt4/Q_eq2.cpp +++ b/avidemux_plugins/ADM_videoFilters6/eq2/qt4/Q_eq2.cpp @@ -46,7 +46,7 @@ Ui_eq2Window::Ui_eq2Window(QWidget *parent, eq2 *param,ADM_coreVideoFilter *in) myCrop=new flyEq2(this, width, height,in,canvas,ui.horizontalSlider,scene); memcpy(&(myCrop->param),param,sizeof(eq2)); myCrop->_cookie=&ui; - myCrop->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn); + myCrop->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn + ControlOption::AnalyzerBtn); myCrop->setTabOrder(); myCrop->upload(); myCrop->sliderChanged(); diff --git a/avidemux_plugins/ADM_videoFilters6/hue/qt4/Q_hue.cpp b/avidemux_plugins/ADM_videoFilters6/hue/qt4/Q_hue.cpp index 82d30f5f67..328130d76d 100644 --- a/avidemux_plugins/ADM_videoFilters6/hue/qt4/Q_hue.cpp +++ b/avidemux_plugins/ADM_videoFilters6/hue/qt4/Q_hue.cpp @@ -43,7 +43,7 @@ myCrop=new flyHue( this,width, height,in,canvas,ui.horizontalSlider); myCrop->setParam(param); myCrop->_cookie=&ui; - myCrop->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn); + myCrop->addControl(ui.toolboxLayout, ControlOption::PeekOriginalBtn + ControlOption::AnalyzerBtn); myCrop->setTabOrder(); myCrop->upload(); myCrop->sliderChanged(); From 386f24cb3d3a79a24515b472df6bd4ac5e15619f Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 3 Nov 2021 18:15:31 +0100 Subject: [PATCH 5/8] [ADM_flyDialog] normalize histograms as in contrast filter; fix uninitialized histogram --- avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp index 236e1e7816..e6a33dfd91 100644 --- a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp +++ b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp @@ -1226,7 +1226,7 @@ void flyDialogsAnalyzer::analyze(ADMImage *in, QGraphicsScene * sceneVectorScope // Make Y plane statistics { memset(wrkYUVparade[0],0,256*256*sizeof(uint32_t)); - memset(wrkHistograms[0],0,256*sizeof(uint32_t)); + memset(wrkHistograms[3],0,256*sizeof(uint32_t)); uint8_t * yp=in->GetReadPtr(PLANAR_Y); int stride=in->GetPitch(PLANAR_Y); uint8_t * ptr; @@ -1312,15 +1312,17 @@ void flyDialogsAnalyzer::analyze(ADMImage *in, QGraphicsScene * sceneVectorScope { for (int csp=0; csp<2; csp++) { - uint32_t max = 0; - for (int ch=0; ch<3; ch++) - for (int i=0; i<256; i++) - if (max < wrkHistograms[csp*3+ch][i]) - max = wrkHistograms[csp*3+ch][i]; - uint32_t norm = 2080374784ULL / max; // 124 * 2<<24 for (int ch=0; ch<3; ch++) for (int i=0; i<256; i++) - wrkHistograms[csp*3+ch][i] = (wrkHistograms[csp*3+ch][i]*norm)>>24; + { + double value = wrkHistograms[csp*3+ch][i]; + value /= height; + value /= width; + value *= 124*10; + if (value > 124) + value = 124; + wrkHistograms[csp*3+ch][i] = value; + } } } From f6a85fbd2afc34b4a56d8ff4f04f3dd2f05ae3a6 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 4 Nov 2021 00:31:54 +0100 Subject: [PATCH 6/8] [ADM_flyDialog] try to fix foreground problem on macOS --- avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h | 2 +- avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h index ceba58c822..36d0ae3a01 100644 --- a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h +++ b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h @@ -134,7 +134,7 @@ class ADM_UIQT46_EXPORT ADM_flyDialog : public QObject bool _analyze; ADM_analyzerDialog * _analyzerDialog; QGraphicsScene * _analyzerScenes[4]; - flyDialogsAnalyzer * _flyanal; + flyDialogsAnalyzer * _flyAnalyzer; diff --git a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp index e6a33dfd91..3c1cf4a4f2 100644 --- a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp +++ b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp @@ -264,7 +264,7 @@ uint8_t ADM_flyDialog::cleanup(void) */ ADM_flyDialog::~ADM_flyDialog(void) { - delete _flyanal; + delete _flyAnalyzer; cleanup(); } @@ -536,11 +536,11 @@ bool ADM_flyDialogYuv::process(void) { yuvToRgb->convertImage(_yuvBuffer,_rgbByteBufferDisplay.at(0)); if (_analyze) - _flyanal->analyze(_yuvBuffer,_analyzerScenes[0],_analyzerScenes[1],_analyzerScenes[2],_analyzerScenes[3]); + _flyAnalyzer->analyze(_yuvBuffer,_analyzerScenes[0],_analyzerScenes[1],_analyzerScenes[2],_analyzerScenes[3]); } else { processYuv(_yuvBuffer,_yuvBufferOut); if (_analyze) - _flyanal->analyze(_yuvBufferOut,_analyzerScenes[0],_analyzerScenes[1],_analyzerScenes[2],_analyzerScenes[3]); + _flyAnalyzer->analyze(_yuvBufferOut,_analyzerScenes[0],_analyzerScenes[1],_analyzerScenes[2],_analyzerScenes[3]); yuvToRgb->convertImage(_yuvBufferOut,_rgbByteBufferDisplay.at(0)); } return true; @@ -686,7 +686,7 @@ bool FlyDialogEventFilter::eventFilter(QObject *obj, QEvent *event) _analyze=false; _analyzerDialog=NULL; _analyzerScenes[0]=_analyzerScenes[1]=_analyzerScenes[2]=_analyzerScenes[3]=NULL; - _flyanal = new flyDialogsAnalyzer(width,height); + _flyAnalyzer = new flyDialogsAnalyzer(width,height); QGraphicsScene *sc=new QGraphicsScene(this); sc->setBackgroundBrush(QBrush(Qt::darkGray, Qt::SolidPattern)); @@ -1014,7 +1014,7 @@ void ADM_flyDialog::timeout(void) /** * */ -ADM_analyzerDialog::ADM_analyzerDialog(QWidget *parent) : QDialog(parent) +ADM_analyzerDialog::ADM_analyzerDialog(QWidget *parent) : QDialog(parent, Qt::Tool) { vboxlayout = new QVBoxLayout(this); this->setWindowTitle(QApplication::translate("seekablePreviewDialog", "Analyzer", 0)); From 8c91f6ccf0b1c04cac749cbd1eafebf4d8b408a1 Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 5 Nov 2021 02:54:44 +0100 Subject: [PATCH 7/8] [ADM_flyDialog] selectable scopes; bugfixes and polish --- .../qt4/ADM_UIs/include/DIA_flyDialogQt4.h | 7 +++ avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp | 60 +++++++++++++++---- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h index 36d0ae3a01..1051bf9779 100644 --- a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h +++ b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h @@ -35,7 +35,9 @@ #include #include #include +#include #include +#include #include "ADM_default.h" #include "ADM_rgb.h" @@ -325,11 +327,16 @@ class ADM_UIQT46_EXPORT ADM_analyzerDialog : public QDialog { Q_OBJECT private: + QHBoxLayout * hboxlayout; QVBoxLayout * vboxlayout; QGraphicsView * gv[4]; + QPushButton * btns[4]; + bool btnChkd[4]; void adjustGraphs(); void resizeEvent(QResizeEvent *event); void showEvent(QShowEvent *event); + private slots: + void btnToggled(bool f); public: QGraphicsScene * gsc[4]; ADM_analyzerDialog(QWidget *parent); diff --git a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp index 3c1cf4a4f2..c2c2c15a45 100644 --- a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp +++ b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include #include @@ -1017,20 +1016,34 @@ void ADM_flyDialog::timeout(void) ADM_analyzerDialog::ADM_analyzerDialog(QWidget *parent) : QDialog(parent, Qt::Tool) { vboxlayout = new QVBoxLayout(this); + hboxlayout = new QHBoxLayout(this); this->setWindowTitle(QApplication::translate("seekablePreviewDialog", "Analyzer", 0)); this->setAttribute(Qt::WA_DeleteOnClose); // delete objets on closing the dialog - QSizePolicy policy; + for (int i=0; i<4; i++) + { + btns[i] = new QPushButton(this); + switch(i) + { + case 0: btns[i]->setText(QApplication::translate("seekablePreviewDialog", "Vectorscope", 0)); break; + case 1: btns[i]->setText(QApplication::translate("seekablePreviewDialog", "YUV waveform", 0)); break; + case 2: btns[i]->setText(QApplication::translate("seekablePreviewDialog", "RGB waveform", 0)); break; + case 3: btns[i]->setText(QApplication::translate("seekablePreviewDialog", "Histograms", 0)); break; + } + btns[i]->setCheckable(true); + btns[i]->setChecked(true); + connect(btns[i],SIGNAL(toggled(bool)),this,SLOT(btnToggled(bool))); + hboxlayout->addWidget(btns[i]); + btnChkd[i] = true; + } + vboxlayout->addLayout(hboxlayout); for (int i=0; i<4; i++) { gv[i] = new QGraphicsView(this); gv[i]->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); gv[i]->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); gv[i]->setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing); - gv[i]->setBackgroundBrush(QBrush(Qt::black,Qt::SolidPattern)); - policy.setHorizontalPolicy(QSizePolicy::Expanding); - policy.setVerticalPolicy(QSizePolicy::Expanding); - policy.setVerticalStretch((i==0)?7:3); - gv[i]->setSizePolicy(policy); + gv[i]->setBackgroundBrush(QBrush(QColor::fromRgb(20,20,20),Qt::SolidPattern)); + gv[i]->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding); gsc[i] = new QGraphicsScene(this); if (i==0) gsc[i]->setSceneRect(0,0,620,600); @@ -1039,7 +1052,7 @@ ADM_analyzerDialog::ADM_analyzerDialog(QWidget *parent) : QDialog(parent, Qt::To else gsc[i]->setSceneRect(0,0,772,259); gv[i]->setScene(gsc[i]); - gv[i]->scale(0.5,0.5); + gv[i]->scale(1/3.,1/3.); vboxlayout->addWidget(gv[i]); } this->setLayout(vboxlayout); @@ -1050,6 +1063,26 @@ ADM_analyzerDialog::~ADM_analyzerDialog() } +void ADM_analyzerDialog::btnToggled(bool f) +{ + bool allOff = true; + for (int i=0; i<4; i++) + if(btns[i]->isChecked()) + allOff = false; + + if (allOff) + for (int i=0; i<4; i++) + btns[i]->setChecked(btnChkd[i]); + + for (int i=0; i<4; i++) + { + gv[i]->setVisible(btns[i]->isChecked()); + btnChkd[i] = btns[i]->isChecked(); + } + QCoreApplication::processEvents (); + adjustGraphs(); +} + void ADM_analyzerDialog::adjustGraphs() { QRectF bounds; @@ -1068,6 +1101,7 @@ void ADM_analyzerDialog::resizeEvent(QResizeEvent *event) void ADM_analyzerDialog::showEvent(QShowEvent *event) { QDialog::showEvent(event); + QCoreApplication::processEvents (); adjustGraphs(); } @@ -1087,7 +1121,7 @@ flyDialogsAnalyzer::flyDialogsAnalyzer(int width, int height) { for (int x=0; x<620; x++) { - double xc = x-(64.0+256.0); + double xc = x-(54.0+256.0); double yc = y-(44.0+256.0); double r = std::sqrt(xc*xc + yc*yc); uint32_t c = 0; @@ -1119,7 +1153,7 @@ flyDialogsAnalyzer::flyDialogsAnalyzer(int width, int height) rgb[0] = (pri&1)? 1:0; rgb[1] = (pri&2)? 1:0; rgb[2] = (pri&4)? 1:0; - double u = 64 + 256 + 2*224.0*(-0.1146*rgb[0] + -0.3854*rgb[1] + 0.5 *rgb[2]); + double u = 54 + 256 + 2*224.0*(-0.1146*rgb[0] + -0.3854*rgb[1] + 0.5 *rgb[2]); double v = 44 + 256 - 2*224.0*( 0.5 *rgb[0] + -0.4542*rgb[1] + -0.0458*rgb[2]); u = x-u; v = y-v; @@ -1565,13 +1599,13 @@ void flyDialogsAnalyzer::analyze(ADMImage *in, QGraphicsScene * sceneVectorScope for (int y=0; y<256; y++) for (int x=0; x<256; x++) - bufVectorScope[(2*y + 44)*620 + 2*x + 64] = wrkVectorScope[(255-y)*256+x]; + bufVectorScope[(2*y + 44)*620 + 2*x + 54] = wrkVectorScope[(255-y)*256+x]; // interpolate histogram for (int y=44; y<(44+512); y+=2) { uint32_t * ptr = bufVectorScope+620*y; - for (int x=(64-1); x<(64+512+1); x+=2) + for (int x=(54-1); x<(54+512+1); x+=2) { *(ptr+x) = ( (*(ptr+x-1)) + (*(ptr+x+1)) )/2; } @@ -1581,7 +1615,7 @@ void flyDialogsAnalyzer::analyze(ADMImage *in, QGraphicsScene * sceneVectorScope uint32_t * ptrm = bufVectorScope+620*(y-1); uint32_t * ptr = bufVectorScope+620*y; uint32_t * ptrp = bufVectorScope+620*(y+1); - for (int x=64; x<(64+512); x+=1) + for (int x=54; x<(54+512); x+=1) { *(ptr+x) = ( (*(ptrm+x)) + (*(ptrp+x)) )/2; } From f1bd2f6d3deb269cdf2fc912c3713d7af3a14a99 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 9 Nov 2021 11:58:16 +0100 Subject: [PATCH 8/8] [ADM_flyDialog/analyzer] add styles to selector buttons; default show vectorscope+RGB only --- avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp index c2c2c15a45..9485d1a96f 100644 --- a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp +++ b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp @@ -1030,10 +1030,11 @@ ADM_analyzerDialog::ADM_analyzerDialog(QWidget *parent) : QDialog(parent, Qt::To case 3: btns[i]->setText(QApplication::translate("seekablePreviewDialog", "Histograms", 0)); break; } btns[i]->setCheckable(true); - btns[i]->setChecked(true); + btns[i]->setChecked(i%2==0); // vectorscope + RGB + btns[i]->setStyleSheet("QPushButton { background-color: #888888; border: none; padding: 8px;}\nQPushButton:checked { background-color: #33FF33; border: none; padding: 8px;}"); connect(btns[i],SIGNAL(toggled(bool)),this,SLOT(btnToggled(bool))); hboxlayout->addWidget(btns[i]); - btnChkd[i] = true; + btnChkd[i] = btns[i]->isChecked(); } vboxlayout->addLayout(hboxlayout); for (int i=0; i<4; i++) @@ -1054,6 +1055,7 @@ ADM_analyzerDialog::ADM_analyzerDialog(QWidget *parent) : QDialog(parent, Qt::To gv[i]->setScene(gsc[i]); gv[i]->scale(1/3.,1/3.); vboxlayout->addWidget(gv[i]); + gv[i]->setVisible(btns[i]->isChecked()); } this->setLayout(vboxlayout); }