Commit 83e6f94a authored by Anika Treffehn's avatar Anika Treffehn
Browse files

added masa and omasa as input format

parent ed137206
Loading
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ from itertools import product
from multiprocessing import Pool
from time import sleep

from ivas_processing_scripts.audiotools.metadata import check_ISM_metadata
from ivas_processing_scripts.audiotools.metadata import check_ISM_metadata, check_MASA_metadata
from ivas_processing_scripts.constants import (
    LOGGER_DATEFMT,
    LOGGER_FORMAT,
@@ -112,24 +112,44 @@ def main(args):
                    cfg.items_list, cfg.preprocessing_2["concatenation_order"]
                )

        metadata = [[]] * len(cfg.items_list)
        # check for ISM metadata
        if cfg.input["fmt"].startswith("ISM"):
            metadata = check_ISM_metadata(
            metadata_ISM = check_ISM_metadata(
                cfg.metadata_path,
                num_objects=int(cfg.input["fmt"][3]),
                num_items=len(cfg.items_list),
                item_names=cfg.items_list,
            )
            # print info about found and used metadata files
            for i in range(len(metadata)):
            for i in range(len(metadata_ISM)):
                metadata_str = []
                for o in range(len(metadata[i])):
                    metadata_str.append(str(metadata[i][o]))
                for o in range(len(metadata_ISM[i])):
                    metadata_str.append(str(metadata_ISM[i][o]))
                logger.debug(
                    f"  ISM metadata files item {cfg.items_list[i]}: {', '.join(metadata_str)}"
                )
            metadata = metadata_ISM

        else:
        # check for MASA metadata
        if "MASA" in cfg.input["fmt"]:
            metadata_MASA = check_MASA_metadata(
                cfg.metadata_path,
                num_items=len(cfg.items_list),
                item_names=cfg.items_list,
            )
            # print info about found and used metadata files
            for i in range(len(metadata_MASA)):
                metadata_str = []
                for o in range(len(metadata_MASA[i])):
                    metadata_str.append(str(metadata_MASA[i][o]))
                logger.debug(
                    f"  MASA metadata file item {cfg.items_list[i]}: {', '.join(metadata_str)}"
                )
            for i, meta in enumerate(metadata):
                meta.extend(metadata_MASA[i])

        if not cfg.input["fmt"].startswith("ISM") and not "MASA" in cfg.input["fmt"]:
            metadata = [None] * len(cfg.items_list)

        cfg.metadata_path = metadata
+1 −1
Original line number Diff line number Diff line
@@ -445,7 +445,7 @@ class OMASAAudio(Audio):
        # check if number of metadata files matches format
        if self.num_ism_channels != len(self.metadata_files)-1:
            raise ValueError(
                f"Mismatch between number of ism channels [{self.num_ism_channels}], and metadata [{len(self.metadata_files)}]"
                f"Mismatch between number of ism channels [{self.num_ism_channels}], and metadata [{len(self.metadata_files)}]. Note: metadata should also include masa metadata file"
            )

        self.object_pos = []
+3 −1
Original line number Diff line number Diff line
@@ -123,11 +123,13 @@ def convert_file(
        if isinstance(input, audio.OMASAAudio):
            # use existing metadata files
            output.metadata_files = copy(input.metadata_files)
        else:
        elif isinstance(input, audio.OSBAAudio):
            # fabricate metadata file name
            masa_meta_file_name = Path(out_file).parent / (Path(out_file).name + ".met")
            output.metadata_files = copy(input.metadata_files)
            output.metadata_files.append(masa_meta_file_name)
        else:
            raise NotImplementedError("Can only convert to OMASA from OSBA")
        output.object_pos = copy(input.object_pos)

    elif isinstance(output, audio.OSBAAudio):
+80 −4
Original line number Diff line number Diff line
@@ -467,7 +467,7 @@ def check_ISM_metadata(
    list_meta = []
    if in_meta is None:
        for item in item_names:
            list_item = metadata_search(Path(item).parent, [item], num_objects)
            list_item = metadata_search_ISM(Path(item).parent, [item], num_objects)
            list_meta.append(list_item)
    else:
        if len(in_meta) == 1 and num_items != 1:
@@ -479,7 +479,7 @@ def check_ISM_metadata(
                    'Only one metadata path is given but not with key "all_items".'
                )

            list_meta = metadata_search(path_meta, item_names, num_objects)
            list_meta = metadata_search_ISM(path_meta, item_names, num_objects)

        elif num_items == len(in_meta):
            # search for every item individually
@@ -495,7 +495,7 @@ def check_ISM_metadata(

                if not isinstance(current_item, list):
                    # automatic search in folder
                    list_item = metadata_search(
                    list_item = metadata_search_ISM(
                        current_item, [item_names[item_idx]], num_objects
                    )

@@ -514,7 +514,55 @@ def check_ISM_metadata(
    return list_meta


def metadata_search(
def check_MASA_metadata(
    in_meta: dict,
    num_items: int,
    item_names: Optional[list] = None,
) -> list:
    """Find MASA metadata"""

    list_meta = []
    if in_meta is None:
        for item in item_names:
            list_item = metadata_search_MASA(Path(item).parent, [item])
            list_meta.append(list_item)
    else:
        if len(in_meta) == 1 and num_items != 1:
            # automatic search for metadata files in folder for all items and objects
            try:
                path_meta = in_meta["all_items"]
            except KeyError:
                raise ValueError(
                    'Only one metadata path is given but not with key "all_items".'
                )

            list_meta = metadata_search_MASA(path_meta, item_names)

        elif num_items == len(in_meta):
            # search for every item individually
            for item_idx in range(num_items):
                # try to use item_names as keys
                try:
                    if item_names:
                        current_item = in_meta[item_names[item_idx].name]
                    else:
                        raise KeyError
                except KeyError:
                    current_item = in_meta[f"item{item_idx + 1}"]

                if not isinstance(current_item, list):
                    # automatic search in folder
                    list_item = metadata_search_MASA(current_item, [item_names[item_idx]])

                list_meta.append(list_item)
        else:
            raise ValueError("Number of metadata inputs does not match number of items")

    # return list of lists of metadata files
    return list_meta


def metadata_search_ISM(
    in_meta_path: Union[str, Path],
    item_names: list[Union[str, Path]],
    num_objects: int,
@@ -544,6 +592,34 @@ def metadata_search(
    return list_meta


def metadata_search_MASA(
    in_meta_path: Union[str, Path],
    item_names: list[Union[str, Path]],
) -> list[list[Union[Path, str]]]:
    """Search for MASA metadata with structure item_name.met in in_meta folder"""

    if not item_names:
        raise ValueError("Item names not provided, can't search for metadata")

    list_meta = []
    for item in item_names:
        list_item = []
        file_name_meta = in_meta_path / Path(item.stem).with_suffix(
            f"{item.suffix}.met"
        )
        # check if file exists and add to list
        if file_name_meta.is_file():
            list_item.append(Path(file_name_meta).resolve())
        else:
            raise ValueError(f"Metadata file {file_name_meta} not found.")
        if len(item_names) == 1:
            list_meta = list_item
        else:
            list_meta.append(list_item)

    return list_meta


def add_remove_preamble(
    metadata,
    preamble,
+10 −1
Original line number Diff line number Diff line
@@ -305,6 +305,15 @@ class IVAS(Processing):
        cmd.extend(["-q"])

        if self.out_fmt.name.startswith("ISM") or self.out_fmt.name.startswith("MASA"):
            # the SBA part of OSBA is always rendered to HOA3 for EXT by IVAS
            if isinstance(self.in_fmt, audio.OSBAAudio) and self.in_fmt.name[:]:
                if self.out_fmt.num_channels != (16 + self.in_fmt.num_ism_channels):
                    raise ValueError("When using EXT output for IVAS for OSBA make sure the specified decoder format is ISMxSBA3")
                else:
                    output_format = "EXT"
            else:
                if self.in_fmt.name != self.out_fmt.name:
                    raise ValueError("ISM and MASA output format for IVAS only possible if input and output format match")
                output_format = "EXT"
        elif self.in_fmt.name == "MONO":
            if self.out_fmt.name == "MONO":