"""
Author: Ismael Seidel
Affiliation: Embedded Computing Lab (ECL), Federal University of Santa Catarina (UFSC)
Description:
This module compares execution logs from multiple codec runs to verify consistency
of MD5 checksums across raw files, encoded bitstreams, and decoded outputs.
"""
import json
import sys
[docs]
def load_json(file_path: str) -> dict:
"""Load and parse a JSON file.
:param file_path: Path to the JSON file
:type file_path: str
:return: Parsed JSON content as dictionary
:rtype: dict
"""
with open(file_path, 'r') as f:
return json.load(f)
[docs]
def compare_json_files(file_paths: list, names: list) -> dict:
"""Compare execution logs from multiple codec runs.
Analyzes and compares MD5 checksums for:
- Raw light field files
- Encoded bitstreams from each codec
- Decoded outputs from each codec
:param file_paths: List of paths to execution log JSON files
:type file_paths: list
:param names: List of names/labels for each codec run
:type names: list
:return: Comparison results with matching checksum analysis
:rtype: dict
"""
files = {names[i]: file_paths[i] for i in range(len(file_paths))}
comparison_result = {"files": files, "results": {}}
json_data = {key: load_json(path) for key, path in files.items()}
first_key = next(iter(json_data))
for lightfield in json_data[first_key]["results"]:
comparison_result["results"][lightfield] = {}
# Compare raw_md5
raw_md5s = {key: json_data[key]["results"][lightfield]["raw_md5"] for key in files}
comparison_result["results"][lightfield]["raw_md5"] = raw_md5s
comparison_result["results"][lightfield]["raw_md5"]["matching_checksum"] = len(set(raw_md5s.values())) == 1
# Compare encoder md5s
comparison_result["results"][lightfield]["encoder"] = {}
for bpp in json_data[first_key]["results"][lightfield]["encoder"]:
md5s = {key: json_data[key]["results"][lightfield]["encoder"][bpp]["md5_of_encoded"] for key in files}
comparison_result["results"][lightfield]["encoder"][bpp] = {"md5_of_encoded": md5s}
comparison_result["results"][lightfield]["encoder"][bpp]["md5_of_encoded"]["matching_checksum"] = len(set(md5s.values())) == 1
# Compare decoder md5s
comparison_result["results"][lightfield]["decoder"] = {}
for bpp in json_data[first_key]["results"][lightfield]["decoder"]:
md5s = {key: json_data[key]["results"][lightfield]["decoder"][bpp]["decoded_md5"] for key in files}
comparison_result["results"][lightfield]["decoder"][bpp] = {"decoded_md5": md5s}
comparison_result["results"][lightfield]["decoder"][bpp]["decoded_md5"]["matching_checksum"] = len(set(md5s.values())) == 1
return comparison_result
if __name__ == "__main__":
if len(sys.argv) < 4 or len(sys.argv) % 2 == 0:
print("Usage: python compare_json_md5.py name1 file1.json name2 file2.json [name3 file3.json ...]")
sys.exit(1)
args = sys.argv[1:]
names = args[0::2]
file_paths = args[1::2]
result = compare_json_files(file_paths, names)
print(json.dumps(result, indent=4))