Commit 989b0cfd authored by Vladimir Malenovsky's avatar Vladimir Malenovsky
Browse files

read only wav headers when comaparing audio files - saves time

parent 967cfe29
Loading
Loading
Loading
Loading
Loading
+29 −16
Original line number Diff line number Diff line
@@ -650,7 +650,7 @@ class MLDConformance:
                self.appendFailed(context=f"[{tag}:{dutPytestTag}] {msg}")
                return (None, None, (msg, ""), None)

            validate_err = self.validateAudioPair(testDesc.refOutput, testDesc.dutOutput)
            validate_err = self.validateAudioPairHeader(testDesc.refOutput, testDesc.dutOutput)
            if validate_err:
                self.appendFailed(context=f"[{tag}:{dutPytestTag}] {validate_err}")
                return (None, None, (validate_err, ""), None)
@@ -710,7 +710,7 @@ class MLDConformance:
                self.appendFailed(context=f"[{tag}:{encPytestTag}] {msg}")
                return (None, None, (msg, ""), dutDecCmd)

            validate_err = self.validateAudioPair(refDecOutputFile, dutDecOutputFile)
            validate_err = self.validateAudioPairHeader(refDecOutputFile, dutDecOutputFile)
            if validate_err:
                self.appendFailed(context=f"[{tag}:{encPytestTag}] {validate_err}")
                return (None, None, (validate_err, ""), dutDecCmd)
@@ -760,7 +760,7 @@ class MLDConformance:
                self.appendFailed(context=f"[{tag}:{pytestTag}] {msg}")
                return (None, None, (msg, ""), dutDecCmd)

            validate_err = self.validateAudioPair(refDecOutputFile, dutDecOutputFile)
            validate_err = self.validateAudioPairHeader(refDecOutputFile, dutDecOutputFile)
            if validate_err:
                self.appendFailed(context=f"[{tag}:{pytestTag}] {validate_err}")
                return (None, None, (validate_err, ""), dutDecCmd)
@@ -1213,28 +1213,41 @@ class MLDConformance:
        )
        return (maxDiff, rmsdB, beSamplesPercent)

    def validateAudioPair(self, refFile: str, dutFile: str):
    def validateAudioPairHeader(self, refFile: str, dutFile: str):
        """Fast header-only validation: checks channels, sample rate, and frame count without loading full audio."""
        try:
            refSamples, _ = readfile(refFile, outdtype="float")
            dutSamples, _ = readfile(dutFile, outdtype="float")
            refRate, refData = wav.read(refFile)
            dutRate, dutData = wav.read(dutFile)
        except Exception as exc:
            return f"Failed reading audio files: ref={refFile}, dut={dutFile}, error={exc}"
            return f"Failed reading audio headers: ref={refFile}, dut={dutFile}, error={exc}"

        if refSamples.ndim != dutSamples.ndim:
        # Infer dimensionality from shape
        refNdim = 2 if len(refData.shape) == 2 else 1
        dutNdim = 2 if len(dutData.shape) == 2 else 1
        if refNdim != dutNdim:
            return (
                f"Audio dimensionality mismatch: ref={refFile} (ndim={refSamples.ndim}), "
                f"dut={dutFile} (ndim={dutSamples.ndim})"
                f"Audio dimensionality mismatch: ref={refFile} (ndim={refNdim}), "
                f"dut={dutFile} (ndim={dutNdim})"
            )
        if refSamples.shape[1] != dutSamples.shape[1]:

        # Check channels
        refChannels = refData.shape[1] if refNdim == 2 else 1
        dutChannels = dutData.shape[1] if dutNdim == 2 else 1
        if refChannels != dutChannels:
            return (
                f"Audio channel mismatch: ref={refFile} (channels={refSamples.shape[1]}), "
                f"dut={dutFile} (channels={dutSamples.shape[1]})"
                f"Audio channel mismatch: ref={refFile} (channels={refChannels}), "
                f"dut={dutFile} (channels={dutChannels})"
            )
        if refSamples.shape[0] != dutSamples.shape[0]:

        # Check sample count
        refSamples = refData.shape[0]
        dutSamples = dutData.shape[0]
        if refSamples != dutSamples:
            return (
                f"Audio length mismatch: ref={refFile} (samples={refSamples.shape[0]}), "
                f"dut={dutFile} (samples={dutSamples.shape[0]})"
                f"Audio length mismatch: ref={refFile} (samples={refSamples}), "
                f"dut={dutFile} (samples={dutSamples})"
            )

        return None

    def mld(self, tag, pytestTag, refFile, dutFile):