Commit 65134bdd authored by Jan Kiene's avatar Jan Kiene
Browse files

make MD handling more explicitly and also work for combined modes

parent e03f1e6c
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -157,7 +157,8 @@ class IvasModeCollector(IvasBaseClass.IvasBaseClass):
        self.format_select_list = []
        self.bw_select_list = []
        self.global_item_list = []
        self.global_metadata_file_list = []
        self.global_ism_metadata = list()
        self.global_masa_metadata = None
        self.global_bitstream_processing = None
        self.flat_mode_list = None
        self.filter = None
@@ -482,9 +483,6 @@ class IvasModeCollector(IvasBaseClass.IvasBaseClass):
    def set_global_item_list(self, global_item_list):
        self.global_item_list = [os.path.abspath(f) for f in global_item_list]

    def set_global_metadata_file_list(self, metadata_file_list):
        self.global_metadata_file_list = metadata_file_list

    def add_format_output_config(self, ivas_format, oc_dict):
        """

+35 −84
Original line number Diff line number Diff line
@@ -430,12 +430,12 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
            return
        self.lock.release()

        metadata_file_names = []
        metadata_file_names = list()

        # TODO: is this still needed - what case does this cover?
        if isinstance(in_file_name, list):
            metadata_file_names = in_file_name[1:]
            in_file_name = in_file_name[0]
        elif self.global_metadata_file_list:
            metadata_file_names = deepcopy(self.global_metadata_file_list)
        self.logger.info("Encoding Mode {} input file {}".format(mode, in_file_name))
        config["lock"].release()
        self.lock.acquire()
@@ -625,89 +625,40 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
            # build the encoder commandline
            enc_options = enc_dec_cmd["encmodeoption"]

            # metadata handling
            if enc_dec_cmd["nummetadata"] > 0:

                for cur_metadata_idx in range(enc_dec_cmd["nummetadata"]):
                    fallback = False
                    if len(metadata_file_names) == 1:
                        # try for a filename with format patterns
                        metadata_file_name = metadata_file_names[0]
                        if metadata_file_name != "NULL":
                            metadata_file_name = str.format(
                                metadata_file_name,
                                item=item_base_name,
                                mdi=cur_metadata_idx,
                            )
                    elif len(metadata_file_names) >= (cur_metadata_idx + 1):
                        metadata_file_name = str.format(
                            metadata_file_names[cur_metadata_idx],
                            item=item_base_name,
                            mdi=cur_metadata_idx,
                        )
                    else:
                        fallback = True
            # metadata is either explicitly taken from the respective command line args or,
            # if not given, the default pattern form the config is used to get filenames in
            # the same dir as the input file. NULL for ISM MD has to be explicitly given, 
            # otherwise this may hapen without the user being aware and lead to unexpected results.
            # If the default filenames from the configs do not point to existing files, the 
            # codec will complain later
            nummetadata = enc_dec_cmd["nummetadata"]
            if nummetadata > 0:
                md_files = list()

                    if not fallback and not os.path.exists(metadata_file_name):
                        # maybe we need to attach the indir
                        mdf_for_log = metadata_file_name
                        metadata_file_name = os.path.join(in_dir, metadata_file_name)
                        if not os.path.exists(metadata_file_name):
                            self.logger.warning(
                                "Given metadata file {} for item {} does not exists, trying default pattern!".format(
                                    mdf_for_log, enc_file_name
                                )
                            )
                            fallback = True
                is_combined_format = "OMASA" in in_format or "OSBA" in in_format

                    if fallback:
                if "ISM" in in_format:
                    md_files.extend(self.global_ism_metadata)

                        if len(enc_dec_cmd["metadatafilenames"]) == 1:
                            # try for a filename with format patterns
                            metadata_file_name = enc_dec_cmd["metadatafilenames"][0]
                            if metadata_file_name != "NULL":
                                metadata_file_name = str.format(
                                    metadata_file_name,
                                    item=item_base_name,
                                    mdi=cur_metadata_idx + 1,
                                )
                        elif len(enc_dec_cmd["metadatafilenames"]) >= (
                            cur_metadata_idx + 1
                        ):
                            metadata_file_name = enc_dec_cmd["metadatafilenames"][
                                cur_metadata_idx
                            ]
                            if metadata_file_name != "NULL":
                                metadata_file_name = str.format(
                                    metadata_file_name,
                                    item=item_base_name,
                                    mdi=cur_metadata_idx,
                                )
                        else:
                            self.logger.warning(
                                "Falling back to NULL for metadata file {} of item {}!".format(
                                    cur_metadata_idx, enc_file_name
                                )
                            )
                    # if no md files explicitly given, try default pattern from config
                    if len(md_files) == 0:
                        num_ism_metadata = nummetadata - int(is_combined_format)
                        default = os.path.join(in_dir, enc_dec_cmd["metadatafilenames"][0])
                        for i in range(num_ism_metadata):
                            md_f = default.format(item=item_base_name, mdi=i + 1) 
                            md_files.append(md_f)

                            metadata_file_name = "NULL"
                if "MASA" in in_format:
                    masa_md = self.global_masa_metadata

                        if metadata_file_name != "NULL" and not os.path.exists(
                            metadata_file_name
                        ):
                            # maybe we need to attach the indir
                            metadata_file_name = os.path.join(
                                in_dir, metadata_file_name
                            )
                            if not os.path.exists(metadata_file_name):
                                self.logger.warning(
                                    "Falling back to NULL for metadata file {} of item {}!".format(
                                        cur_metadata_idx, enc_file_name
                                    )
                                )
                                metadata_file_name = "NULL"
                    # if not explicitly given, try default pattern from config
                    if masa_md is None:
                        default = os.path.join(in_dir, enc_dec_cmd["metadatafilenames"][0 + int(is_combined_format)])
                        masa_md = default.format(item=item_base_name)

                    md_files.append(masa_md)

                    enc_options.append(metadata_file_name)
                enc_options.extend(md_files)

            enc_options.extend(enc_dec_cmd["encoptions"])
            enc_options.extend(self.encoder_cmdline_options)
+17 −6
Original line number Diff line number Diff line
@@ -200,12 +200,18 @@ class IvasScriptArgParser(argparse.ArgumentParser):
                action=ParseItems,
            )
            self.add_argument(
                "--metadata_files",
                metavar="MDFILE",
                help="List of common metadata files",
                "--ism_metadata_files",
                metavar="ISM_MDFILE",
                help="List of ISM metadata files",
                nargs="*",
                default=[],
            )
            self.add_argument(
                "--masa_metadata_file",
                metavar="MASA_MDFILE",
                help="MASA metadata file",
                default=None,
            )
            self.add_argument(
                "-S",
                "--srin",
@@ -664,9 +670,14 @@ def runner_setup(runner, args):
        runner.set_format_select_list(args["formats"])
    if args["item_list"]:
        runner.set_global_item_list(args["item_list"])
    if args["metadata_files"]:
        metadata_files = [os.path.abspath(f) for f in args["metadata_files"]]
        runner.set_global_metadata_file_list(metadata_files)

    metadata_files = list()
    if args["ism_metadata_files"] != []:
        metadata_files.extend([os.path.abspath(f) for f in args["ism_metadata_files"]])
        runner.global_ism_metadata = metadata_files
    if args["masa_metadata_file"] is not None:
        runner.global_masa_metadata = os.path.abspath(args["masa_metadata_file"])

    if args["decoder_only"]:
        runner.run_encoder = False
    if args["info"]: