Skip to content

Repository files navigation

QCTools Automation Scripts

This repository contains scripts for automating analysis of QCTools reports.

Overview

Install from source:

  • Create a new Python Virtual Environment for qct_parse
    • Unix based (Mac or Linux):
      python3 -m venv name_of_env
    • Windows:
      py -m venv name_of_env (where 'name_of_env' is replaced with the name of your virtual environment)
  • Activate virtual env
    • Unix based (Mac or Linux):
      source ./name_of_env/bin/activate
    • Windows:
      name_of_env\scripts\activate
  • Install Package
    • Navigate to the repo root directory path/to/qct-parse/
    • Run the command:
      python -m pip install .

Test Code

If you intend to develop the code for your proposes or contribute to the open source project, a test directory is provided in the repo.

  • Activate virtual env (see Install from source)
  • Install pytest pip install pytest
  • Run tests python -m pytest

Building the documentation

  • Activate virtual env (see Install from source)
  • Install sphinx and myst-parser pip install sphinx myst-parser
  • Run sphinx-build command sphinx-build ./docs ./dist/docs

Commands:

  • qct-parse -i/--input [path to QCTools report] [optional arguments]
    Finds frames that exceed thresholds for QCTool tag(s). Full list of command line arguments below.

qct-parse

Run a single tag against a supplied value or multiple tags using a profile.

Arguments

ArgumentDescription
-h, --helpShow this help message and exit
-i, --inputPath to the input qctools.xml.gz or qctools.mkv file
-t, --tagnameThe tag name you want to test (e.g., SATMAX); see table of tag names below for list
-o, --overThreshold overage number
-u, --underThreshold under number
-p, --profileCompare frame data against tag values from config.txt. Use -p default for QCTools default values
-buff, --buffSizeCircular buffer size. If even, defaults to the next odd number (default: 11)
-te, --thumbExportEnable/disable thumbnail export (default: off)
-ted, --thumbExportDelayMinimum frames between exported thumbnails (default: 9000)
-tep, --thumbExportPathPath to thumbnail export. Uses input base-path if omitted
-ds, --durationStartStart analysis from this time (seconds, equivalent to ffmpeg -ss)
-de, --durationEndEnd analysis after this time (seconds, equivalent to ffmpeg -t)
-bd, --barsDetectionEnable/disable bar detection (default: off)
-be, --barsEvaluationUse peak values from color bars as 'profile' if bars are detected
-pr, --printPrint over/under frame data to console (default: off)
-csv, --csvreportPrint summary results to a csv sidecar file
-q, --quietSuppress ffmpeg output in console (default: off)

Tags

Tag categoryTag names
YUV valuesYMIN,YLOW,YAVG,YHIGH,YMAX
UMIN,ULOW,UAVG,UHIGH,UMAX
VMIN,VLOW,VAVG,VHIGH,VMAX
YUV values (difference)YDIF,UDIF,VDIF
Saturation valuesSATMIN,SATLOW,SATAVG,SATHIGH,SATMAX
Hue valuesHUEMED,HUEAVG
Temporal outliersTOUT
Vertical line repetitionsVREP
Broadcast rangeBRNG
Mean square error fieldsmse_y,mse_u,mse_v,mse_avg
Peak signal to noise ratio fieldspsnr_y,psnr_u,psnr_v,psnr_avg

Examples

Run single tag tests

qct-parse -t SATMAX -o 235 -t YMIN -u 16 -i /path/to/report.mkv.qctools.xml.gz

Run bars detection using default QCTools profile

qct-parse -bd -p default -i /path/to/report.mkv.qctools.mkv

Export thumbnails of frames beyond threshold

qct-parse -p default -te -tep /path/to/export/folder -i /path/to/report.mkv.qctools.xml.gz

Use peak values from detected color bars as thresholds

qct-parse -bd -be -i /path/to/report.mkv.qctools.xml.gz

Input files

qct-parse.py will work with the following QCTools report formats:

qctools.xml.gz qctools.mkv

If the qctools.xml.gz report is in an MKV attachment, the qctools.xml.gz report file will be extracted and saved as a separate file.

Both 8-bit and 10-bit values are supported. The bit depth will be detected automatically, and does not need to be specified.

Config Files

The provided profiles are:

  • default
  • highTolerance
  • midTolerance
  • lowTolerance

Each of these profiles contain the following tags with a corresponding threshold:
YLOW, YMAX, UMIN, UMAX, VMIN, VMAX, SATMAX, TOUT, VREP

The profiles are stored in the config.txt files. Please note that there is a separate config.txt for 8-bit and 10-bit values.

The process for providing user supplied profiles is in development.
Currently, if you wish to create your own profile, you will need to create your own config directory and config.txt file.
There is a environmental variable at the top of qct-parse.py which can be used to reset the config directory:

CONFIG_ENVIRONMENT_VARIABLE_NAME = 'QCT_PARSE_CONFIG_DIRECTORY'

Simply place the full path to the user created config directory in place of 'QCT_PARSE_CONFIG_DIRECTORY'

Thumbnails

Thumbnails of failed frames will be exported if the -te flag is invoked.

In order to export thumbnails, the QCTools report must be in the same directory as the video file it is describing, and must have the same file name as the report (excluding the qctools.xml.gz).

If you would like to provide a path for exporting thumbnails, you can do so using the -tep flag.
Otherwise, thumbnails will automatically be created in the same directory as the video file and QCTools report, in a new directory.

When running qct-parse with a profile, the thumbnails will be placed in a directory named ThumbExports. When run against single tags the directory will be named [TAG NAME].[THRESHOLD]

Logging

A log file is created with the same name as the input file but with a '.log' extension.
For example: some_video_file.mkv.qctools.xml.gz.log

Log files contain every instance of values over the specified threshold. For example:
2024-10-03 17:02:35,737 SATMAX is over 181.02 with a value of 698.0 at duration 00:00:16.4500


Legacy Commands:

Not in active development. Please file an issue if you are interested in using these.

makeqctoolsreport

A Python port of Morgan’s makeqctoolsreport.as, this script generates QCTools .xml.gz reports from input video files.

Example Usage:

makeqctoolsreport /path/to/input.mxf

overcatch

A script from the original qct-parse development for running a report against multiple profiles.

Example Usage:

overcatch /path/to/input.mxf

Dependencies

Ensure Python 3.x.x is installed.

Requires FFmpeg.

This tool uses the lxml python module which is automatically installed with the qct-parse package.

For more information on lxml usage, check out the lxml documentation.


Contributors

Maintainer

About

scripts for automating QCTools actions

Resources

Stars

12 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - amiaopensource/qct-parse: scripts for automating QCTools actions · GitHub
Skip to content

