"""
Author: André Felipe da Silva Fernandes and Leonardo de Sousa Marques
Affiliation: Embedded Computing Lab (ECL), Federal University of Santa Catarina (UFSC)
Description:
This module provides a command-line interface for executing the complete
light field processing pipeline including format conversion, encoding,
quality metrics computation, and visualization.
"""
import argparse
from lfc_toolkit.src import (
compute_quality_metrics,
equivalence_check,
generate_heatmaps,
generate_rd_plots,
run_codecs,
yuv_and_pgx_from_ppm,
)
from lfc_toolkit.src.configuration.configuration_reader import ConfigurationReader
[docs]
def main() -> None:
"""Execute the complete light field processing pipeline via CLI.
Provides command-line interface for running all processing scripts:
1. Converts light fields to YUV and PGX formats
2. Encodes light fields using specified codecs
3. Performs equivalence checks
4. Computes quality metrics
5. Generates rate-distortion plots
6. Generates quality heatmaps
Supports command-line overrides for configuration paths.
:return: None
:rtype: None
"""
# Configuration
argparser = argparse.ArgumentParser(
description="LFC Toolkit CLI to run all scripts."
)
argparser.add_argument(
"--configuration",
"-c",
type=str,
help="Path to the configuration file to be used.",
)
argparser.add_argument(
"--raw-path",
"-raw",
type=str,
help="Path in which the RAW light fields will be or are stored. This path can also be set in the configuration file.",
)
argparser.add_argument(
"--ce-path",
"-ce",
type=str,
help="Path in which the experiment results, codecs and other outputs will be stored. This path can also be set in the configuration file.",
)
argparser.add_argument(
"--lightfields",
"-lfs",
nargs="+",
help="Specify which light fields to process, separating by space. This overrides the light fields specified in the configuration file.",
)
argparser.add_argument(
"--fulldocker",
"-fulldocker",
action="store_true",
help="Disable Internal Docker for building and running codecs. This overrides the setting in the configuration file.",
)
# Scripts
argparser.add_argument(
"--all",
"-a",
action="store_true",
help="Run all scripts."
)
argparser.add_argument(
"--yuv-and-pgx-from-ppm",
"-convert",
action="store_true",
help="Enable yuv_and_pgx_from_ppm.py script.",
)
argparser.add_argument(
"--run-codecs",
"-codecs",
action="store_true",
help="Enable run_codecs.py script.",
)
argparser.add_argument(
"--quality-metrics",
"-metrics",
action="store_true",
help="Enable compute_quality_metrics.py script.",
)
argparser.add_argument(
"--equivalence-check",
"-equivalence",
action="store_true",
help="Enable equivalence_check.py script.",
)
argparser.add_argument(
"--generate-rd-plots",
"-rd-plots",
action="store_true",
help="Enable generate_rd_plots.py script.",
)
argparser.add_argument(
"--generate-heatmaps",
"-heatmaps",
action="store_true",
help="Enable generate_heatmaps.py script.",
)
args = argparser.parse_args()
if not args.configuration:
argparser.error(
"You must provide a configuration file using the --configuration (or -cfg) option."
)
# Define aliases and lightfields
aliases = {}
lightfields = []
if args.raw_path:
aliases["raw-path"] = args.raw_path
if args.ce_path:
aliases["ce-path"] = args.ce_path
if args.lightfields:
lightfields = args.lightfields
# Pass aliases when creating the ConfigurationReader
configuration = ConfigurationReader(
user_configuration_filename=args.configuration,
aliases=aliases,
lightfields=lightfields
)
# Determine which scripts to run
# If no specific script is provided, default to --all
script_flags = [
args.yuv_and_pgx_from_ppm,
args.run_codecs,
args.equivalence_check,
args.quality_metrics,
args.generate_rd_plots,
args.generate_heatmaps,
]
if not any(script_flags) and not args.all:
args.all = True
# If --all is set and no specific scripts are enabled, run all
if args.all and not any(script_flags):
args.yuv_and_pgx_from_ppm = True
args.run_codecs = True
args.equivalence_check = True
args.quality_metrics = True
args.generate_rd_plots = True
args.generate_heatmaps = True
# Execute only the enabled scripts
if args.yuv_and_pgx_from_ppm:
yuv_and_pgx_from_ppm.main(configuration)
if args.run_codecs:
run_codecs.main(configuration=configuration,
fulldocker=args.fulldocker if args.fulldocker else None)
if args.equivalence_check:
equivalence_check.main(configuration)
if args.quality_metrics:
compute_quality_metrics.main(configuration)
if args.generate_rd_plots:
generate_rd_plots.main(configuration)
if args.generate_heatmaps:
generate_heatmaps.main(configuration)
print("All scripts executed successfully.")
if __name__ == "__main__":
main()