DoVi image creation bugfix

When inputing a hybrid file as the DoVi source the ffmpeg filter resulted in the command not making a file
This commit is contained in:
2026-03-12 14:12:39 +01:00 Verified
parent 7bba1479cb
commit ed33491c1f
+50 -27
View File
@@ -5,7 +5,6 @@ import json
import argparse
import inquirer
import shutil
import time
import tkinter.filedialog
import tkinter.font
@@ -37,9 +36,10 @@ def createTempDir():
logging.debug(f"Temp folder created at: {_temp}")
class image_compare():
def __init__(self, hdr, dv):
def __init__(self, hdr, dv, hybrid):
self.dv_file = dv
self.hdr_file = hdr
self.hybrid = hybrid
self.base_refrence = 1000
self.shifted_frames = 0
createTempDir()
@@ -132,25 +132,44 @@ class image_compare():
hdr_out
]
dv_cmd = ["ffmpeg",
"-hide_banner",
"-v", "error",
"-y",
"-ss", ss_dv,
"-i", self.dv_file["path"],
"-qscale:v", "1",
"-vf", vf_DV,
"-vframes", "1",
dv_out
]
logging.debug("Generating HDR image...")
try: subprocess.run(hdr_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except Exception as e: logging.error(f"Failed to generate HDR screencapture | ERROR:{e}")
logging.debug("Generating DV image...")
try: subprocess.run(dv_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except Exception as e: logging.error(f"Failed to generate DV screencapture | ERROR:{e}")
if self.hybrid:
dv_cmd = ["ffmpeg",
"-hide_banner",
"-v", "error",
"-y",
"-ss", ss_dv,
"-i", self.dv_file["path"],
"-qscale:v", "1",
"-vf", vf_HDR,
"-vframes", "1",
dv_out
]
logging.debug("Generating DV image...")
try: subprocess.run(dv_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except Exception as e: logging.error(f"Failed to generate DV screencapture | ERROR:{e}")
else:
dv_cmd = ["ffmpeg",
"-hide_banner",
"-v", "error",
"-y",
"-ss", ss_dv,
"-i", self.dv_file["path"],
"-qscale:v", "1",
"-vf", vf_DV,
"-vframes", "1",
dv_out
]
logging.debug("Generating DV image...")
try: subprocess.run(dv_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except Exception as e: logging.error(f"Failed to generate DV screencapture | ERROR:{e}")
logging.debug("Processing Images...")
HDR_img = Image.open(hdr_out)
DV_img = Image.open(dv_out)
@@ -341,7 +360,7 @@ def analyze_files(files):
return metadata_list, cColorP
def frame_seeker(hdr, dv):
def frame_seeker(hdr, dv, hybrid):
logging.warning("Dolby Vision layer probably needs to be delayed")
isManual = inquirer.prompt([inquirer.Confirm("continue", message="Do you want to input pre-calculated frame-shift", default=False)])["continue"]
if isManual:
@@ -350,7 +369,7 @@ def frame_seeker(hdr, dv):
if(is_integer(delayed_frames) == False): logging.warning("Please input a valid number")
else: delayed_frames = int(delayed_frames); break
else:
comparer = image_compare(hdr, dv)
comparer = image_compare(hdr, dv, hybrid)
delayed_frames = comparer.shifted_frames
logging.info(f"Dolby Vision layer is shifted by {delayed_frames} frames")
return delayed_frames
@@ -359,7 +378,7 @@ def match_files(data_list):
matching_files = list()
HDRs = [(media) for media in data_list if media["colorProfile"] == "HDR"]
logging.debug(HDRs)
DVs = [(media) for media in data_list if media["colorProfile"] == "DV"] + [(media) for media in data_list if media["colorProfile"] == "HDR+DV"]
DVs = [(media) for media in data_list if media["colorProfile"] == "DV" or media["colorProfile"] == "HDR+DV"]
logging.debug(DVs)
if args.maxdif != None: maxDif = int(args.maxdif)
else:
@@ -373,11 +392,12 @@ def match_files(data_list):
miss = 0
logging.info(f"Trying to match: {hdr_file["name"]}")
for dv_file in DVs:
hybrid = True if dv_file["colorProfile"] == "HDR+DV" else False
absDif = abs(hdr_file["frameCount"] - dv_file["frameCount"])
if absDif == 0:
logging.info(f"Perfect match found with: {dv_file["name"]}")
isAutomatic = inquirer.prompt([inquirer.Confirm("auto", message="Want to frame match anyways?", default=False)])["auto"]
if isAutomatic: frames_to_delay = frame_seeker(hdr_file, dv_file)
if isAutomatic: frames_to_delay = frame_seeker(hdr_file, dv_file, hybrid)
else: frames_to_delay = 0
match = {"HDR_FILE": hdr_file, "DV_FILE": dv_file, "framesToDelay": frames_to_delay}
matching_files.append(match)
@@ -386,7 +406,7 @@ def match_files(data_list):
logging.info(f"Match found but with a difference of: {absDif} frames, file matched with: {dv_file["name"]}")
isMatch = inquirer.prompt([inquirer.Confirm("continue", message="Is it a match?", default=False)])["continue"]
if isMatch:
frames_to_delay = frame_seeker(hdr_file, dv_file)
frames_to_delay = frame_seeker(hdr_file, dv_file, hybrid)
match = {"HDR_FILE": hdr_file, "DV_FILE": dv_file, "framesToDelay": frames_to_delay}
matching_files.append(match)
else: logging.info("Trying another ")
@@ -552,10 +572,13 @@ def main():
matched_files = match_files(file_data_list)
for match in matched_files:
try: injectDoVi(match)
except RuntimeError: logging.error("Multiplexing of file FAILED")
except InterruptedError: logging.error("Multiplexing of file FAILED because of Human interuption")
else:
except RuntimeError:
logging.error("Multiplexing of file FAILED")
try: shutil.rmtree(_temp)
except: logging.warning("Could not delete temp folder")
if __name__ == "__main__": main()
except InterruptedError:
logging.error("Multiplexing of file FAILED because of Human interuption")
try: shutil.rmtree(_temp)
except: logging.warning("Could not delete temp folder")
if __name__ == "__main__": main()