Repository files navigation

QCTools Automation Scripts

This repository contains scripts for automating analysis of QCTools reports.

Overview

Install from source:

  • Create a new Python Virtual Environment for qct_parse
    • Unix based (Mac or Linux):
      python3 -m venv name_of_env
    • Windows:
      py -m venv name_of_env (where 'name_of_env' is replaced with the name of your virtual environment)
  • Activate virtual env
    • Unix based (Mac or Linux):
      source ./name_of_env/bin/activate
    • Windows:
      name_of_env\scripts\activate
  • Install Package
    • Navigate to the repo root directory path/to/qct-parse/
    • Run the command:
      python -m pip install .

Test Code

If you intend to develop the code for your proposes or contribute to the open source project, a test directory is provided in the repo.

  • Activate virtual env (see Install from source)
  • Install pytest pip install pytest
  • Run tests python -m pytest

Building the documentation

  • Activate virtual env (see Install from source)
  • Install sphinx and myst-parser pip install sphinx myst-parser
  • Run sphinx-build command sphinx-build ./docs ./dist/docs

Commands:

  • qct-parse -i/--input [path to QCTools report] [optional arguments]
    Finds frames that exceed thresholds for QCTool tag(s). Full list of command line arguments below.

qct-parse

Run a single tag against a supplied value or multiple tags using a profile.

Arguments

ArgumentDescription
-h, --helpShow this help message and exit
-i, --inputPath to the input qctools.xml.gz or qctools.mkv file
-t, --tagnameThe tag name you want to test (e.g., SATMAX); see table of tag names below for list
-o, --overThreshold overage number
-u, --underThreshold under number
-p, --profileCompare frame data against tag values from config.txt. Use -p default for QCTools default values
-buff, --buffSizeCircular buffer size. If even, defaults to the next odd number (default: 11)
-te, --thumbExportEnable/disable thumbnail export (default: off)
-ted, --thumbExportDelayMinimum frames between exported thumbnails (default: 9000)
-tep, --thumbExportPathPath to thumbnail export. Uses input base-path if omitted
-ds, --durationStartStart analysis from this time (seconds, equivalent to ffmpeg -ss)
-de, --durationEndEnd analysis after this time (seconds, equivalent to ffmpeg -t)
-bd, --barsDetectionEnable/disable bar detection (default: off)
-be, --barsEvaluationUse peak values from color bars as 'profile' if bars are detected
-pr, --printPrint over/under frame data to console (default: off)
-csv, --csvreportPrint summary results to a csv sidecar file
-q, --quietSuppress ffmpeg output in console (default: off)

Tags

Tag categoryTag names
YUV valuesYMIN,YLOW,YAVG,YHIGH,YMAX
UMIN,ULOW,UAVG,UHIGH,UMAX
VMIN,VLOW,VAVG,VHIGH,VMAX
YUV values (difference)YDIF,UDIF,VDIF
Saturation valuesSATMIN,SATLOW,SATAVG,SATHIGH,SATMAX
Hue valuesHUEMED,HUEAVG
Temporal outliersTOUT
Vertical line repetitionsVREP
Broadcast rangeBRNG
Mean square error fieldsmse_y,mse_u,mse_v,mse_avg
Peak signal to noise ratio fieldspsnr_y,psnr_u,psnr_v,psnr_avg

Examples

Run single tag tests

qct-parse -t SATMAX -o 235 -t YMIN -u 16 -i /path/to/report.mkv.qctools.xml.gz

Run bars detection using default QCTools profile

qct-parse -bd -p default -i /path/to/report.mkv.qctools.mkv

Export thumbnails of frames beyond threshold

qct-parse -p default -te -tep /path/to/export/folder -i /path/to/report.mkv.qctools.xml.gz

Use peak values from detected color bars as thresholds

qct-parse -bd -be -i /path/to/report.mkv.qctools.xml.gz

Input files

qct-parse.py will work with the following QCTools report formats:

qctools.xml.gz qctools.mkv

If the qctools.xml.gz report is in an MKV attachment, the qctools.xml.gz report file will be extracted and saved as a separate file.

Both 8-bit and 10-bit values are supported. The bit depth will be detected automatically, and does not need to be specified.

Config Files

The provided profiles are:

  • default
  • highTolerance
  • midTolerance
  • lowTolerance

Each of these profiles contain the following tags with a corresponding threshold:
YLOW, YMAX, UMIN, UMAX, VMIN, VMAX, SATMAX, TOUT, VREP

The profiles are stored in the config.txt files. Please note that there is a separate config.txt for 8-bit and 10-bit values.

The process for providing user supplied profiles is in development.
Currently, if you wish to create your own profile, you will need to create your own config directory and config.txt file.
There is a environmental variable at the top of qct-parse.py which can be used to reset the config directory:

CONFIG_ENVIRONMENT_VARIABLE_NAME = 'QCT_PARSE_CONFIG_DIRECTORY'

Simply place the full path to the user created config directory in place of 'QCT_PARSE_CONFIG_DIRECTORY'

Thumbnails

Thumbnails of failed frames will be exported if the -te flag is invoked.

In order to export thumbnails, the QCTools report must be in the same directory as the video file it is describing, and must have the same file name as the report (excluding the qctools.xml.gz).

If you would like to provide a path for exporting thumbnails, you can do so using the -tep flag.
Otherwise, thumbnails will automatically be created in the same directory as the video file and QCTools report, in a new directory.

When running qct-parse with a profile, the thumbnails will be placed in a directory named ThumbExports. When run against single tags the directory will be named [TAG NAME].[THRESHOLD]

Logging

A log file is created with the same name as the input file but with a '.log' extension.
For example: some_video_file.mkv.qctools.xml.gz.log

Log files contain every instance of values over the specified threshold. For example:
2024-10-03 17:02:35,737 SATMAX is over 181.02 with a value of 698.0 at duration 00:00:16.4500


Legacy Commands:

Not in active development. Please file an issue if you are interested in using these.

makeqctoolsreport

A Python port of Morgan’s makeqctoolsreport.as, this script generates QCTools .xml.gz reports from input video files.

Example Usage:

makeqctoolsreport /path/to/input.mxf

overcatch

A script from the original qct-parse development for running a report against multiple profiles.

Example Usage:

overcatch /path/to/input.mxf

Dependencies

Ensure Python 3.x.x is installed.

Requires FFmpeg.

This tool uses the lxml python module which is automatically installed with the qct-parse package.

For more information on lxml usage, check out the lxml documentation.


Contributors

Maintainer

About

scripts for automating QCTools actions

Resources

Stars

12 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - amiaopensource/qct-parse: scripts for automating QCTools actions · GitHub
Skip to content

