Commit 8b3fbac3 authored by Jan Kiene's avatar Jan Kiene
Browse files

add timeout for runIvasCodec.py

parent 85bdfc6f
Loading
Loading
Loading
Loading
+32 −14
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ import pyaudio3dtools.audiofile as af
import pyaudio3dtools.audioarray as ar
BW_TO_SR = {"nb": 8, "wb": 16, "swb": 32, "fb": 48}

RET_CODE_TIMEOUT_EXP = 9999


class Error(Exception):
    pass
@@ -85,6 +87,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
        console_logger_level="",
        logger_name="IvasBaseClass",
        log_level=logging.DEBUG,
        timeout=None,
    ):

        super().__init__(
@@ -97,6 +100,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
            logger_name=logger_name,
            log_level=log_level,
        )
        self.timeout = timeout
        self.lock = threading.Lock()
        self.dec_queue = None
        self.enc_queue = None
@@ -317,13 +321,22 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
                    + [enc_file_name, dec_file_name]
                )

            cur_dec_result = subprocess.run(dec_cmd, capture_output=True, text=True, env=self.run_env)
            dec_log.write(" ".join(dec_cmd))
            try:
                cur_dec_result = subprocess.run(dec_cmd, capture_output=True, text=True, env=self.run_env, timeout=self.timeout)
                returncode = cur_dec_result.returncode
                dec_log.write(cur_dec_result.stderr)
                dec_log.write(cur_dec_result.stdout)
            if cur_dec_result.returncode != 0:
            except subprocess.TimeoutExpired:
                returncode = RET_CODE_TIMEOUT_EXP

            if returncode != 0:
                fail_string = "Decoding {} to {} failed!"
                if returncode == RET_CODE_TIMEOUT_EXP:
                    fail_string = fail_string[:-1] + f" due to timeout after {self.timeout} seconds!"

                self.logger.error(
                    "Decoding {} to {} failed!".format(enc_file_name, dec_file_name)
                    fail_string.format(enc_file_name, dec_file_name)
                )
                self.lock.acquire()
                if self.stats:
@@ -331,9 +344,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
                    self.show_progress()
                self.results.append(
                    [
                        "Decoding failed to {} for {}".format(
                            output_config, enc_file_name
                        ),
                        fail_string.format(output_config, enc_file_name),
                        config["ivas_format"],
                        enc_dec_cmd["table_name"],
                        dec_log_name,
@@ -706,10 +717,13 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):

            enc_log = open(enc_log_name, "w")
            enc_log.write(" ".join(enc_cmd))
            enc_result = subprocess.run(enc_cmd, capture_output=True, text=True, env=self.run_env)
            try:
                enc_result = subprocess.run(enc_cmd, capture_output=True, text=True, env=self.run_env, timeout=self.timeout)
                error = enc_result.returncode
                enc_log.write(enc_result.stderr)
                enc_log.write(enc_result.stdout)
            except subprocess.TimeoutExpired:
                error = RET_CODE_TIMEOUT_EXP

            if error == 0 and "bitstream_processing" in enc_dec_cmd:
                bs_in_file = enc_file_name
@@ -797,13 +811,17 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
        self.lock.release()

        if error != 0:
            fail_string = "Encoding failed for {}"
            if error == RET_CODE_TIMEOUT_EXP:
                fail_string = fail_string + f" due to timeout after {self.timeout} seconds"

            self.lock.acquire()
            if self.stats:
                self.stats["num_enc_errors"] += 1
                self.show_progress()
            self.results.append(
                [
                    "Encoding failed for {}".format(enc_file_name),
                    fail_string.format(enc_file_name),
                    mode,
                    enc_dec_cmd["table_name"],
                    enc_log_name,
@@ -811,7 +829,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector):
            )
            self.failed_modes["enc"].append(mode)
            self.lock.release()
            self.logger.error("Encoding failed for {}".format(enc_file_name))
            self.logger.error(fail_string.format(enc_file_name))
        else:
            self.logger.info("Encoding successful for {}".format(enc_file_name))

+14 −0
Original line number Diff line number Diff line
@@ -141,6 +141,11 @@ class IvasScriptArgParser(argparse.ArgumentParser):
            default=multiprocessing.cpu_count(),
            type=int,
        )
        self.add_argument(
          "--timeout",
          help="Timeout duration for an individual encoder/decoder run",
          default=None,
        )
        if not minimal:
            self.add_argument(
                "-C",
@@ -339,6 +344,15 @@ class IvasScriptArgParser(argparse.ArgumentParser):
                args["error"] = 1
                args["exit"] = 1

        if args["timeout"] is not None:
            try:
                timeout = float(args["timeout"])
                args["timeout"] = timeout
            except ValueError:
                print(f"Given timeout value {args['timeout']} is not a valid number.")
                args["error"] = 1
                args["exit"] = 1

        if not self.minimal:
            format_dict = self.get_format_dict(args["format_file"])
            if format_dict == -1:
+1 −0
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript):
            sample_rate_dec_out=self.args["srout"],
            enable_logging=True,
            logger_name="{}.runner".format(self.logger.name),
            timeout=self.args["timeout"],
        )

        IvasScriptsCommon.runner_setup(runner, self.args)