File size: 4,086 Bytes
cd7e317
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""Correct Decord's known wheel label, then check dependencies and CPU decoding.

No model loading, downloads, credentials or CUDA execution. See upstream #356:
https://github.com/dmlc/decord/issues/356
"""
from __future__ import annotations

import base64
import csv
import hashlib
import io
import platform
import subprocess
import sys
import tempfile
from importlib.metadata import Distribution, distribution, version
from pathlib import Path

ORIGINAL_WHEEL = (
    b"Wheel-Version: 1.0\nGenerator: bdist_wheel (0.36.2)\n"
    b"Root-Is-Purelib: false\nTag: cp36-cp36m-manylinux2010_x86_64\n\n"
)
CORRECTED_WHEEL = ORIGINAL_WHEEL.replace(b"cp36-cp36m", b"py3-none")
LIBDECORD_SHA256 = "98b260c5812106648ba299279916fbe98439893e346d4efdcf5cde66ba8973da"
WHEEL_PATH = "decord-0.6.0.dist-info/WHEEL"
RECORD_PATH = "decord-0.6.0.dist-info/RECORD"


def record_digest(data: bytes) -> str:
    return "sha256=" + base64.urlsafe_b64encode(hashlib.sha256(data).digest()).decode().rstrip("=")


def normalize_decord_metadata(dist: Distribution) -> None:
    """Edit only the exact published 0.6.0 metadata, preserving every binary."""
    if dist.version != "0.6.0":
        raise RuntimeError("Decord metadata correction requires exactly version 0.6.0")
    wheel = Path(dist.locate_file(WHEEL_PATH))
    record = Path(dist.locate_file(RECORD_PATH))
    original = wheel.read_bytes()
    if original not in (ORIGINAL_WHEEL, CORRECTED_WHEEL):
        raise RuntimeError("Unexpected Decord WHEEL metadata; refusing to retag it")
    native = Path(dist.locate_file("decord/libdecord.so"))
    if hashlib.sha256(native.read_bytes()).hexdigest() != LIBDECORD_SHA256:
        raise RuntimeError("Unexpected Decord native library; refusing to retag it")
    rows = list(csv.reader(io.StringIO(record.read_text())))
    targets = [row for row in rows if row and row[0] == WHEEL_PATH]
    if len(targets) != 1 or targets[0][1:] != [record_digest(original), str(len(original))]:
        raise RuntimeError("Decord WHEEL/RECORD mismatch; refusing to modify metadata")
    if original == CORRECTED_WHEEL:
        return
    targets[0][1:] = [record_digest(CORRECTED_WHEEL), str(len(CORRECTED_WHEEL))]
    updated = io.StringIO(newline="")
    csv.writer(updated, lineterminator="\n").writerows(rows)
    wheel.write_bytes(CORRECTED_WHEEL)
    record.write_text(updated.getvalue())
    print("Corrected Decord 0.6.0 wheel tag to its published Python 3 tag; binaries unchanged.")


def verify_cpu_decode() -> None:
    import decord
    import numpy as np

    with tempfile.TemporaryDirectory(prefix="omnai-decode-") as directory:
        clip = Path(directory) / "synthetic.mp4"
        subprocess.run([
            "ffmpeg", "-nostdin", "-v", "error", "-f", "lavfi", "-i",
            "testsrc2=size=64x64:rate=4:duration=1", "-an", "-c:v", "mpeg4",
            "-pix_fmt", "yuv420p", "-threads", "1", str(clip),
        ], check=True, timeout=30)
        reader = decord.VideoReader(str(clip), ctx=decord.cpu(0), num_threads=1)
        frames = reader.get_batch([0, 3]).asnumpy()
        if len(reader) != 4 or frames.shape != (2, 64, 64, 3) or frames.dtype != np.uint8:
            raise RuntimeError("Decord failed the synthetic CPU video-decode check")
        if not np.any(frames[0] != frames[1]):
            raise RuntimeError("Decord returned identical frames for the changing test pattern")
    print("Decord CPU decode passed: four source frames, two RGB samples. No GPU/model used.")


def main() -> None:
    if platform.system() != "Linux" or platform.machine() != "x86_64" or sys.version_info[:2] != (3, 10):
        raise RuntimeError("This build check targets the pinned Python 3.10 Linux x86_64 image")
    normalize_decord_metadata(distribution("decord"))
    subprocess.run([sys.executable, "-m", "pip", "check"], check=True, timeout=120)
    if version("torch") != "2.8.0+cu128" or version("torchaudio") != "2.8.0+cu128":
        raise RuntimeError("The installed Torch/Torchaudio wheels do not match the CUDA pins")
    verify_cpu_decode()


if __name__ == "__main__":
    main()