Repository files navigation

QCTools Automation Scripts

This repository contains scripts for automating analysis of QCTools reports.

Overview

Install from source:

  • Create a new Python Virtual Environment for qct_parse
    • Unix based (Mac or Linux):
      python3 -m venv name_of_env
    • Windows:
      py -m venv name_of_env (where 'name_of_env' is replaced with the name of your virtual environment)
  • Activate virtual env
    • Unix based (Mac or Linux):
      source ./name_of_env/bin/activate
    • Windows:
      name_of_env\scripts\activate
  • Install Package
    • Navigate to the repo root directory path/to/qct-parse/
    • Run the command:
      python -m pip install .

Test Code

If you intend to develop the code for your proposes or contribute to the open source project, a test directory is provided in the repo.

  • Activate virtual env (see Install from source)
  • Install pytest pip install pytest
  • Run tests python -m pytest

Building the documentation

  • Activate virtual env (see Install from source)
  • Install sphinx and myst-parser pip install sphinx myst-parser
  • Run sphinx-build command sphinx-build ./docs ./dist/docs

Commands:

  • qct-parse -i/--input [path to QCTools report] [optional arguments]
    Finds frames that exceed thresholds for QCTool tag(s). Full list of command line arguments below.

qct-parse

Run a single tag against a supplied value or multiple tags using a profile.

Arguments

ArgumentDescription
-h, --helpShow this help message and exit
-i, --inputPath to the input qctools.xml.gz or qctools.mkv file
-t, --tagnameThe tag name you want to test (e.g., SATMAX); see table of tag names below for list
-o, --overThreshold overage number
-u, --underThreshold under number
-p, --profileCompare frame data against tag values from config.txt. Use -p default for QCTools default values
-buff, --buffSizeCircular buffer size. If even, defaults to the next odd number (default: 11)
-te, --thumbExportEnable/disable thumbnail export (default: off)
-ted, --thumbExportDelayMinimum frames between exported thumbnails (default: 9000)
-tep, --thumbExportPathPath to thumbnail export. Uses input base-path if omitted
-ds, --durationStartStart analysis from this time (seconds, equivalent to ffmpeg -ss)
-de, --durationEndEnd analysis after this time (seconds, equivalent to ffmpeg -t)
-bd, --barsDetectionEnable/disable bar detection (default: off)
-be, --barsEvaluationUse peak values from color bars as 'profile' if bars are detected
-pr, --printPrint over/under frame data to console (default: off)
-csv, --csvreportPrint summary results to a csv sidecar file
-q, --quietSuppress ffmpeg output in console (default: off)

Tags

Tag categoryTag names
YUV valuesYMIN,YLOW,YAVG,YHIGH,YMAX
UMIN,ULOW,UAVG,UHIGH,UMAX
VMIN,VLOW,VAVG,VHIGH,VMAX
YUV values (difference)YDIF,UDIF,VDIF
Saturation valuesSATMIN,SATLOW,SATAVG,SATHIGH,SATMAX
Hue valuesHUEMED,HUEAVG
Temporal outliersTOUT
Vertical line repetitionsVREP
Broadcast rangeBRNG
Mean square error fieldsmse_y,mse_u,mse_v,mse_avg
Peak signal to noise ratio fieldspsnr_y,psnr_u,psnr_v,psnr_avg

Examples

Run single tag tests

qct-parse -t SATMAX -o 235 -t YMIN -u 16 -i /path/to/report.mkv.qctools.xml.gz

Run bars detection using default QCTools profile

qct-parse -bd -p default -i /path/to/report.mkv.qctools.mkv

Export thumbnails of frames beyond threshold

qct-parse -p default -te -tep /path/to/export/folder -i /path/to/report.mkv.qctools.xml.gz

Use peak values from detected color bars as thresholds

qct-parse -bd -be -i /path/to/report.mkv.qctools.xml.gz

Input files

qct-parse.py will work with the following QCTools report formats:

qctools.xml.gz qctools.mkv

If the qctools.xml.gz report is in an MKV attachment, the qctools.xml.gz report file will be extracted and saved as a separate file.

Both 8-bit and 10-bit values are supported. The bit depth will be detected automatically, and does not need to be specified.

Config Files

The provided profiles are:

  • default
  • highTolerance
  • midTolerance
  • lowTolerance

Each of these profiles contain the following tags with a corresponding threshold:
YLOW, YMAX, UMIN, UMAX, VMIN, VMAX, SATMAX, TOUT, VREP

The profiles are stored in the config.txt files. Please note that there is a separate config.txt for 8-bit and 10-bit values.

The process for providing user supplied profiles is in development.
Currently, if you wish to create your own profile, you will need to create your own config directory and config.txt file.
There is a environmental variable at the top of qct-parse.py which can be used to reset the config directory:

CONFIG_ENVIRONMENT_VARIABLE_NAME = 'QCT_PARSE_CONFIG_DIRECTORY'

Simply place the full path to the user created config directory in place of 'QCT_PARSE_CONFIG_DIRECTORY'

Thumbnails

Thumbnails of failed frames will be exported if the -te flag is invoked.

In order to export thumbnails, the QCTools report must be in the same directory as the video file it is describing, and must have the same file name as the report (excluding the qctools.xml.gz).

If you would like to provide a path for exporting thumbnails, you can do so using the -tep flag.
Otherwise, thumbnails will automatically be created in the same directory as the video file and QCTools report, in a new directory.

When running qct-parse with a profile, the thumbnails will be placed in a directory named ThumbExports. When run against single tags the directory will be named [TAG NAME].[THRESHOLD]

Logging

A log file is created with the same name as the input file but with a '.log' extension.
For example: some_video_file.mkv.qctools.xml.gz.log

Log files contain every instance of values over the specified threshold. For example:
2024-10-03 17:02:35,737 SATMAX is over 181.02 with a value of 698.0 at duration 00:00:16.4500


Legacy Commands:

Not in active development. Please file an issue if you are interested in using these.

makeqctoolsreport

A Python port of Morgan’s makeqctoolsreport.as, this script generates QCTools .xml.gz reports from input video files.

Example Usage:

makeqctoolsreport /path/to/input.mxf

overcatch

A script from the original qct-parse development for running a report against multiple profiles.

Example Usage:

overcatch /path/to/input.mxf

Dependencies

Ensure Python 3.x.x is installed.

Requires FFmpeg.

This tool uses the lxml python module which is automatically installed with the qct-parse package.

For more information on lxml usage, check out the lxml documentation.


Contributors

Maintainer

About

scripts for automating QCTools actions

Resources

Stars

12 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - amiaopensource/qct-parse: scripts for automating QCTools actions · GitHub
Skip to content

