diff --git a/vhsdecode/field.py b/vhsdecode/field.py index 9d233e6eb..07ba1f44a 100644 --- a/vhsdecode/field.py +++ b/vhsdecode/field.py @@ -383,9 +383,19 @@ def hz_to_output(self, input): if self.rf.options.export_raw_tbc: return input.astype(np.single) else: + ire0 = self.rf.DecoderParams["ire0"] + if self.rf.options.ire0_adjust and input.size == self.outlinecount * self.outlinelen: + blank_levels = np.empty(self.outlinecount) + for i in range(0, self.outlinecount): + blank_levels[i] = np.median( + input[i * self.outlinelen + self.ire0_backporch[0] : i * self.outlinelen + self.ire0_backporch[1]] + ) + blank_levels = np.sort(blank_levels) + ire0 = np.mean(blank_levels[int(self.outlinecount / 3) : int(self.outlinecount * 2 / 3)]) + ldd.logger.debug("calculated ire0: %.02f", ire0) return hz_to_output_array( input, - self.rf.DecoderParams["ire0"] + ire0 + self.rf.DecoderParams["track_ire0_offset"][ self.rf.track_phase ^ (self.field_number % 2) ], @@ -1079,6 +1089,7 @@ def fix_badlines(self, linelocs_in, linelocs_backup_in=None): class FieldPALShared(FieldShared, ldd.FieldPAL): def __init__(self, *args, **kwargs): super(FieldPALShared, self).__init__(*args, **kwargs) + self.ire0_backporch = (96, 160) def refine_linelocs_pilot(self, linelocs=None): """Override this as most regular band tape formats does not use have a pilot burst. @@ -1101,6 +1112,7 @@ class FieldNTSCShared(FieldShared, ldd.FieldNTSC): def __init__(self, *args, **kwargs): super(FieldNTSCShared, self).__init__(*args, **kwargs) self.fieldPhaseID = 0 + self.ire0_backporch = (74, 124) def refine_linelocs_burst(self, linelocs=None): """Override this as it's LD specific diff --git a/vhsdecode/main.py b/vhsdecode/main.py index 48dca3ed1..dd36c3ca6 100644 --- a/vhsdecode/main.py +++ b/vhsdecode/main.py @@ -108,6 +108,13 @@ def main(args=None, use_gui=False): default=0.1, help="Multiply top/bottom IRE in json by 1 +/- this value (used to avoid clipping on RGB conversion in chroma decoder).", ) + luma_group.add_argument( + "--ire0_adjust", + dest="ire0_adjust", + action="store_true", + default=False, + help="Automatic adjust of ire0 based blanking level", + ) luma_group.add_argument( "--high_boost", metavar="High frequency boost multiplier", @@ -391,6 +398,7 @@ def main(args=None, use_gui=False): rf_options["skip_hsync_refine"] = args.skip_hsync_refine rf_options["export_raw_tbc"] = args.export_raw_tbc rf_options["tape_speed"] = args.tape_speed + rf_options["ire0_adjust"] = args.ire0_adjust extra_options = get_extra_options(args, not use_gui) extra_options["params_file"] = args.params_file diff --git a/vhsdecode/process.py b/vhsdecode/process.py index 7ab4374fd..32b5b68ca 100644 --- a/vhsdecode/process.py +++ b/vhsdecode/process.py @@ -569,6 +569,7 @@ def __init__( ) export_raw_tbc = rf_options.get("export_raw_tbc", False) + ire0_adjust = rf_options.get("ire0_adjust", False) is_color_under = vhs_formats.is_color_under(tape_format) write_chroma = ( is_color_under @@ -602,6 +603,7 @@ def __init__( "export_raw_tbc", "fm_audio_notch", "chroma_offset", + "ire0_adjust", ], )( self.iretohz(100) * 2, @@ -631,6 +633,7 @@ def __init__( export_raw_tbc, rf_options.get("fm_audio_notch", 0), int(self.DecoderParams.get("chroma_offset", 5) * (self.freq / 40.0)), + ire0_adjust, ) # As agc can alter these sysParams values, store a copy to then