From 7f95a1c7c4884af47e2afd5f5ce3032cdef6346a Mon Sep 17 00:00:00 2001 From: Toannd Date: Fri, 16 Feb 2024 11:17:36 +0700 Subject: [PATCH 1/6] add requirements.txt --- requirements.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..799a195 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +defusedxml==0.7.1 +httpie==3.2.1 +markdown-it-py==2.2.0 +mdurl==0.1.2 +multidict==6.0.4 +Pygments==2.15.1 +PySide2==5.15.2.1 +requests-toolbelt==0.10.1 +rich==13.3.4 +shiboken2==5.15.2.1 From 4ca9d81c3039875c51eac381a4bb617bc6ab0354 Mon Sep 17 00:00:00 2001 From: Toannd Date: Fri, 16 Feb 2024 11:23:04 +0700 Subject: [PATCH 2/6] update gitignore --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 11 +++++++++++ __pycache__/videobench_functions.cpython-37.pyc | Bin 12312 -> 0 bytes __pycache__/videobench_functions.cpython-39.pyc | Bin 11897 -> 0 bytes __pycache__/videobench_layout.cpython-37.pyc | Bin 13220 -> 0 bytes __pycache__/videobench_layout.cpython-39.pyc | Bin 13235 -> 0 bytes 6 files changed, 11 insertions(+) delete mode 100644 .DS_Store create mode 100644 .gitignore delete mode 100644 __pycache__/videobench_functions.cpython-37.pyc delete mode 100644 __pycache__/videobench_functions.cpython-39.pyc delete mode 100644 __pycache__/videobench_layout.cpython-37.pyc delete mode 100644 __pycache__/videobench_layout.cpython-39.pyc diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index cbeebc73e1cfe474f1468fd2bedf4d5b7ddac602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 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