Repository files navigation

QCTools Automation Scripts

This repository contains scripts for automating analysis of QCTools reports.

Overview

Install from source:

  • Create a new Python Virtual Environment for qct_parse
    • Unix based (Mac or Linux):
      python3 -m venv name_of_env
    • Windows:
      py -m venv name_of_env (where 'name_of_env' is replaced with the name of your virtual environment)
  • Activate virtual env
    • Unix based (Mac or Linux):
      source ./name_of_env/bin/activate
    • Windows:
      name_of_env\scripts\activate
  • Install Package
    • Navigate to the repo root directory path/to/qct-parse/
    • Run the command:
      python -m pip install .

Test Code

If you intend to develop the code for your proposes or contribute to the open source project, a test directory is provided in the repo.

  • Activate virtual env (see Install from source)
  • Install pytest pip install pytest
  • Run tests python -m pytest

Building the documentation

  • Activate virtual env (see Install from source)
  • Install sphinx and myst-parser pip install sphinx myst-parser
  • Run sphinx-build command sphinx-build ./docs ./dist/docs

Commands:

  • qct-parse -i/--input [path to QCTools report] [optional arguments]
    Finds frames that exceed thresholds for QCTool tag(s). Full list of command line arguments below.

qct-parse

Run a single tag against a supplied value or multiple tags using a profile.

Arguments

ArgumentDescription
-h, --helpShow this help message and exit
-i, --inputPath to the input qctools.xml.gz or qctools.mkv file
-t, --tagnameThe tag name you want to test (e.g., SATMAX); see table of tag names below for list
-o, --overThreshold overage number
-u, --underThreshold under number
-p, --profileCompare frame data against tag values from config.txt. Use -p default for QCTools default values
-buff, --buffSizeCircular buffer size. If even, defaults to the next odd number (default: 11)
-te, --thumbExportEnable/disable thumbnail export (default: off)
-ted, --thumbExportDelayMinimum frames between exported thumbnails (default: 9000)
-tep, --thumbExportPathPath to thumbnail export. Uses input base-path if omitted
-ds, --durationStartStart analysis from this time (seconds, equivalent to ffmpeg -ss)
-de, --durationEndEnd analysis after this time (seconds, equivalent to ffmpeg -t)
-bd, --barsDetectionEnable/disable bar detection (default: off)
-be, --barsEvaluationUse peak values from color bars as 'profile' if bars are detected
-pr, --printPrint over/under frame data to console (default: off)
-csv, --csvreportPrint summary results to a csv sidecar file
-q, --quietSuppress ffmpeg output in console (default: off)

Tags

Tag categoryTag names
YUV valuesYMIN,YLOW,YAVG,YHIGH,YMAX
UMIN,ULOW,UAVG,UHIGH,UMAX
VMIN,VLOW,VAVG,VHIGH,VMAX
YUV values (difference)YDIF,UDIF,VDIF
Saturation valuesSATMIN,SATLOW,SATAVG,SATHIGH,SATMAX
Hue valuesHUEMED,HUEAVG
Temporal outliersTOUT
Vertical line repetitionsVREP
Broadcast rangeBRNG
Mean square error fieldsmse_y,mse_u,mse_v,mse_avg
Peak signal to noise ratio fieldspsnr_y,psnr_u,psnr_v,psnr_avg

Examples

Run single tag tests

qct-parse -t SATMAX -o 235 -t YMIN -u 16 -i /path/to/report.mkv.qctools.xml.gz

Run bars detection using default QCTools profile

qct-parse -bd -p default -i /path/to/report.mkv.qctools.mkv

Export thumbnails of frames beyond threshold

qct-parse -p default -te -tep /path/to/export/folder -i /path/to/report.mkv.qctools.xml.gz

Use peak values from detected color bars as thresholds

qct-parse -bd -be -i /path/to/report.mkv.qctools.xml.gz

Input files

qct-parse.py will work with the following QCTools report formats:

qctools.xml.gz qctools.mkv

If the qctools.xml.gz report is in an MKV attachment, the qctools.xml.gz report file will be extracted and saved as a separate file.

Both 8-bit and 10-bit values are supported. The bit depth will be detected automatically, and does not need to be specified.

Config Files

The provided profiles are:

  • default
  • highTolerance
  • midTolerance
  • lowTolerance

Each of these profiles contain the following tags with a corresponding threshold:
YLOW, YMAX, UMIN, UMAX, VMIN, VMAX, SATMAX, TOUT, VREP

The profiles are stored in the config.txt files. Please note that there is a separate config.txt for 8-bit and 10-bit values.

The process for providing user supplied profiles is in development.
Currently, if you wish to create your own profile, you will need to create your own config directory and config.txt file.
There is a environmental variable at the top of qct-parse.py which can be used to reset the config directory:

CONFIG_ENVIRONMENT_VARIABLE_NAME = 'QCT_PARSE_CONFIG_DIRECTORY'

Simply place the full path to the user created config directory in place of 'QCT_PARSE_CONFIG_DIRECTORY'

Thumbnails

Thumbnails of failed frames will be exported if the -te flag is invoked.

In order to export thumbnails, the QCTools report must be in the same directory as the video file it is describing, and must have the same file name as the report (excluding the qctools.xml.gz).

If you would like to provide a path for exporting thumbnails, you can do so using the -tep flag.
Otherwise, thumbnails will automatically be created in the same directory as the video file and QCTools report, in a new directory.

When running qct-parse with a profile, the thumbnails will be placed in a directory named ThumbExports. When run against single tags the directory will be named [TAG NAME].[THRESHOLD]

Logging

A log file is created with the same name as the input file but with a '.log' extension.
For example: some_video_file.mkv.qctools.xml.gz.log

Log files contain every instance of values over the specified threshold. For example:
2024-10-03 17:02:35,737 SATMAX is over 181.02 with a value of 698.0 at duration 00:00:16.4500


Legacy Commands:

Not in active development. Please file an issue if you are interested in using these.

makeqctoolsreport

A Python port of Morgan’s makeqctoolsreport.as, this script generates QCTools .xml.gz reports from input video files.

Example Usage:

makeqctoolsreport /path/to/input.mxf

overcatch

A script from the original qct-parse development for running a report against multiple profiles.

Example Usage:

overcatch /path/to/input.mxf

Dependencies

Ensure Python 3.x.x is installed.

Requires FFmpeg.

This tool uses the lxml python module which is automatically installed with the qct-parse package.

For more information on lxml usage, check out the lxml documentation.


Contributors

Maintainer

About

scripts for automating QCTools actions

Resources

Stars

