diff --git a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h index dcb6cc96c1..1051bf9779 100644 --- a/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h +++ b/avidemux/qt4/ADM_UIs/include/DIA_flyDialogQt4.h @@ -33,6 +33,11 @@ #include #include #include +#include +#include +#include +#include +#include #include "ADM_default.h" #include "ADM_rgb.h" @@ -53,9 +58,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 +100,8 @@ class ADM_UIQT46_EXPORT ADM_QCanvas : public QWidget }; class flyControl; +class ADM_analyzerDialog; +class flyDialogsAnalyzer; /** \class ADM_flyDialog \brief Base class for flyDialog @@ -124,6 +132,11 @@ class ADM_UIQT46_EXPORT ADM_flyDialog : public QObject std::vector buttonList; // useful for manipulating tab order QDialog *_parent; bool _bypassFilter; + // Analyzer + bool _analyze; + ADM_analyzerDialog * _analyzerDialog; + QGraphicsScene * _analyzerScenes[4]; + flyDialogsAnalyzer * _flyAnalyzer; @@ -187,6 +200,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 +323,53 @@ class ADM_UIQT46_EXPORT ADM_rubberControl : public QWidget void mouseMoveEvent(QMouseEvent *); }; +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); + ~ADM_analyzerDialog(); + +}; + +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..9485d1a96f 100644 --- a/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp +++ b/avidemux/qt4/ADM_UIs/src/DIA_flyDialog.cpp @@ -14,12 +14,12 @@ #include #include -#include #include #include #include #include #include +#include #include @@ -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 _flyAnalyzer; 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) + _flyAnalyzer->analyze(_yuvBuffer,_analyzerScenes[0],_analyzerScenes[1],_analyzerScenes[2],_analyzerScenes[3]); } else { processYuv(_yuvBuffer,_yuvBufferOut); + if (_analyze) + _flyAnalyzer->analyze(_yuvBufferOut,_analyzerScenes[0],_analyzerScenes[1],_analyzerScenes[2],_analyzerScenes[3]); yuvToRgb->convertImage(_yuvBufferOut,_rgbByteBufferDisplay.at(0)); } return true; @@ -656,6 +682,10 @@ bool FlyDialogEventFilter::eventFilter(QObject *obj, QEvent *event) _in->goToTime(lastPts); updateSlider(); _bypassFilter=false; + _analyze=false; + _analyzerDialog=NULL; + _analyzerScenes[0]=_analyzerScenes[1]=_analyzerScenes[2]=_analyzerScenes[3]=NULL; + _flyAnalyzer = new flyDialogsAnalyzer(width,height); QGraphicsScene *sc=new QGraphicsScene(this); sc->setBackgroundBrush(QBrush(Qt::darkGray, Qt::SolidPattern)); @@ -900,6 +930,29 @@ void ADM_flyDialog::play(bool state) } } +/** + * + */ +void ADM_flyDialog::analyzerReleased(void) +{ + _control->pushButton_analyzer->setEnabled(false); + if (!_analyze) + { + _analyzerDialog = new ADM_analyzerDialog(_parent); + for (int i=0; i<4; i++) + _analyzerScenes[i] = _analyzerDialog->gsc[i]; + QObject::connect(_analyzerDialog ,SIGNAL(destroyed()),this,SLOT(analyzerClosed())); + _analyzerDialog->show(); + _analyze=true; + } + this->sameImage(); +} +void ADM_flyDialog::analyzerClosed(void) +{ + _analyze = false; + _analyzerScenes[0]=_analyzerScenes[1]=_analyzerScenes[2]=_analyzerScenes[3]=NULL; + _control->pushButton_analyzer->setEnabled(true); +} /** * */ @@ -956,6 +1009,657 @@ 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 + 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(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] = btns[i]->isChecked(); + } + 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(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); + 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(1/3.,1/3.); + vboxlayout->addWidget(gv[i]); + gv[i]->setVisible(btns[i]->isChecked()); + } + this->setLayout(vboxlayout); +} + +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; + 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); + QCoreApplication::processEvents (); + adjustGraphs(); +} + +/** + * + */ +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-(54.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 = 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; + 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[3],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 124) + value = 124; + wrkHistograms[csp*3+ch][i] = value; + } + } + } + + // 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 + 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=(54-1); x<(54+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=54; x<(54+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 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/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(); 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();