;W7J_5zLu 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 KQ%6#Xum1xYZTEWs diff --git a/__pycache__/videobench_layout.cpython-37.pyc b/__pycache__/videobench_layout.cpython-37.pyc deleted file mode 100644 index 4b6672e481b3df69cbd2f6e2805312c1d3fc8717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13220 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 diff --git a/__pycache__/videobench_layout.cpython-39.pyc b/__pycache__/videobench_layout.cpython-39.pyc deleted file mode 100644 index 47e9f01bb21f45d66a6a01e35452bf5ee162795b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13235 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 Date: Fri, 16 Feb 2024 11:25:48 +0700 Subject: [PATCH 3/6] add .gitattributes --- .gitattributes | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..95eacd0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,24 @@ +# Basic .gitattributes for a python repo. + +# Source files +# ============ +*.pxd text diff=python eol=lf +*.py text diff=python eol=lf +*.py3 text diff=python eol=lf +*.pyw text diff=python eol=lf +*.pyx text diff=python eol=lf +*.pyz text diff=python eol=lf +*.pyi text diff=python eol=lf + +# Binary files +# ============ +*.db binary +*.p binary +*.pkl binary +*.pickle binary +*.pyc binary export-ignore +*.pyo binary export-ignore +*.pyd binary + +# Jupyter notebook +*.ipynb text eol=lf \ No newline at end of file From 4663070c3079f45e365c7fa176545808b93e9710 Mon Sep 17 00:00:00 2001 From: Toannd Date: Fri, 16 Feb 2024 11:34:54 +0700 Subject: [PATCH 4/6] change default ui options --- videobench_layout.py | 860 +++++++++++++++++++++---------------------- 1 file changed, 430 insertions(+), 430 deletions(-) diff --git a/videobench_layout.py b/videobench_layout.py index 7ca2eee..b436dc3 100644 --- a/videobench_layout.py +++ b/videobench_layout.py @@ -1,430 +1,430 @@ -from PySide2 import QtGui, QtWidgets, QtCore -from functools import partial -from PySide2.QtCharts import QtCharts -from PySide2.QtCore import QPoint, Qt -from PySide2.QtGui import QPainter - -class Ui_fenetrePrincipale(object): - def setupUi(self, mainWindow): - - mainWindow.setObjectName("mainWindow") - - self.gridLayout = QtWidgets.QGridLayout(mainWindow) - self.tabwidget = QtWidgets.QTabWidget() - self.HSplitter = QtWidgets.QSplitter() - self.gridLayout.addWidget(self.tabwidget, 0, 1, 1, 1) - self.tabwidget.addTab(self.HSplitter, "General") - - self.widgets_and_layouts() - self.setting_widget() - self.add_inputs_layout() - self.add_checkbox() - self.add_sync_block() - self.add_start_btn() - self.add_reset_btn() - - def setting_widget(self): - - self.setting_vgrid = QtWidgets.QVBoxLayout() - self.setting_vgrid_widget = QtWidgets.QWidget() - self.setting_vgrid_widget.setLayout(self.setting_vgrid) - self.tabwidget.addTab(self.setting_vgrid_widget, "Settings") - - self.setting_grid = QtWidgets.QGridLayout() - - self.setting_vgrid.addLayout(self.setting_grid) - self.setting_vgrid.setAlignment(QtCore.Qt.AlignTop) - - self.deint_setting = QtWidgets.QLabel() - #self.deint_setting.setMaximumWidth(0.06*self.size.width()) - self.deint_setting.setText("Ref Deint filter : ") - self.deint_setting.setStyleSheet('QLabel {background-color: transparent;}') - self.deint_setting.setAlignment(QtCore.Qt.AlignRight) - self.deint_combobox = QtWidgets.QComboBox() - #self.deint_combobox.setMaximumWidth(0.06*self.size.width()) - self.deint_combobox.insertItem(0, "auto") - self.deint_combobox.insertItem(1, "yadif=0:-1:0") - self.deint_combobox.insertItem(2, "yadif=1:-1:0") - self.deint_combobox.insertItem(3, "null") - - - self.subsampling_setting = QtWidgets.QLabel() - self.subsampling_setting.setText("Quality subsampling : ") - self.subsampling_setting.setStyleSheet('QLabel {background-color: transparent;}') - self.subsampling_setting.setAlignment(QtCore.Qt.AlignRight) - self.subsampling_combobox = QtWidgets.QComboBox() - self.subsampling_combobox.insertItem(0, "auto") - self.subsampling_combobox.insertItem(1, "1") - self.subsampling_combobox.insertItem(2, "2") - self.subsampling_combobox.insertItem(3, "3") - self.subsampling_combobox.insertItem(4, "4") - self.subsampling_combobox.insertItem(5, "5") - self.subsampling_combobox.insertItem(6, "6") - self.subsampling_combobox.insertItem(7, "7") - self.subsampling_combobox.insertItem(8, "8") - self.subsampling_combobox.insertItem(9, "9") - self.subsampling_combobox.insertItem(10, "10") - - - self.scale_setting = QtWidgets.QLabel() - self.scale_setting.setText("Scale filter : ") - self.scale_setting.setStyleSheet('QLabel {background-color: transparent;}') - self.scale_setting.setAlignment(QtCore.Qt.AlignRight) - self.scale_combobox = QtWidgets.QComboBox() - self.scale_combobox.insertItem(0, "neighbor") - self.scale_combobox.insertItem(1, "fast_bilinear") - self.scale_combobox.insertItem(2, "bilinear") - self.scale_combobox.insertItem(3, "bicubic") - self.scale_combobox.insertItem(4, "experimental") - self.scale_combobox.insertItem(5, "area") - self.scale_combobox.insertItem(6, "bicublin") - self.scale_combobox.insertItem(7, "gauss") - self.scale_combobox.insertItem(8, "sinc") - self.scale_combobox.insertItem(9, "lanczos") - self.scale_combobox.insertItem(10, "spline") - - - self.vmaf_model_setting = QtWidgets.QLabel() - self.vmaf_model_setting.setText("VMAF Model : ") - self.vmaf_model_setting.setStyleSheet('QLabel {background-color: transparent;}') - self.vmaf_model_setting.setAlignment(QtCore.Qt.AlignRight) - self.vmaf_model_combobox = QtWidgets.QComboBox() - self.vmaf_model_combobox.insertItem(0, "auto") - self.vmaf_model_combobox.insertItem(1, "vmaf_float_v0.6.1.json") - self.vmaf_model_combobox.insertItem(2, "vmaf_float_v0.6.1.json:phone_model") - self.vmaf_model_combobox.insertItem(3, "vmaf_4k_v0.6.1.json") - - - self.loglevel_setting = QtWidgets.QLabel() - self.loglevel_setting.setText("Loglevel : ") - self.loglevel_setting.setStyleSheet('QLabel {background-color: transparent;}') - self.loglevel_setting.setAlignment(QtCore.Qt.AlignRight) - self.loglevel_combobox = QtWidgets.QComboBox() - self.loglevel_combobox.insertItem(0, "quiet") - self.loglevel_combobox.insertItem(1, "info") - - - self.png_resolution = QtWidgets.QLabel() - self.png_resolution.setText("PNG Resolution : ") - self.png_resolution.setStyleSheet('QLabel {background-color: transparent;}') - self.png_resolution.setAlignment(QtCore.Qt.AlignRight) - self.png_resolution_hlayout = QtWidgets.QHBoxLayout() - self.png_resolution_hlayout.setAlignment(QtCore.Qt.AlignLeft) - self.png_width = QtWidgets.QLineEdit() - self.png_width.setAlignment(QtCore.Qt.AlignRight) - self.png_width.setMaximumWidth(150) - self.png_width.setText("1280") - self.png_ = QtWidgets.QLabel() - self.png_.setStyleSheet('QLabel {background-color: transparent;}') - self.png_.setAlignment(QtCore.Qt.AlignLeft) - self.png_.setMaximumWidth(10) - self.png_.setText(" : ") - self.png_height = QtWidgets.QLineEdit() - self.png_height.setAlignment(QtCore.Qt.AlignRight) - self.png_height.setMaximumWidth(150) - self.png_height.setText("720") - self.png_resolution_hlayout.addWidget(self.png_width) - self.png_resolution_hlayout.addWidget(self.png_) - self.png_resolution_hlayout.addWidget(self.png_height) - - self.setting_grid.addWidget(self.vmaf_model_setting, 0,0,1,1) - self.setting_grid.addWidget(self.vmaf_model_combobox, 0,1,1,1) - self.setting_grid.addWidget(self.scale_setting, 1,0,1,1) - self.setting_grid.addWidget(self.scale_combobox, 1,1,1,1) - self.setting_grid.addWidget(self.deint_setting, 2,0,1,1) - self.setting_grid.addWidget(self.deint_combobox, 2,1,1,1) - self.setting_grid.addWidget(self.subsampling_setting, 3,0,1,1) - self.setting_grid.addWidget(self.subsampling_combobox, 3,1,1,1) - self.setting_grid.addWidget(self.loglevel_setting, 4,0,1,1) - self.setting_grid.addWidget(self.loglevel_combobox, 4,1,1,1) - self.setting_grid.addWidget(self.png_resolution, 5,0,1,1) - self.setting_grid.addLayout(self.png_resolution_hlayout, 5,1,1,1) - - - def widgets_and_layouts(self): - - self.inputs_column_Layout = QtWidgets.QVBoxLayout() - - self.inputs_btn_Layout = QtWidgets.QHBoxLayout() ########################################### Imports Butons - self.btn_importRef = QtWidgets.QPushButton(" Import Video ") - self.btn_importRef.setMinimumSize(0.06*self.size.width() , 0.04*self.size.height()) - self.btn_importRef.setStyleSheet('QPushButton:hover {background-color: #007bff; color: #ffffff; font-size: 15px; } QPushButton {color: #007bff; border:2px solid #007bff; background-color: transparent; border-radius: 4px;}') - self.btn_importRef.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) - - self.btn_importInputs = QtWidgets.QPushButton(" Import Video ") - self.btn_importInputs.setMinimumSize(0.06*self.size.width() , 0.04*self.size.height()) - self.btn_importInputs.setStyleSheet('QPushButton:hover {background-color: #007bff; color: #ffffff; font-size: 15px; } QPushButton {color: #007bff; border:2px solid #007bff; background-color: transparent; border-radius: 4px;}') - self.btn_importInputs.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) - - self.label_or = QtWidgets.QLabel("or") - self.label_or.setText("or") - self.label_or.setStyleSheet('QLabel {background-color: transparent;}') - - self.import_json_btn = QtWidgets.QPushButton(" Import Measurements ") - self.import_json_btn.setMinimumSize(0.06*self.size.width() , 0.04*self.size.height()) - self.import_json_btn.setStyleSheet('QPushButton:hover {background-color: #007bff; color: #ffffff; font-size: 15px; } QPushButton {color: #007bff; border:2px solid #007bff; background-color: transparent; border-radius: 4px;}') - self.import_json_btn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) - - - self.inputs_checkbox_Layout = QtWidgets.QHBoxLayout() ####################################### CheckBox - - self.gb_ref_file = QtWidgets.QGroupBox() ########################## Ref Checkbox - self.gb_ref_file.setTitle("Original Video") - self.refLayout = QtWidgets.QVBoxLayout() - self.gb_ref_file.setLayout(self.refLayout) - - self.ref_checkbox_vlayout = QtWidgets.QVBoxLayout() - self.ref_checkbox_vlayout.setAlignment(QtCore.Qt.AlignTop) - self.refLayout.addLayout(self.ref_checkbox_vlayout) - - self.ref_buttons_vLayout = QtWidgets.QVBoxLayout() - self.ref_buttons_vLayout.setAlignment(QtCore.Qt.AlignBottom) - self.refLayout.addLayout(self.ref_buttons_vLayout) - - self.ref_buttons_hLayout = QtWidgets.QHBoxLayout() - self.ref_buttons_hLayout.setAlignment(QtCore.Qt.AlignRight) - self.ref_buttons_vLayout.addLayout(self.ref_buttons_hLayout) - - - - self.gb_input_files = QtWidgets.QGroupBox() ########################## Innput Checkbox - self.gb_input_files.setTitle("Compressed Videos") - self.inputsLayout = QtWidgets.QVBoxLayout() - self.gb_input_files.setLayout(self.inputsLayout) - - self.inputs_checkbox_vlayout = QtWidgets.QVBoxLayout() - self.inputs_checkbox_vlayout.setAlignment(QtCore.Qt.AlignTop) - self.inputsLayout.addLayout(self.inputs_checkbox_vlayout) - - self.inputs_buttons_vLayout = QtWidgets.QVBoxLayout() - self.inputs_buttons_vLayout.setAlignment(QtCore.Qt.AlignBottom) - self.inputsLayout.addLayout(self.inputs_buttons_vLayout) - - self.inputs_buttons_hLayout = QtWidgets.QHBoxLayout() - self.inputs_buttons_hLayout.setAlignment(QtCore.Qt.AlignRight) - self.inputs_buttons_vLayout.addLayout(self.inputs_buttons_hLayout) - - - - self.txtedit_Layout = QtWidgets.QHBoxLayout() ############################################### txt box - self.ref_txt = QtWidgets.QTextEdit() - self.ref_txt.setReadOnly(True) - self.input_txt = QtWidgets.QTextEdit() - self.input_txt.setReadOnly(True) - - - self.syncLayout = QtWidgets.QHBoxLayout() ################################################### Sync block - self.label_sync = QtWidgets.QLabel("Sync Time : ") - self.label_sync.setText("Sync Time (second) : ") - self.label_sync.setStyleSheet('QLabel {background-color: transparent;}') - self.label_sync.setAlignment(QtCore.Qt.AlignRight) - self.label_sync.setMaximumWidth(150) - self.le_sync = QtWidgets.QLineEdit() - self.le_sync.setMaximumWidth(50) - self.le_sync.setText("0") - self.label_sw = QtWidgets.QLabel("Sync Windows : ") - self.label_sw.setText("Sync Windows (second) : ") - self.label_sw.setStyleSheet('QLabel {background-color: transparent;}') - self.label_sw.setAlignment(QtCore.Qt.AlignRight) - self.label_sw.setMaximumWidth(175) - self.le_sw = QtWidgets.QLineEdit() - self.le_sw.setMaximumWidth(50) - self.le_sw.setText("0") - self.syncGroupBox = QtWidgets.QGroupBox() - self.syncGroupBox.setMaximumHeight(75) - self.syncGroupBox.setTitle("Synchronize ref. and tests files ") - self.syncGroupBox.setStyleSheet('QGroupBox {background-color: transparent;}') - - - self.startLayout = QtWidgets.QHBoxLayout() ################################################# Start and reset - - self.btn_start = QtWidgets.QPushButton("Start") - self.btn_start.setStyleSheet('QPushButton:hover {background-color: #28a745; color: #ffffff; font-size: 15px; } QPushButton {color: #28a745; border:2px solid #28a745; background-color: transparent; border-radius: 4px;}') - self.btn_start.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) - self.btn_start.setMinimumSize(0.04*self.size.width() , 0.04*self.size.height()) - - - self.btn_reset = QtWidgets.QPushButton("Reset") - self.btn_reset.setStyleSheet('QPushButton:hover {background-color: #dc3545; color: #ffffff; font-size: 15px; } QPushButton {color: #dc3545; border:2px solid #dc3545; background-color: transparent; border-radius: 4px;}') - self.btn_reset.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) - self.btn_reset.setMinimumSize(0.04*self.size.width() , 0.04*self.size.height()) - - self.btn_export_png = QtWidgets.QPushButton("Export PNG") - self.btn_export_png.setStyleSheet('QPushButton:hover {background-color: #007bff; color: #ffffff; font-size: 15px; } QPushButton {color: #007bff; border:2px solid #007bff; background-color: transparent; border-radius: 4px;}') - self.btn_export_png.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) - self.btn_export_png.setMinimumSize(0.04*self.size.width() , 0.04*self.size.height()) - - self.inputs_column_widget = QtWidgets.QWidget() - self.inputs_column_widget.setLayout(self.inputs_column_Layout) - - self.inputs_column_Layout.insertLayout(3, self.startLayout) - - self.HSplitter.addWidget(self.inputs_column_widget) - - - self.chartVSplitter = QtWidgets.QSplitter() ############################################### Line Chart - self.chartVSplitter.setOrientation(QtCore.Qt.Vertical) - - self.chart_vmaf = self.create_chart("VMAF") - self.chartView_vmaf = QtCharts.QChartView(self.chart_vmaf) - self.chartView_vmaf.setRenderHint(QPainter.Antialiasing) - - self.chart_psnr = self.create_chart("PSNR") - self.chartView_psnr = QtCharts.QChartView(self.chart_psnr) - self.chartView_psnr.setRenderHint(QPainter.Antialiasing) - - self.chart_bitrate = self.create_chart("Bitrate Kbps") - self.chartView_bitrate = QtCharts.QChartView(self.chart_bitrate) - self.chartView_bitrate.setRenderHint(QPainter.Antialiasing) - - self.radio_time = QtWidgets.QRadioButton("Seconds") - self.radio_frame = QtWidgets.QRadioButton("Frames") - - - self.barVSplitter = QtWidgets.QSplitter() #################################################### Bar Chart - self.barVSplitter.setOrientation(QtCore.Qt.Vertical) - - self.barChart_vmaf = self.create_chart("VMAF") - self.barChartView_vmaf = QtCharts.QChartView(self.barChart_vmaf) - self.barChartView_vmaf.setRenderHint(QPainter.Antialiasing) - - self.barChart_psnr = self.create_chart("PSNR") - self.barChartView_psnr = QtCharts.QChartView(self.barChart_psnr) - self.barChartView_psnr.setRenderHint(QPainter.Antialiasing) - - self.barChart_bitrate = self.create_chart("Bitrate Kbps") - self.barChartView_bitrate = QtCharts.QChartView(self.barChart_bitrate) - self.barChartView_bitrate.setRenderHint(QPainter.Antialiasing) - - def create_chart(self, title): - chart = QtCharts.QChart() - chart.setTitle(title) - chart.setMinimumSize(0.25*self.size.width() , 0.25*self.size.height()) - chart.legend().setVisible(True) - chart.legend().setAlignment(Qt.AlignBottom) - chart.setAnimationOptions(QtCharts.QChart.AllAnimations) - #chart.setTheme(QtCharts.QChart.ChartThemeLight) - return chart - - def add_inputs_layout(self): - self.inputs_column_Layout.insertLayout(0, self.inputs_btn_Layout) - self.ref_buttons_hLayout.addWidget(self.btn_importRef) - self.inputs_buttons_hLayout.addWidget(self.btn_importInputs) - self.inputs_buttons_hLayout.addWidget(self.label_or) - self.inputs_buttons_hLayout.addWidget(self.import_json_btn) - - def remove_inputs_layout(self): - self.btn_importRef.setParent(None) - self.btn_importInputs.setParent(None) - self.import_json_btn.setParent(None) - self.label_or.setParent(None) - self.inputs_btn_Layout.setParent(None) - - def add_checkbox(self): - self.inputs_column_Layout.insertLayout(1, self.inputs_checkbox_Layout) - self.inputs_checkbox_Layout.addWidget(self.gb_ref_file) - self.inputs_checkbox_Layout.addWidget(self.gb_input_files) - - def remove_checkbox_values(self) : - for key, value in self.inputCheckbox_dict.items(): - value.setParent(None) - - for key, value in self.refCheckbox_dict.items(): - value.setParent(None) - - - def remove_ref_checkbox_values(self) : - for key, value in self.refCheckbox_dict.items(): - if type(value) == QtWidgets.QCheckBox: - value.setParent(None) - - def remove_inputs_checkbox_values(self) : - for key, value in self.inputCheckbox_dict.items(): - if type(value) == QtWidgets.QCheckBox: - value.setParent(None) - - def add_sync_block(self): - self.syncLayout.addWidget(self.label_sync) - self.syncLayout.addWidget(self.le_sync) - self.syncLayout.addWidget(self.label_sw) - self.syncLayout.addWidget(self.le_sw) - self.syncGroupBox.setLayout(self.syncLayout) - self.inputs_column_Layout.insertWidget(2, self.syncGroupBox) - self.syncLayout.setAlignment(QtCore.Qt.AlignRight) - - def remove_sync_block(self): - self.label_sync.setParent(None) - self.le_sync.setParent(None) - self.label_sw.setParent(None) - self.le_sw.setParent(None) - self.syncGroupBox.setParent(None) - - def add_txtbox(self): - self.inputs_column_Layout.insertLayout(2, self.txtedit_Layout) - self.txtedit_Layout.addWidget(self.input_txt) - - def remove_txtbox(self): - self.ref_txt.setParent(None) - self.input_txt.setParent(None) - self.txtedit_Layout.setParent(None) - - def add_start_btn(self): - self.startLayout.addWidget(self.btn_start) - self.startLayout.setAlignment(QtCore.Qt.AlignRight) - - def remove_start_btn(self): - self.btn_start.setParent(None) - - def add_reset_btn(self): - self.startLayout.insertWidget(0, self.btn_reset) - - def remove_reset_btn(self): - self.btn_reset.setParent(None) - - def add_export_png_btn(self): - self.startLayout.insertWidget(0, self.btn_export_png) - - def remove_export_png_btn(self): - self.btn_export_png.setParent(None) - - def add_Chart(self): - self.HSplitter.addWidget(self.chartVSplitter) - self.chartVSplitter.addWidget(self.chartView_vmaf) - self.chartVSplitter.addWidget(self.chartView_psnr) - self.chartVSplitter.addWidget(self.chartView_bitrate) - - def remove_Chart(self): - self.chartView_vmaf.setParent(None) - self.chartView_psnr.setParent(None) - self.chartView_bitrate.setParent(None) - self.chartVSplitter.setParent(None) - - def add_radioLayout(self): - self.radioLayout = QtWidgets.QHBoxLayout() - self.radioLayout.addWidget(self.radio_time) - self.radioLayout.addWidget(self.radio_frame) - self.radioLayout.setAlignment(QtCore.Qt.AlignRight) - self.radioLayout_widget = QtWidgets.QWidget() - self.radioLayout_widget.setLayout(self.radioLayout) - self.chartVSplitter.addWidget(self.radioLayout_widget) - - def remove_radioLayout(self): - self.radio_time.setParent(None) - self.radio_frame.setParent(None) - self.radioLayout_widget.setParent(None) - - def add_BarChart(self): - self.HSplitter.addWidget(self.barVSplitter) - self.barVSplitter.addWidget(self.barChartView_vmaf) - self.barVSplitter.addWidget(self.barChartView_psnr) - self.barVSplitter.addWidget(self.barChartView_bitrate) - self.label = QtWidgets.QLabel() - self.label.setMargin(11) - self.barVSplitter.addWidget(self.label) - - def remove_BarChart(self): - self.barChartView_vmaf.setParent(None) - self.barChartView_psnr.setParent(None) - self.barChartView_bitrate.setParent(None) - self.barVSplitter.setParent(None) - +from PySide2 import QtGui, QtWidgets, QtCore +from functools import partial +from PySide2.QtCharts import QtCharts +from PySide2.QtCore import QPoint, Qt +from PySide2.QtGui import QPainter + +class Ui_fenetrePrincipale(object): + def setupUi(self, mainWindow): + + mainWindow.setObjectName("mainWindow") + + self.gridLayout = QtWidgets.QGridLayout(mainWindow) + self.tabwidget = QtWidgets.QTabWidget() + self.HSplitter = QtWidgets.QSplitter() + self.gridLayout.addWidget(self.tabwidget, 0, 1, 1, 1) + self.tabwidget.addTab(self.HSplitter, "General") + + self.widgets_and_layouts() + self.setting_widget() + self.add_inputs_layout() + self.add_checkbox() + self.add_sync_block() + self.add_start_btn() + self.add_reset_btn() + + def setting_widget(self): + + self.setting_vgrid = QtWidgets.QVBoxLayout() + self.setting_vgrid_widget = QtWidgets.QWidget() + self.setting_vgrid_widget.setLayout(self.setting_vgrid) + self.tabwidget.addTab(self.setting_vgrid_widget, "Settings") + + self.setting_grid = QtWidgets.QGridLayout() + + self.setting_vgrid.addLayout(self.setting_grid) + self.setting_vgrid.setAlignment(QtCore.Qt.AlignTop) + + self.deint_setting = QtWidgets.QLabel() + #self.deint_setting.setMaximumWidth(0.06*self.size.width()) + self.deint_setting.setText("Ref Deint filter : ") + self.deint_setting.setStyleSheet('QLabel {background-color: transparent;}') + self.deint_setting.setAlignment(QtCore.Qt.AlignRight) + self.deint_combobox = QtWidgets.QComboBox() + #self.deint_combobox.setMaximumWidth(0.06*self.size.width()) + self.deint_combobox.insertItem(0, "auto") + self.deint_combobox.insertItem(1, "yadif=0:-1:0") + self.deint_combobox.insertItem(2, "yadif=1:-1:0") + self.deint_combobox.insertItem(3, "null") + + + self.subsampling_setting = QtWidgets.QLabel() + self.subsampling_setting.setText("Quality subsampling : ") + self.subsampling_setting.setStyleSheet('QLabel {background-color: transparent;}') + self.subsampling_setting.setAlignment(QtCore.Qt.AlignRight) + self.subsampling_combobox = QtWidgets.QComboBox() + self.subsampling_combobox.insertItem(0, "auto") + self.subsampling_combobox.insertItem(1, "1") + self.subsampling_combobox.insertItem(2, "2") + self.subsampling_combobox.insertItem(3, "3") + self.subsampling_combobox.insertItem(4, "4") + self.subsampling_combobox.insertItem(5, "5") + self.subsampling_combobox.insertItem(6, "6") + self.subsampling_combobox.insertItem(7, "7") + self.subsampling_combobox.insertItem(8, "8") + self.subsampling_combobox.insertItem(9, "9") + self.subsampling_combobox.insertItem(10, "10") + + + self.scale_setting = QtWidgets.QLabel() + self.scale_setting.setText("Scale filter : ") + self.scale_setting.setStyleSheet('QLabel {background-color: transparent;}') + self.scale_setting.setAlignment(QtCore.Qt.AlignRight) + self.scale_combobox = QtWidgets.QComboBox() + self.scale_combobox.insertItem(0, "neighbor") + self.scale_combobox.insertItem(1, "fast_bilinear") + self.scale_combobox.insertItem(2, "bilinear") + self.scale_combobox.insertItem(3, "bicubic") + self.scale_combobox.insertItem(4, "experimental") + self.scale_combobox.insertItem(5, "area") + self.scale_combobox.insertItem(6, "bicublin") + self.scale_combobox.insertItem(7, "gauss") + self.scale_combobox.insertItem(8, "sinc") + self.scale_combobox.insertItem(9, "lanczos") + self.scale_combobox.insertItem(10, "spline") + + + self.vmaf_model_setting = QtWidgets.QLabel() + self.vmaf_model_setting.setText("VMAF Model : ") + self.vmaf_model_setting.setStyleSheet('QLabel {background-color: transparent;}') + self.vmaf_model_setting.setAlignment(QtCore.Qt.AlignRight) + self.vmaf_model_combobox = QtWidgets.QComboBox() + self.vmaf_model_combobox.insertItem(0, "auto") + self.vmaf_model_combobox.insertItem(1, "vmaf_float_v0.6.1.json") + self.vmaf_model_combobox.insertItem(2, "vmaf_float_v0.6.1.json:phone_model") + self.vmaf_model_combobox.insertItem(3, "vmaf_4k_v0.6.1.json") + + + self.loglevel_setting = QtWidgets.QLabel() + self.loglevel_setting.setText("Loglevel : ") + self.loglevel_setting.setStyleSheet('QLabel {background-color: transparent;}') + self.loglevel_setting.setAlignment(QtCore.Qt.AlignRight) + self.loglevel_combobox = QtWidgets.QComboBox() + self.loglevel_combobox.insertItem(0, "info") + self.loglevel_combobox.insertItem(1, "quiet") + + + self.png_resolution = QtWidgets.QLabel() + self.png_resolution.setText("PNG Resolution : ") + self.png_resolution.setStyleSheet('QLabel {background-color: transparent;}') + self.png_resolution.setAlignment(QtCore.Qt.AlignRight) + self.png_resolution_hlayout = QtWidgets.QHBoxLayout() + self.png_resolution_hlayout.setAlignment(QtCore.Qt.AlignLeft) + self.png_width = QtWidgets.QLineEdit() + self.png_width.setAlignment(QtCore.Qt.AlignRight) + self.png_width.setMaximumWidth(150) + self.png_width.setText("1920") + self.png_ = QtWidgets.QLabel() + self.png_.setStyleSheet('QLabel {background-color: transparent;}') + self.png_.setAlignment(QtCore.Qt.AlignLeft) + self.png_.setMaximumWidth(10) + self.png_.setText(" : ") + self.png_height = QtWidgets.QLineEdit() + self.png_height.setAlignment(QtCore.Qt.AlignRight) + self.png_height.setMaximumWidth(150) + self.png_height.setText("1080") + self.png_resolution_hlayout.addWidget(self.png_width) + self.png_resolution_hlayout.addWidget(self.png_) + self.png_resolution_hlayout.addWidget(self.png_height) + + self.setting_grid.addWidget(self.vmaf_model_setting, 0,0,1,1) + self.setting_grid.addWidget(self.vmaf_model_combobox, 0,1,1,1) + self.setting_grid.addWidget(self.scale_setting, 1,0,1,1) + self.setting_grid.addWidget(self.scale_combobox, 1,1,1,1) + self.setting_grid.addWidget(self.deint_setting, 2,0,1,1) + self.setting_grid.addWidget(self.deint_combobox, 2,1,1,1) + self.setting_grid.addWidget(self.subsampling_setting, 3,0,1,1) + self.setting_grid.addWidget(self.subsampling_combobox, 3,1,1,1) + self.setting_grid.addWidget(self.loglevel_setting, 4,0,1,1) + self.setting_grid.addWidget(self.loglevel_combobox, 4,1,1,1) + self.setting_grid.addWidget(self.png_resolution, 5,0,1,1) + self.setting_grid.addLayout(self.png_resolution_hlayout, 5,1,1,1) + + + def widgets_and_layouts(self): + + self.inputs_column_Layout = QtWidgets.QVBoxLayout() + + self.inputs_btn_Layout = QtWidgets.QHBoxLayout() ########################################### Imports Butons + self.btn_importRef = QtWidgets.QPushButton(" Import Video ") + self.btn_importRef.setMinimumSize(0.06*self.size.width() , 0.04*self.size.height()) + self.btn_importRef.setStyleSheet('QPushButton:hover {background-color: #007bff; color: #ffffff; font-size: 15px; } QPushButton {color: #007bff; border:2px solid #007bff; background-color: transparent; border-radius: 4px;}') + self.btn_importRef.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + + self.btn_importInputs = QtWidgets.QPushButton(" Import Video ") + self.btn_importInputs.setMinimumSize(0.06*self.size.width() , 0.04*self.size.height()) + self.btn_importInputs.setStyleSheet('QPushButton:hover {background-color: #007bff; color: #ffffff; font-size: 15px; } QPushButton {color: #007bff; border:2px solid #007bff; background-color: transparent; border-radius: 4px;}') + self.btn_importInputs.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + + self.label_or = QtWidgets.QLabel("or") + self.label_or.setText("or") + self.label_or.setStyleSheet('QLabel {background-color: transparent;}') + + self.import_json_btn = QtWidgets.QPushButton(" Import Measurements ") + self.import_json_btn.setMinimumSize(0.06*self.size.width() , 0.04*self.size.height()) + self.import_json_btn.setStyleSheet('QPushButton:hover {background-color: #007bff; color: #ffffff; font-size: 15px; } QPushButton {color: #007bff; border:2px solid #007bff; background-color: transparent; border-radius: 4px;}') + self.import_json_btn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + + + self.inputs_checkbox_Layout = QtWidgets.QHBoxLayout() ####################################### CheckBox + + self.gb_ref_file = QtWidgets.QGroupBox() ########################## Ref Checkbox + self.gb_ref_file.setTitle("Original Video") + self.refLayout = QtWidgets.QVBoxLayout() + self.gb_ref_file.setLayout(self.refLayout) + + self.ref_checkbox_vlayout = QtWidgets.QVBoxLayout() + self.ref_checkbox_vlayout.setAlignment(QtCore.Qt.AlignTop) + self.refLayout.addLayout(self.ref_checkbox_vlayout) + + self.ref_buttons_vLayout = QtWidgets.QVBoxLayout() + self.ref_buttons_vLayout.setAlignment(QtCore.Qt.AlignBottom) + self.refLayout.addLayout(self.ref_buttons_vLayout) + + self.ref_buttons_hLayout = QtWidgets.QHBoxLayout() + self.ref_buttons_hLayout.setAlignment(QtCore.Qt.AlignRight) + self.ref_buttons_vLayout.addLayout(self.ref_buttons_hLayout) + + + + self.gb_input_files = QtWidgets.QGroupBox() ########################## Innput Checkbox + self.gb_input_files.setTitle("Compressed Videos") + self.inputsLayout = QtWidgets.QVBoxLayout() + self.gb_input_files.setLayout(self.inputsLayout) + + self.inputs_checkbox_vlayout = QtWidgets.QVBoxLayout() + self.inputs_checkbox_vlayout.setAlignment(QtCore.Qt.AlignTop) + self.inputsLayout.addLayout(self.inputs_checkbox_vlayout) + + self.inputs_buttons_vLayout = QtWidgets.QVBoxLayout() + self.inputs_buttons_vLayout.setAlignment(QtCore.Qt.AlignBottom) + self.inputsLayout.addLayout(self.inputs_buttons_vLayout) + + self.inputs_buttons_hLayout = QtWidgets.QHBoxLayout() + self.inputs_buttons_hLayout.setAlignment(QtCore.Qt.AlignRight) + self.inputs_buttons_vLayout.addLayout(self.inputs_buttons_hLayout) + + + + self.txtedit_Layout = QtWidgets.QHBoxLayout() ############################################### txt box + self.ref_txt = QtWidgets.QTextEdit() + self.ref_txt.setReadOnly(True) + self.input_txt = QtWidgets.QTextEdit() + self.input_txt.setReadOnly(True) + + + self.syncLayout = QtWidgets.QHBoxLayout() ################################################### Sync block + self.label_sync = QtWidgets.QLabel("Sync Time : ") + self.label_sync.setText("Sync Time (second) : ") + self.label_sync.setStyleSheet('QLabel {background-color: transparent;}') + self.label_sync.setAlignment(QtCore.Qt.AlignRight) + self.label_sync.setMaximumWidth(150) + self.le_sync = QtWidgets.QLineEdit() + self.le_sync.setMaximumWidth(50) + self.le_sync.setText("0") + self.label_sw = QtWidgets.QLabel("Sync Windows : ") + self.label_sw.setText("Sync Windows (second) : ") + self.label_sw.setStyleSheet('QLabel {background-color: transparent;}') + self.label_sw.setAlignment(QtCore.Qt.AlignRight) + self.label_sw.setMaximumWidth(175) + self.le_sw = QtWidgets.QLineEdit() + self.le_sw.setMaximumWidth(50) + self.le_sw.setText("0") + self.syncGroupBox = QtWidgets.QGroupBox() + self.syncGroupBox.setMaximumHeight(75) + self.syncGroupBox.setTitle("Synchronize ref. and tests files ") + self.syncGroupBox.setStyleSheet('QGroupBox {background-color: transparent;}') + + + self.startLayout = QtWidgets.QHBoxLayout() ################################################# Start and reset + + self.btn_start = QtWidgets.QPushButton("Start") + self.btn_start.setStyleSheet('QPushButton:hover {background-color: #28a745; color: #ffffff; font-size: 15px; } QPushButton {color: #28a745; border:2px solid #28a745; background-color: transparent; border-radius: 4px;}') + self.btn_start.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.btn_start.setMinimumSize(0.04*self.size.width() , 0.04*self.size.height()) + + + self.btn_reset = QtWidgets.QPushButton("Reset") + self.btn_reset.setStyleSheet('QPushButton:hover {background-color: #dc3545; color: #ffffff; font-size: 15px; } QPushButton {color: #dc3545; border:2px solid #dc3545; background-color: transparent; border-radius: 4px;}') + self.btn_reset.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.btn_reset.setMinimumSize(0.04*self.size.width() , 0.04*self.size.height()) + + self.btn_export_png = QtWidgets.QPushButton("Export PNG") + self.btn_export_png.setStyleSheet('QPushButton:hover {background-color: #007bff; color: #ffffff; font-size: 15px; } QPushButton {color: #007bff; border:2px solid #007bff; background-color: transparent; border-radius: 4px;}') + self.btn_export_png.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.btn_export_png.setMinimumSize(0.04*self.size.width() , 0.04*self.size.height()) + + self.inputs_column_widget = QtWidgets.QWidget() + self.inputs_column_widget.setLayout(self.inputs_column_Layout) + + self.inputs_column_Layout.insertLayout(3, self.startLayout) + + self.HSplitter.addWidget(self.inputs_column_widget) + + + self.chartVSplitter = QtWidgets.QSplitter() ############################################### Line Chart + self.chartVSplitter.setOrientation(QtCore.Qt.Vertical) + + self.chart_vmaf = self.create_chart("VMAF") + self.chartView_vmaf = QtCharts.QChartView(self.chart_vmaf) + self.chartView_vmaf.setRenderHint(QPainter.Antialiasing) + + self.chart_psnr = self.create_chart("PSNR") + self.chartView_psnr = QtCharts.QChartView(self.chart_psnr) + self.chartView_psnr.setRenderHint(QPainter.Antialiasing) + + self.chart_bitrate = self.create_chart("Bitrate Kbps") + self.chartView_bitrate = QtCharts.QChartView(self.chart_bitrate) + self.chartView_bitrate.setRenderHint(QPainter.Antialiasing) + + self.radio_time = QtWidgets.QRadioButton("Seconds") + self.radio_frame = QtWidgets.QRadioButton("Frames") + + + self.barVSplitter = QtWidgets.QSplitter() #################################################### Bar Chart + self.barVSplitter.setOrientation(QtCore.Qt.Vertical) + + self.barChart_vmaf = self.create_chart("VMAF") + self.barChartView_vmaf = QtCharts.QChartView(self.barChart_vmaf) + self.barChartView_vmaf.setRenderHint(QPainter.Antialiasing) + + self.barChart_psnr = self.create_chart("PSNR") + self.barChartView_psnr = QtCharts.QChartView(self.barChart_psnr) + self.barChartView_psnr.setRenderHint(QPainter.Antialiasing) + + self.barChart_bitrate = self.create_chart("Bitrate Kbps") + self.barChartView_bitrate = QtCharts.QChartView(self.barChart_bitrate) + self.barChartView_bitrate.setRenderHint(QPainter.Antialiasing) + + def create_chart(self, title): + chart = QtCharts.QChart() + chart.setTitle(title) + chart.setMinimumSize(0.25*self.size.width() , 0.25*self.size.height()) + chart.legend().setVisible(True) + chart.legend().setAlignment(Qt.AlignBottom) + chart.setAnimationOptions(QtCharts.QChart.AllAnimations) + #chart.setTheme(QtCharts.QChart.ChartThemeLight) + return chart + + def add_inputs_layout(self): + self.inputs_column_Layout.insertLayout(0, self.inputs_btn_Layout) + self.ref_buttons_hLayout.addWidget(self.btn_importRef) + self.inputs_buttons_hLayout.addWidget(self.btn_importInputs) + self.inputs_buttons_hLayout.addWidget(self.label_or) + self.inputs_buttons_hLayout.addWidget(self.import_json_btn) + + def remove_inputs_layout(self): + self.btn_importRef.setParent(None) + self.btn_importInputs.setParent(None) + self.import_json_btn.setParent(None) + self.label_or.setParent(None) + self.inputs_btn_Layout.setParent(None) + + def add_checkbox(self): + self.inputs_column_Layout.insertLayout(1, self.inputs_checkbox_Layout) + self.inputs_checkbox_Layout.addWidget(self.gb_ref_file) + self.inputs_checkbox_Layout.addWidget(self.gb_input_files) + + def remove_checkbox_values(self) : + for key, value in self.inputCheckbox_dict.items(): + value.setParent(None) + + for key, value in self.refCheckbox_dict.items(): + value.setParent(None) + + + def remove_ref_checkbox_values(self) : + for key, value in self.refCheckbox_dict.items(): + if type(value) == QtWidgets.QCheckBox: + value.setParent(None) + + def remove_inputs_checkbox_values(self) : + for key, value in self.inputCheckbox_dict.items(): + if type(value) == QtWidgets.QCheckBox: + value.setParent(None) + + def add_sync_block(self): + self.syncLayout.addWidget(self.label_sync) + self.syncLayout.addWidget(self.le_sync) + self.syncLayout.addWidget(self.label_sw) + self.syncLayout.addWidget(self.le_sw) + self.syncGroupBox.setLayout(self.syncLayout) + self.inputs_column_Layout.insertWidget(2, self.syncGroupBox) + self.syncLayout.setAlignment(QtCore.Qt.AlignRight) + + def remove_sync_block(self): + self.label_sync.setParent(None) + self.le_sync.setParent(None) + self.label_sw.setParent(None) + self.le_sw.setParent(None) + self.syncGroupBox.setParent(None) + + def add_txtbox(self): + self.inputs_column_Layout.insertLayout(2, self.txtedit_Layout) + self.txtedit_Layout.addWidget(self.input_txt) + + def remove_txtbox(self): + self.ref_txt.setParent(None) + self.input_txt.setParent(None) + self.txtedit_Layout.setParent(None) + + def add_start_btn(self): + self.startLayout.addWidget(self.btn_start) + self.startLayout.setAlignment(QtCore.Qt.AlignRight) + + def remove_start_btn(self): + self.btn_start.setParent(None) + + def add_reset_btn(self): + self.startLayout.insertWidget(0, self.btn_reset) + + def remove_reset_btn(self): + self.btn_reset.setParent(None) + + def add_export_png_btn(self): + self.startLayout.insertWidget(0, self.btn_export_png) + + def remove_export_png_btn(self): + self.btn_export_png.setParent(None) + + def add_Chart(self): + self.HSplitter.addWidget(self.chartVSplitter) + self.chartVSplitter.addWidget(self.chartView_vmaf) + self.chartVSplitter.addWidget(self.chartView_psnr) + self.chartVSplitter.addWidget(self.chartView_bitrate) + + def remove_Chart(self): + self.chartView_vmaf.setParent(None) + self.chartView_psnr.setParent(None) + self.chartView_bitrate.setParent(None) + self.chartVSplitter.setParent(None) + + def add_radioLayout(self): + self.radioLayout = QtWidgets.QHBoxLayout() + self.radioLayout.addWidget(self.radio_time) + self.radioLayout.addWidget(self.radio_frame) + self.radioLayout.setAlignment(QtCore.Qt.AlignRight) + self.radioLayout_widget = QtWidgets.QWidget() + self.radioLayout_widget.setLayout(self.radioLayout) + self.chartVSplitter.addWidget(self.radioLayout_widget) + + def remove_radioLayout(self): + self.radio_time.setParent(None) + self.radio_frame.setParent(None) + self.radioLayout_widget.setParent(None) + + def add_BarChart(self): + self.HSplitter.addWidget(self.barVSplitter) + self.barVSplitter.addWidget(self.barChartView_vmaf) + self.barVSplitter.addWidget(self.barChartView_psnr) + self.barVSplitter.addWidget(self.barChartView_bitrate) + self.label = QtWidgets.QLabel() + self.label.setMargin(11) + self.barVSplitter.addWidget(self.label) + + def remove_BarChart(self): + self.barChartView_vmaf.setParent(None) + self.barChartView_psnr.setParent(None) + self.barChartView_bitrate.setParent(None) + self.barVSplitter.setParent(None) + From 2c712c0170cda240ab7f72c660089ab582ccc929 Mon Sep 17 00:00:00 2001 From: Toannd Date: Fri, 16 Feb 2024 11:35:08 +0700 Subject: [PATCH 5/6] fix path handling on window --- .gitignore | 8 +++++++- videobench.py | 2 +- videobench_functions.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 1d2386f..f6643a7 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,10 @@ env/ venv/ ENV/ env.bak/ -venv.bak/ \ No newline at end of file +venv.bak/ +tmp/ +workspace/ + +*.mp4 +*.wmv +*.avi diff --git a/videobench.py b/videobench.py index 99af421..b66cb98 100755 --- a/videobench.py +++ b/videobench.py @@ -10,7 +10,7 @@ from multiprocessing import Pool from videobench_functions import * -tmp_path = "/tmp/videobench/" +tmp_path = tmp_path = os.path.join(os.getcwd(), "tmp/") #p = Pool(1) def manage_ref_file(ref_file, loglevel): diff --git a/videobench_functions.py b/videobench_functions.py index 252f3e7..d5ae876 100644 --- a/videobench_functions.py +++ b/videobench_functions.py @@ -14,7 +14,7 @@ container_tmp_path ="/home/shared-vmaf/" -tmp_path = "/tmp/videobench/" +tmp_path = os.path.join(os.getcwd(), "tmp/") docker_cmd = "docker container run --rm -v {}:{} docker-videobench".format(tmp_path, container_tmp_path) class videoFileInfos(object): From 5eea1a3cf5be41845610b2e41bdf32da6036a028 Mon Sep 17 00:00:00 2001 From: Toannd Date: Fri, 16 Feb 2024 11:47:01 +0700 Subject: [PATCH 6/6] add python path options --- videobench_layout.py | 10 +++++++++- videobench_ui.py | 6 +++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/videobench_layout.py b/videobench_layout.py index b436dc3..ff4c8d4 100644 --- a/videobench_layout.py +++ b/videobench_layout.py @@ -103,6 +103,13 @@ def setting_widget(self): self.loglevel_combobox.insertItem(0, "info") self.loglevel_combobox.insertItem(1, "quiet") + self.python_path_setting = QtWidgets.QLabel() + self.python_path_setting.setText("Python Path : ") + self.python_path_setting.setStyleSheet('QLabel {background-color: transparent;}') + self.python_path_setting.setAlignment(QtCore.Qt.AlignRight) + self.python_path_combobox = QtWidgets.QComboBox() + self.python_path_combobox.insertItem(0, "python") + self.python_path_combobox.insertItem(1, "python3") self.png_resolution = QtWidgets.QLabel() self.png_resolution.setText("PNG Resolution : ") @@ -139,7 +146,8 @@ def setting_widget(self): self.setting_grid.addWidget(self.loglevel_combobox, 4,1,1,1) self.setting_grid.addWidget(self.png_resolution, 5,0,1,1) self.setting_grid.addLayout(self.png_resolution_hlayout, 5,1,1,1) - + self.setting_grid.addWidget(self.python_path_setting, 6,0,1,1) + self.setting_grid.addWidget(self.python_path_combobox, 6,1,1,1) def widgets_and_layouts(self): diff --git a/videobench_ui.py b/videobench_ui.py index 33c88a3..aa9101b 100755 --- a/videobench_ui.py +++ b/videobench_ui.py @@ -39,7 +39,6 @@ def screen_infos(self): def Init_values(self): self.currentPath = os.path.dirname(__file__) - self.python_path = "python3" self.videoAnalyzerPath = os.path.dirname(os.path.abspath(__file__)) + "/videobench.py" self.list_obj=[] self.jsonFilesNames = [] @@ -593,6 +592,7 @@ def run_qprocess(self): scale_setting = self.scale_combobox.currentText() vmaf_model_setting = self.vmaf_model_combobox.currentText() loglevel = self.loglevel_combobox.currentText() + python_path = self.python_path_combobox.currentText() self.progressbar_step = 1 self.progressbar.setValue(self.progressbar_step) @@ -626,7 +626,7 @@ def run_qprocess(self): self.te_operation.append("*****************************") self.te_operation.append("STARTING VIDEO BENCH") - self.te_operation.append(self.python_path + " " + cmd) + self.te_operation.append(python_path + " " + cmd) self.te_operation.append("*****************************") @@ -635,7 +635,7 @@ def run_qprocess(self): process.readyReadStandardOutput.connect(partial(self.dataReady, process)) process.finished.connect(self.update_ui) process.setProgram(self.videoAnalyzerPath) - process.start(self.python_path, cmd_list) + process.start(python_path, cmd_list)