12 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - amiaopensource/qct-parse: scripts for automating QCTools actions · GitHub
Skip to content

Repository files navigation

QCTools Automation Scripts

This repository contains scripts for automating analysis of QCTools reports.

Overview

Install from source:

  • Create a new Python Virtual Environment for qct_parse
    • Unix based (Mac or Linux):
      python3 -m venv name_of_env
    • Windows:
      py -m venv name_of_env (where 'name_of_env' is replaced with the name of your virtual environment)
  • Activate virtual env
    • Unix based (Mac or Linux):
      source ./name_of_env/bin/activate
    • Windows:
      name_of_env\scripts\activate
  • Install Package
    • Navigate to the repo root directory path/to/qct-parse/
    • Run the command:
      python -m pip install .

Test Code

If you intend to develop the code for your proposes or contribute to the open source project, a test directory is provided in the repo.

  • Activate virtual env (see Install from source)
  • Install pytest pip install pytest
  • Run tests python -m pytest

Building the documentation

  • Activate virtual env (see Install from source)
  • Install sphinx and myst-parser pip install sphinx myst-parser
  • Run sphinx-build command sphinx-build ./docs ./dist/docs

Commands:

  • qct-parse -i/--input [path to QCTools report] [optional arguments]
    Finds frames that exceed thresholds for QCTool tag(s). Full list of command line arguments below.

qct-parse

Run a single tag against a supplied value or multiple tags using a profile.

Arguments

ArgumentDescription
-h, --helpShow this help message and exit
-i, --inputPath to the input qctools.xml.gz or qctools.mkv file
-t, --tagnameThe tag name you want to test (e.g., SATMAX); see table of tag names below for list
-o, --overThreshold overage number
-u, --underThreshold under number
-p, --profileCompare frame data against tag values from config.txt. Use -p default for QCTools default values
-buff, --buffSizeCircular buffer size. If even, defaults to the next odd number (default: 11)
-te, --thumbExportEnable/disable thumbnail export (default: off)
-ted, --thumbExportDelayMinimum frames between exported thumbnails (default: 9000)
-tep, --thumbExportPathPath to thumbnail export. Uses input base-path if omitted
-ds, --durationStartStart analysis from this time (seconds, equivalent to ffmpeg -ss)
-de, --durationEndEnd analysis after this time (seconds, equivalent to ffmpeg -t)
-bd, --barsDetectionEnable/disable bar detection (default: off)
-be, --barsEvaluationUse peak values from color bars as 'profile' if bars are detected
-pr, --printPrint over/under frame data to console (default: off)
-csv, --csvreportPrint summary results to a csv sidecar file
-q, --quietSuppress ffmpeg output in console (default: off)

Tags

Tag categoryTag names
YUV valuesYMIN,YLOW,YAVG,YHIGH,YMAX
UMIN,ULOW,UAVG,UHIGH,UMAX
VMIN,VLOW,VAVG,VHIGH,VMAX
YUV values (difference)YDIF,UDIF,VDIF
Saturation valuesSATMIN,SATLOW,SATAVG,SATHIGH,SATMAX
Hue valuesHUEMED,HUEAVG
Temporal outliersTOUT
Vertical line repetitionsVREP
Broadcast rangeBRNG
Mean square error fieldsmse_y,mse_u,mse_v,mse_avg
Peak signal to noise ratio fieldspsnr_y,psnr_u,psnr_v,psnr_avg

Examples

Run single tag tests

qct-parse -t SATMAX -o 235 -t YMIN -u 16 -i /path/to/report.mkv.qctools.xml.gz

Run bars detection using default QCTools profile

qct-parse -bd -p default -i /path/to/report.mkv.qctools.mkv

Export thumbnails of frames beyond threshold

qct-parse -p default -te -tep /path/to/export/folder -i /path/to/report.mkv.qctools.xml.gz

Use peak values from detected color bars as thresholds

qct-parse -bd -be -i /path/to/report.mkv.qctools.xml.gz

Input files

qct-parse.py will work with the following QCTools report formats:

qctools.xml.gz qctools.mkv

If the qctools.xml.gz report is in an MKV attachment, the qctools.xml.gz report file will be extracted and saved as a separate file.

Both 8-bit and 10-bit values are supported. The bit depth will be detected automatically, and does not need to be specified.

Config Files

The provided profiles are:

  • default
  • highTolerance
  • midTolerance
  • lowTolerance

Each of these profiles contain the following tags with a corresponding threshold:
YLOW, YMAX, UMIN, UMAX, VMIN, VMAX, SATMAX, TOUT, VREP

The profiles are stored in the config.txt files. Please note that there is a separate config.txt for 8-bit and 10-bit values.

The process for providing user supplied profiles is in development.
Currently, if you wish to create your own profile, you will need to create your own config directory and config.txt file.
There is a environmental variable at the top of qct-parse.py which can be used to reset the config directory:

CONFIG_ENVIRONMENT_VARIABLE_NAME = 'QCT_PARSE_CONFIG_DIRECTORY'

Simply place the full path to the user created config directory in place of 'QCT_PARSE_CONFIG_DIRECTORY'

Thumbnails

Thumbnails of failed frames will be exported if the -te flag is invoked.

In order to export thumbnails, the QCTools report must be in the same directory as the video file it is describing, and must have the same file name as the report (excluding the qctools.xml.gz).

If you would like to provide a path for exporting thumbnails, you can do so using the -tep flag.
Otherwise, thumbnails will automatically be created in the same directory as the video file and QCTools report, in a new directory.

When running qct-parse with a profile, the thumbnails will be placed in a directory named ThumbExports. When run against single tags the directory will be named [TAG NAME].[THRESHOLD]

Logging

A log file is created with the same name as the input file but with a '.log' extension.
For example: some_video_file.mkv.qctools.xml.gz.log

Log files contain every instance of values over the specified threshold. For example:
2024-10-03 17:02:35,737 SATMAX is over 181.02 with a value of 698.0 at duration 00:00:16.4500


Legacy Commands:

Not in active development. Please file an issue if you are interested in using these.

makeqctoolsreport

A Python port of Morgan’s makeqctoolsreport.as, this script generates QCTools .xml.gz reports from input video files.

Example Usage:

makeqctoolsreport /path/to/input.mxf

overcatch

A script from the original qct-parse development for running a report against multiple profiles.

Example Usage:

overcatch /path/to/input.mxf

Dependencies

Ensure Python 3.x.x is installed.

Requires FFmpeg.

This tool uses the lxml python module which is automatically installed with the qct-parse package.

For more information on lxml usage, check out the lxml documentation.


Contributors

Maintainer

About

scripts for automating QCTools actions

Resources

Stars

12 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - amiaopensource/qct-parse: scripts for automating QCTools actions · GitHub
Skip to content

Repository files navigation

QCTools Automation Scripts

This repository contains scripts for automating analysis of QCTools reports.

Overview

Install from source:

  • Create a new Python Virtual Environment for qct_parse
    • Unix based (Mac or Linux):
      python3 -m venv name_of_env
    • Windows:
      py -m venv name_of_env (where 'name_of_env' is replaced with the name of your virtual environment)
  • Activate virtual env
    • Unix based (Mac or Linux):
      source ./name_of_env/bin/activate
    • Windows:
      name_of_env\scripts\activate
  • Install Package
    • Navigate to the repo root directory path/to/qct-parse/
    • Run the command:
      python -m pip install .

Test Code

If you intend to develop the code for your proposes or contribute to the open source project, a test directory is provided in the repo.

  • Activate virtual env (see Install from source)
  • Install pytest pip install pytest
  • Run tests python -m pytest

Building the documentation

  • Activate virtual env (see Install from source)
  • Install sphinx and myst-parser pip install sphinx myst-parser
  • Run sphinx-build command sphinx-build ./docs ./dist/docs

Commands:

  • qct-parse -i/--input [path to QCTools report] [optional arguments]
    Finds frames that exceed thresholds for QCTool tag(s). Full list of command line arguments below.

qct-parse

Run a single tag against a supplied value or multiple tags using a profile.

Arguments

ArgumentDescription
-h, --helpShow this help message and exit
-i, --inputPath to the input qctools.xml.gz or qctools.mkv file
-t, --tagnameThe tag name you want to test (e.g., SATMAX); see table of tag names below for list
-o, --overThreshold overage number
-u, --underThreshold under number
-p, --profileCompare frame data against tag values from config.txt. Use -p default for QCTools default values
-buff, --buffSizeCircular buffer size. If even, defaults to the next odd number (default: 11)
-te, --thumbExportEnable/disable thumbnail export (default: off)
-ted, --thumbExportDelayMinimum frames between exported thumbnails (default: 9000)
-tep, --thumbExportPathPath to thumbnail export. Uses input base-path if omitted
-ds, --durationStartStart analysis from this time (seconds, equivalent to ffmpeg -ss)
-de, --durationEndEnd analysis after this time (seconds, equivalent to ffmpeg -t)
-bd, --barsDetectionEnable/disable bar detection (default: off)
-be, --barsEvaluationUse peak values from color bars as 'profile' if bars are detected
-pr, --printPrint over/under frame data to console (default: off)
-csv, --csvreportPrint summary results to a csv sidecar file
-q, --quietSuppress ffmpeg output in console (default: off)

Tags

Tag categoryTag names
YUV valuesYMIN,YLOW,YAVG,YHIGH,YMAX
UMIN,ULOW,UAVG,UHIGH,UMAX
VMIN,VLOW,VAVG,VHIGH,VMAX
YUV values (difference)YDIF,UDIF,VDIF
Saturation valuesSATMIN,SATLOW,SATAVG,SATHIGH,SATMAX
Hue valuesHUEMED,HUEAVG
Temporal outliersTOUT
Vertical line repetitionsVREP
Broadcast rangeBRNG
Mean square error fieldsmse_y,mse_u,mse_v,mse_avg
Peak signal to noise ratio fieldspsnr_y,psnr_u,psnr_v,psnr_avg

Examples

Run single tag tests

qct-parse -t SATMAX -o 235 -t YMIN -u 16 -i /path/to/report.mkv.qctools.xml.gz

Run bars detection using default QCTools profile

qct-parse -bd -p default -i /path/to/report.mkv.qctools.mkv

Export thumbnails of frames beyond threshold

qct-parse -p default -te -tep /path/to/export/folder -i /path/to/report.mkv.qctools.xml.gz

Use peak values from detected color bars as thresholds

qct-parse -bd -be -i /path/to/report.mkv.qctools.xml.gz

Input files

qct-parse.py will work with the following QCTools report formats:

qctools.xml.gz qctools.mkv

If the qctools.xml.gz report is in an MKV attachment, the qctools.xml.gz report file will be extracted and saved as a separate file.

Both 8-bit and 10-bit values are supported. The bit depth will be detected automatically, and does not need to be specified.

Config Files

The provided profiles are:

  • default
  • highTolerance
  • midTolerance
  • lowTolerance

Each of these profiles contain the following tags with a corresponding threshold:
YLOW, YMAX, UMIN, UMAX, VMIN, VMAX, SATMAX, TOUT, VREP

The profiles are stored in the config.txt files. Please note that there is a separate config.txt for 8-bit and 10-bit values.

The process for providing user supplied profiles is in development.
Currently, if you wish to create your own profile, you will need to create your own config directory and config.txt file.
There is a environmental variable at the top of qct-parse.py which can be used to reset the config directory:

CONFIG_ENVIRONMENT_VARIABLE_NAME = 'QCT_PARSE_CONFIG_DIRECTORY'

Simply place the full path to the user created config directory in place of 'QCT_PARSE_CONFIG_DIRECTORY'

Thumbnails

Thumbnails of failed frames will be exported if the -te flag is invoked.

In order to export thumbnails, the QCTools report must be in the same directory as the video file it is describing, and must have the same file name as the report (excluding the qctools.xml.gz).

If you would like to provide a path for exporting thumbnails, you can do so using the -tep flag.
Otherwise, thumbnails will automatically be created in the same directory as the video file and QCTools report, in a new directory.

When running qct-parse with a profile, the thumbnails will be placed in a directory named ThumbExports. When run against single tags the directory will be named [TAG NAME].[THRESHOLD]

Logging

A log file is created with the same name as the input file but with a '.log' extension.
For example: some_video_file.mkv.qctools.xml.gz.log

Log files contain every instance of values over the specified threshold. For example:
2024-10-03 17:02:35,737 SATMAX is over 181.02 with a value of 698.0 at duration 00:00:16.4500


Legacy Commands:

Not in active development. Please file an issue if you are interested in using these.

makeqctoolsreport

A Python port of Morgan’s makeqctoolsreport.as, this script generates QCTools .xml.gz reports from input video files.

Example Usage:

makeqctoolsreport /path/to/input.mxf

overcatch

A script from the original qct-parse development for running a report against multiple profiles.

Example Usage:

overcatch /path/to/input.mxf

Dependencies

Ensure Python 3.x.x is installed.

Requires FFmpeg.

This tool uses the lxml python module which is automatically installed with the qct-parse package.

For more information on lxml usage, check out the lxml documentation.


Contributors

Maintainer

About

scripts for automating QCTools actions

Resources

Stars

12 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - amiaopensource/qct-parse: scripts for automating QCTools actions · GitHub
Skip to content

Repository files navigation

QCTools Automation Scripts

This repository contains scripts for automating analysis of QCTools reports.

Overview

Install from source:

  • Create a new Python Virtual Environment for qct_parse
    • Unix based (Mac or Linux):
      python3 -m venv name_of_env
    • Windows:
      py -m venv name_of_env (where 'name_of_env' is replaced with the name of your virtual environment)
  • Activate virtual env
    • Unix based (Mac or Linux):
      source ./name_of_env/bin/activate
    • Windows:
      name_of_env\scripts\activate
  • Install Package
    • Navigate to the repo root directory path/to/qct-parse/
    • Run the command:
      python -m pip install .

Test Code

If you intend to develop the code for your proposes or contribute to the open source project, a test directory is provided in the repo.

  • Activate virtual env (see Install from source)
  • Install pytest pip install pytest
  • Run tests python -m pytest

Building the documentation

  • Activate virtual env (see Install from source)
  • Install sphinx and myst-parser pip install sphinx myst-parser
  • Run sphinx-build command sphinx-build ./docs ./dist/docs

Commands:

  • qct-parse -i/--input [path to QCTools report] [optional arguments]
    Finds frames that exceed thresholds for QCTool tag(s). Full list of command line arguments below.

qct-parse

Run a single tag against a supplied value or multiple tags using a profile.

Arguments

ArgumentDescription
-h, --helpShow this help message and exit
-i, --inputPath to the input qctools.xml.gz or qctools.mkv file
-t, --tagnameThe tag name you want to test (e.g., SATMAX); see table of tag names below for list
-o, --overThreshold overage number
-u, --underThreshold under number
-p, --profileCompare frame data against tag values from config.txt. Use -p default for QCTools default values
-buff, --buffSizeCircular buffer size. If even, defaults to the next odd number (default: 11)
-te, --thumbExportEnable/disable thumbnail export (default: off)
-ted, --thumbExportDelayMinimum frames between exported thumbnails (default: 9000)
-tep, --thumbExportPathPath to thumbnail export. Uses input base-path if omitted
-ds, --durationStartStart analysis from this time (seconds, equivalent to ffmpeg -ss)
-de, --durationEndEnd analysis after this time (seconds, equivalent to ffmpeg -t)
-bd, --barsDetectionEnable/disable bar detection (default: off)
-be, --barsEvaluationUse peak values from color bars as 'profile' if bars are detected
-pr, --printPrint over/under frame data to console (default: off)
-csv, --csvreportPrint summary results to a csv sidecar file
-q, --quietSuppress ffmpeg output in console (default: off)

Tags

Tag categoryTag names
YUV valuesYMIN,YLOW,YAVG,YHIGH,YMAX
UMIN,ULOW,UAVG,UHIGH,UMAX
VMIN,VLOW,VAVG,VHIGH,VMAX
YUV values (difference)YDIF,UDIF,VDIF
Saturation valuesSATMIN,SATLOW,SATAVG,SATHIGH,SATMAX
Hue valuesHUEMED,HUEAVG
Temporal outliersTOUT
Vertical line repetitionsVREP
Broadcast rangeBRNG
Mean square error fieldsmse_y,mse_u,mse_v,mse_avg
Peak signal to noise ratio fieldspsnr_y,psnr_u,psnr_v,psnr_avg

Examples

Run single tag tests

qct-parse -t SATMAX -o 235 -t YMIN -u 16 -i /path/to/report.mkv.qctools.xml.gz

Run bars detection using default QCTools profile

qct-parse -bd -p default -i /path/to/report.mkv.qctools.mkv

Export thumbnails of frames beyond threshold

qct-parse -p default -te -tep /path/to/export/folder -i /path/to/report.mkv.qctools.xml.gz

Use peak values from detected color bars as thresholds

qct-parse -bd -be -i /path/to/report.mkv.qctools.xml.gz

Input files

qct-parse.py will work with the following QCTools report formats:

qctools.xml.gz qctools.mkv

If the qctools.xml.gz report is in an MKV attachment, the qctools.xml.gz report file will be extracted and saved as a separate file.

Both 8-bit and 10-bit values are supported. The bit depth will be detected automatically, and does not need to be specified.

Config Files

The provided profiles are:

  • default
  • highTolerance
  • midTolerance
  • lowTolerance

Each of these profiles contain the following tags with a corresponding threshold:
YLOW, YMAX, UMIN, UMAX, VMIN, VMAX, SATMAX, TOUT, VREP

The profiles are stored in the config.txt files. Please note that there is a separate config.txt for 8-bit and 10-bit values.

The process for providing user supplied profiles is in development.
Currently, if you wish to create your own profile, you will need to create your own config directory and config.txt file.
There is a environmental variable at the top of qct-parse.py which can be used to reset the config directory:

CONFIG_ENVIRONMENT_VARIABLE_NAME = 'QCT_PARSE_CONFIG_DIRECTORY'

Simply place the full path to the user created config directory in place of 'QCT_PARSE_CONFIG_DIRECTORY'

Thumbnails

Thumbnails of failed frames will be exported if the -te flag is invoked.

In order to export thumbnails, the QCTools report must be in the same directory as the video file it is describing, and must have the same file name as the report (excluding the qctools.xml.gz).

If you would like to provide a path for exporting thumbnails, you can do so using the -tep flag.
Otherwise, thumbnails will automatically be created in the same directory as the video file and QCTools report, in a new directory.

When running qct-parse with a profile, the thumbnails will be placed in a directory named ThumbExports. When run against single tags the directory will be named [TAG NAME].[THRESHOLD]

Logging

A log file is created with the same name as the input file but with a '.log' extension.
For example: some_video_file.mkv.qctools.xml.gz.log

Log files contain every instance of values over the specified threshold. For example:
2024-10-03 17:02:35,737 SATMAX is over 181.02 with a value of 698.0 at duration 00:00:16.4500


Legacy Commands:

Not in active development. Please file an issue if you are interested in using these.

makeqctoolsreport

A Python port of Morgan’s makeqctoolsreport.as, this script generates QCTools .xml.gz reports from input video files.

Example Usage:

makeqctoolsreport /path/to/input.mxf

overcatch

A script from the original qct-parse development for running a report against multiple profiles.

Example Usage:

overcatch /path/to/input.mxf

Dependencies

Ensure Python 3.x.x is installed.

Requires FFmpeg.

This tool uses the lxml python module which is automatically installed with the qct-parse package.

For more information on lxml usage, check out the lxml documentation.


Contributors

Maintainer

About

scripts for automating QCTools actions

Resources

Stars

12 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - amiaopensource/qct-parse: scripts for automating QCTools actions · GitHub
Skip to content

Repository files navigation

QCTools Automation Scripts

This repository contains scripts for automating analysis of QCTools reports.

Overview

Install from source:

  • Create a new Python Virtual Environment for qct_parse
    • Unix based (Mac or Linux):
      python3 -m venv name_of_env
    • Windows:
      py -m venv name_of_env (where 'name_of_env' is replaced with the name of your virtual environment)
  • Activate virtual env
    • Unix based (Mac or Linux):
      source ./name_of_env/bin/activate
    • Windows:
      name_of_env\scripts\activate
  • Install Package
    • Navigate to the repo root directory path/to/qct-parse/
    • Run the command:
      python -m pip install .

Test Code

If you intend to develop the code for your proposes or contribute to the open source project, a test directory is provided in the repo.

  • Activate virtual env (see Install from source)
  • Install pytest pip install pytest
  • Run tests python -m pytest

Building the documentation

  • Activate virtual env (see Install from source)
  • Install sphinx and myst-parser pip install sphinx myst-parser
  • Run sphinx-build command sphinx-build ./docs ./dist/docs

Commands:

  • qct-parse -i/--input [path to QCTools report] [optional arguments]
    Finds frames that exceed thresholds for QCTool tag(s). Full list of command line arguments below.

qct-parse

Run a single tag against a supplied value or multiple tags using a profile.

Arguments

ArgumentDescription
-h, --helpShow this help message and exit
-i, --inputPath to the input qctools.xml.gz or qctools.mkv file
-t, --tagnameThe tag name you want to test (e.g., SATMAX); see table of tag names below for list
-o, --overThreshold overage number
-u, --underThreshold under number
-p, --profileCompare frame data against tag values from config.txt. Use -p default for QCTools default values
-buff, --buffSizeCircular buffer size. If even, defaults to the next odd number (default: 11)
-te, --thumbExportEnable/disable thumbnail export (default: off)
-ted, --thumbExportDelayMinimum frames between exported thumbnails (default: 9000)
-tep, --thumbExportPathPath to thumbnail export. Uses input base-path if omitted
-ds, --durationStartStart analysis from this time (seconds, equivalent to ffmpeg -ss)
-de, --durationEndEnd analysis after this time (seconds, equivalent to ffmpeg -t)
-bd, --barsDetectionEnable/disable bar detection (default: off)
-be, --barsEvaluationUse peak values from color bars as 'profile' if bars are detected
-pr, --printPrint over/under frame data to console (default: off)
-csv, --csvreportPrint summary results to a csv sidecar file
-q, --quietSuppress ffmpeg output in console (default: off)

Tags

Tag categoryTag names
YUV valuesYMIN,YLOW,YAVG,YHIGH,YMAX
UMIN,ULOW,UAVG,UHIGH,UMAX
VMIN,VLOW,VAVG,VHIGH,VMAX
YUV values (difference)YDIF,UDIF,VDIF
Saturation valuesSATMIN,SATLOW,SATAVG,SATHIGH,SATMAX
Hue valuesHUEMED,HUEAVG
Temporal outliersTOUT
Vertical line repetitionsVREP
Broadcast rangeBRNG
Mean square error fieldsmse_y,mse_u,mse_v,mse_avg
Peak signal to noise ratio fieldspsnr_y,psnr_u,psnr_v,psnr_avg

Examples

Run single tag tests

qct-parse -t SATMAX -o 235 -t YMIN -u 16 -i /path/to/report.mkv.qctools.xml.gz

Run bars detection using default QCTools profile

qct-parse -bd -p default -i /path/to/report.mkv.qctools.mkv

Export thumbnails of frames beyond threshold

qct-parse -p default -te -tep /path/to/export/folder -i /path/to/report.mkv.qctools.xml.gz

Use peak values from detected color bars as thresholds

qct-parse -bd -be -i /path/to/report.mkv.qctools.xml.gz

Input files

qct-parse.py will work with the following QCTools report formats:

qctools.xml.gz qctools.mkv

If the qctools.xml.gz report is in an MKV attachment, the qctools.xml.gz report file will be extracted and saved as a separate file.

Both 8-bit and 10-bit values are supported. The bit depth will be detected automatically, and does not need to be specified.

Config Files

The provided profiles are:

  • default
  • highTolerance
  • midTolerance
  • lowTolerance

Each of these profiles contain the following tags with a corresponding threshold:
YLOW, YMAX, UMIN, UMAX, VMIN, VMAX, SATMAX, TOUT, VREP

The profiles are stored in the config.txt files. Please note that there is a separate config.txt for 8-bit and 10-bit values.

The process for providing user supplied profiles is in development.
Currently, if you wish to create your own profile, you will need to create your own config directory and config.txt file.
There is a environmental variable at the top of qct-parse.py which can be used to reset the config directory:

CONFIG_ENVIRONMENT_VARIABLE_NAME = 'QCT_PARSE_CONFIG_DIRECTORY'

Simply place the full path to the user created config directory in place of 'QCT_PARSE_CONFIG_DIRECTORY'

Thumbnails

Thumbnails of failed frames will be exported if the -te flag is invoked.

In order to export thumbnails, the QCTools report must be in the same directory as the video file it is describing, and must have the same file name as the report (excluding the qctools.xml.gz).

If you would like to provide a path for exporting thumbnails, you can do so using the -tep flag.
Otherwise, thumbnails will automatically be created in the same directory as the video file and QCTools report, in a new directory.

When running qct-parse with a profile, the thumbnails will be placed in a directory named ThumbExports. When run against single tags the directory will be named [TAG NAME].[THRESHOLD]

Logging

A log file is created with the same name as the input file but with a '.log' extension.
For example: some_video_file.mkv.qctools.xml.gz.log

Log files contain every instance of values over the specified threshold. For example:
2024-10-03 17:02:35,737 SATMAX is over 181.02 with a value of 698.0 at duration 00:00:16.4500


Legacy Commands:

Not in active development. Please file an issue if you are interested in using these.

makeqctoolsreport

A Python port of Morgan’s makeqctoolsreport.as, this script generates QCTools .xml.gz reports from input video files.

Example Usage:

makeqctoolsreport /path/to/input.mxf

overcatch

A script from the original qct-parse development for running a report against multiple profiles.

Example Usage:

overcatch /path/to/input.mxf

Dependencies

Ensure Python 3.x.x is installed.

Requires FFmpeg.

This tool uses the lxml python module which is automatically installed with the qct-parse package.

For more information on lxml usage, check out the lxml documentation.


Contributors

Maintainer

About

scripts for automating QCTools actions

Resources

Stars

12 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages